From 28230334cd51afd5ce76947e25ed56f7c5f7af38 Mon Sep 17 00:00:00 2001 From: cmj <625783482@qq.com> Date: Mon, 15 Aug 2016 20:17:03 +0800 Subject: [PATCH] see 08/15 log --- README.md | 72 ++- md/about_const.md | 57 ++ md/about_convert.md | 99 ++++ md/about_device.md | 12 +- md/about_encode.md | 34 +- md/about_encrypt.md | 516 ++++++++++++++++-- md/about_image.md | 18 + md/about_keyboard.md | 8 +- md/about_network.md | 2 +- md/about_phone.md | 4 +- md/about_sdcard.md | 177 ++++++ md/update_log.md | 3 +- .../com/blankj/utilcode/utils/ConstUtils.java | 52 +- .../blankj/utilcode/utils/ConvertUtils.java | 16 +- .../blankj/utilcode/utils/DeviceUtils.java | 3 +- .../blankj/utilcode/utils/EncodeUtils.java | 4 +- .../blankj/utilcode/utils/EncryptUtils.java | 439 +++++++++------ .../com/blankj/utilcode/utils/ImageUtils.java | 37 +- .../blankj/utilcode/utils/KeyboardUtils.java | 10 +- .../blankj/utilcode/utils/NetworkUtils.java | 2 +- .../com/blankj/utilcode/utils/PhoneUtils.java | 6 +- .../blankj/utilcode/utils/SDCardUtils.java | 2 +- .../blankj/utilcode/utils/ScreenUtils.java | 2 +- .../com/blankj/utilcode/utils/ShellUtils.java | 2 +- .../utilcode/utils/EncryptUtilsTest.java | 138 ++--- utilcode/utilcode.iml | 20 +- 26 files changed, 1317 insertions(+), 418 deletions(-) create mode 100644 md/about_const.md create mode 100644 md/about_convert.md create mode 100644 md/about_image.md create mode 100644 md/about_sdcard.md diff --git a/README.md b/README.md index af6ef836..8613bc80 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ *** 为方便查找,已进行大致归类,其目录如下所示: > - [App相关][app.md]→[AppUtils.java][app.java] -> - 安装指定路径下的Apk *installApp* +> - 安装App *installApp* > - 卸载指定包名的App *uninstallApp* > - 获取当前App信息 *getAppInfo* > - 获取所有已安装App信息 *getAllAppsInfo* @@ -12,30 +12,63 @@ > - 可用来做App信息分享 *shareAppInfo* > - 判断当前App处于前台还是后台 *isApplicationBackground* +> - [常量相关][const.md]→[ConstUtils.java][const.java] +> - 存储相关常量 +> - 时间相关常量 + +> - [转换相关][vonvert.md]→[ConvertUtils.java][vonvert.java] +> - 每1个byte转为2个hex字符 *bytes2HexString* +> - 每2个hex字符转为1个byte *hexString2Bytes* +> - charArr转byteArr *chars2Bytes* +> - byteArr转charArr *bytes2Chars* + > - [设备相关][device.md]→[DeviceUtils.java][device.java] > - 获取设备MAC地址 *getMacAddress* > - 获取设备厂商,如Xiaomi *getManufacturer* > - 获取设备型号,如MI2SC *getModel* -> - 获取设备SD卡是否可用 *isSDCardEnable* -> - 获取设备SD卡路径 *getSDCardPath* - > - [编码解码相关][encode.md]→[EncodeUtils.java][encode.java] > - URL编码 *urlEncode* > - URL解码 *urlDecode* -> - Base64编码 *base64Encode* +> - Base64编码 *base64Encode* *base64Encode2String* > - Base64解码 *base64Decode* > - Base64URL安全编码 *base64UrlSafeEncode* > - Html编码 *htmlEncode* > - Html解码 *htmlDecode* -> - [加解密相关][encrypt.md]→[EncryptUtils.java][encrypt.java] -> - MD5加密 *getMD5* *encryptMD5* -> - 获取文件的MD5校验码 *getMD5File* -> - SHA加密 *getSHA* *encryptSHA* +> - [加密解密相关][encrypt.md]→[EncryptUtils.java][encrypt.java] +> - MD2加密 *encryptMD2ToString* *encryptMD2* +> - MD5加密 *encryptMD5ToString* *encryptMD5* +> - SHA1加密 *encryptSHA1ToString* *encryptSHA1* +> - SHA224加密 *encryptSHA224ToString* *encryptSHA224* +> - SHA256加密 *encryptSHA256ToString* *encryptSHA256* +> - SHA384加密 *encryptSHA384ToString* *encryptSHA384* +> - SHA512加密 *encryptSHA512ToString* *encryptSHA512* +> - 获取文件的MD5校验码 *encryptMD5File2String* *encryptMD5File* +> - DES加密后转为Base64编码 *encryptDES2Base64* +> - DES加密后转为16进制 *encryptDES2HexString* +> - DES加密 *encryptDES* +> - DES解密Base64编码密文 *decryptBase64DES* +> - DES解密16进制密文 *decryptHexStringDES* +> - DES解密 *decryptDES* +> - 3DES加密后转为Base64编码 *encrypt3DES2Base64* +> - 3DES加密后转为16进制 *encrypt3DES2HexString* +> - 3DES加密 *encrypt3DES* +> - 3DES解密Base64编码密文 *decryptBase64_3DES* +> - 3DES解密16进制密文 *decryptHexString3DES* +> - 3DES解密 *decrypt3DES* +> - AES加密后转为Base64编码 *encryptAES2Base64* +> - AES加密后转为16进制 *encryptAES2HexString* +> - AES加密 *encryptAES* +> - AES解密Base64编码密文 *decryptBase64AES* +> - AES解密16进制密文 *decryptHexStringAES* +> - AES解密 *decryptAES* > - [文件相关][file.md]→[FileUtils.java][file.java] -> - 这几天完善ing +> - 完善ing + +> - [图片相关][image.md]→[ImageUtils.java][image.java] +> - 完善ing > - [键盘相关][keyboard.md]→[KeyboardUtils.java][keyboard.java] > - 避免输入法面板遮挡 @@ -56,7 +89,7 @@ > - [手机相关][phone.md]→[PhoneUtils.java][phone.java] > - 判断设备是否是手机 *isPhone* -> - 获取手机的IMIE *getDeviceIMEI* +> - 获取手机的IMIE *getPhoneIMEI* > - 获取手机状态信息 *getPhoneStatus* > - 跳至填充好phoneNumber的拨号界面 *dial* > - 拨打phoneNumber *call* @@ -70,7 +103,7 @@ > - [屏幕相关][screen.md]→[ScreenUtils.java][screen.java] > - 获取手机分辨率 *getDeviceWidth*、*getDeviceHeight* -> - 设置透明状态栏(api >= 19方可使用) *setTransparentStatusBar* +> - 设置透明状态栏(api大于19方可使用) *setTransparentStatusBar* > - 隐藏状态栏(注释萌萌哒) *hideStatusBar* > - 获取状态栏高度 *getStatusBarHeight* > - 判断状态栏是否存在 *isStatusBarExists* @@ -81,6 +114,11 @@ > - 获取屏幕截图 *snapShotWithStatusBar*、*snapShotWithoutStatusBar* > - 判断是否锁屏 *isScreenLock* +> - [SD卡相关][sdcard.md]→[SDCardUtils.java][sdcard.java] +> - 获取设备SD卡是否可用 *isSDCardEnable* +> - 获取设备SD卡路径 *getSDCardPath* +> - 完善ing + > - [Shell相关][shell.md]→[ShellUtils.java][shell.java] > - 判断设备是否root *isRoot* > - 是否是在root下执行命令 *execCmd* @@ -160,12 +198,20 @@ limitations under the License. [app.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_app.md [app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/AppUtils.java +[const.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_const.md +[const.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/ConstUtils.java +[convert.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_convert.md +[convert.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/ConvertUtils.java [device.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_device.md [device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/DeviceUtils.java [encode.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_encode.md [encode.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/EncodeUtils.java [encrypt.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_encrypt.md [encrypt.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/EncryptUtils.java +[file.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_file.md +[file.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/FileUtils.java +[image.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_image.md +[image.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/ImageUtils.java [keyboard.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_keyboard.md [keyboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/KeyboardUtils.java [network.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_network.md @@ -176,6 +222,8 @@ limitations under the License. [regular.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/RegularUtils.java [screen.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_screen.md [screen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/ScreenUtils.java +[sdcard.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_sdcard.md +[sdcard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/SDCUtils.java [shell.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_shell.md [shell.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/utils/ShellUtils.java [size.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/md/about_size.md diff --git a/md/about_const.md b/md/about_const.md new file mode 100644 index 00000000..20ceb1ae --- /dev/null +++ b/md/about_const.md @@ -0,0 +1,57 @@ +# 常量相关 +``` java +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/8/11
+ *     desc  : 常量相关工具类
+ * 
+ */ +public class ConstUtils { + + private ConstUtils() { + throw new UnsupportedOperationException("u can't fuck me..."); + } + + /******************** 存储相关常量 ********************/ + /** + * Byte与Byte的倍数 + */ + public static final long BYTE = 1; + /** + * KB与Byte的倍数 + */ + public static final long KB = 1024; + /** + * MB与Byte的倍数 + */ + public static final long MB = 1048576; + /** + * GB与Byte的倍数 + */ + public static final long GB = 1073741824; + + /******************** 时间相关常量 ********************/ + /** + * 毫秒与毫秒的倍数 + */ + public static final int MSEC = 1; + /** + * 秒与毫秒的倍数 + */ + public static final int SEC = 1000; + /** + * 分与毫秒的倍数 + */ + public static final int MIN = 60000; + /** + * 时与毫秒的倍数 + */ + public static final int HOUR = 3600000; + /** + * 天与毫秒的倍数 + */ + public static final int DAY = 86400000; +} +``` \ No newline at end of file diff --git a/md/about_convert.md b/md/about_convert.md new file mode 100644 index 00000000..7f265fbb --- /dev/null +++ b/md/about_convert.md @@ -0,0 +1,99 @@ +# 转换相关 +``` java +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/8/13
+ *     desc  : 转换相关工具类
+ * 
+ */ +public class ConvertUtils { + + static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + + /** + * 每1个byte转为2个hex字符 + *

例如:

+ * bytes2HexString(new byte[] { 0, (byte) 0xa8 }) returns 00A8 + * + * @param src byte数组 + * @return 16进制大写字符串 + */ + public static String bytes2HexString(byte[] src) { + char[] res = new char[src.length << 1]; + for (int i = 0, j = 0; i < src.length; i++) { + res[j++] = hexDigits[src[i] >>> 4 & 0x0f]; + res[j++] = hexDigits[src[i] & 0x0f]; + } + return new String(res); + } + + /** + * 每2个hex字符转为1个byte + *

例如:

+ * hexString2Bytes("00A8") returns { 0, (byte) 0xA8 } + * + * @param hexString 十六进制字符串 + * @return byte数组 + */ + public static byte[] hexString2Bytes(String hexString) { + int len = hexString.length(); + if (len % 2 != 0) { + throw new IllegalArgumentException("长度不是偶数"); + } + char[] hexBytes = hexString.toUpperCase().toCharArray(); + byte[] res = new byte[len >>> 1]; + for (int i = 0; i < len; i += 2) { + res[i >> 1] = (byte) (hex2Dec(hexBytes[i]) << 4 | hex2Dec(hexBytes[i + 1])); + } + return res; + } + + /** + * 单个hex字符转为10进制 + * + * @param hexChar hex单个字节 + * @return 0..15 + */ + private static int hex2Dec(char hexChar) { + if (hexChar >= '0' && hexChar <= '9') { + return hexChar - '0'; + } else if (hexChar >= 'A' && hexChar <= 'F') { + return hexChar - 'A' + 10; + } else { + throw new IllegalArgumentException(); + } + } + + /** + * charArr转byteArr + * + * @param chars 待转的char数组 + * @return byte数组 + */ + public static byte[] chars2Bytes(char[] chars) { + int len = chars.length; + byte[] bytes = new byte[len]; + for (int i = 0; i < len; i++) { + bytes[i] = (byte) (chars[i]); + } + return bytes; + } + + /** + * byteArr转charArr + * + * @param bytes 待转的byte数组 + * @return char数组 + */ + public static char[] bytes2Chars(byte[] bytes) { + int len = bytes.length; + char[] chars = new char[len]; + for (int i = 0; i < len; i++) { + chars[i] = (char) (bytes[i] & 0xff); + } + return chars; + } +} +``` \ No newline at end of file diff --git a/md/about_device.md b/md/about_device.md index e15bdaf1..f48f32bc 100644 --- a/md/about_device.md +++ b/md/about_device.md @@ -48,13 +48,20 @@ public class DeviceUtils { */ public static String getMacAddress() { String macAddress = null; + LineNumberReader reader = null; try { Process pp = Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address"); InputStreamReader ir = new InputStreamReader(pp.getInputStream()); - LineNumberReader reader = new LineNumberReader(ir); + reader = new LineNumberReader(ir); macAddress = reader.readLine().replace(":", ""); } catch (IOException ex) { ex.printStackTrace(); + } finally { + try { + if (reader != null) reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } } return macAddress == null ? "" : macAddress; } @@ -65,8 +72,7 @@ public class DeviceUtils { * @return 设备厂商 */ public static String getManufacturer() { - String MANUFACTURER = Build.MANUFACTURER; - return MANUFACTURER; + return Build.MANUFACTURER; } /** diff --git a/md/about_encode.md b/md/about_encode.md index edf3f09b..2632a2cb 100644 --- a/md/about_encode.md +++ b/md/about_encode.md @@ -82,7 +82,7 @@ public class EncodeUtils { * @param input 要编码的字符串 * @return Base64编码后的字符串 */ - public static String base64Encode(String input) { + public static byte[] base64Encode(String input) { return base64Encode(input.getBytes()); } @@ -92,8 +92,28 @@ public class EncodeUtils { * @param input 要编码的字节数组 * @return Base64编码后的字符串 */ - public static String base64Encode(byte[] input) { - return Base64.encodeToString(input, Base64.DEFAULT); + public static byte[] base64Encode(byte[] input) { + return Base64.encode(input, Base64.NO_WRAP); + } + + /** + * Base64编码 + * + * @param input 要编码的字节数组 + * @return Base64编码后的字符串 + */ + public static String base64Encode2String(byte[] input) { + return Base64.encodeToString(input, Base64.NO_WRAP); + } + + /** + * Base64解码 + * + * @param input 要解码的字符串 + * @return Base64解码后的字符串 + */ + public static byte[] base64Decode(String input) { + return Base64.decode(input, Base64.NO_WRAP); } /** @@ -102,8 +122,8 @@ public class EncodeUtils { * @param input 要解码的字符串 * @return Base64解码后的字符串 */ - public static String base64Decode(String input) { - return new String(Base64.decode(input, Base64.DEFAULT)); + public static byte[] base64Decode(byte[] input) { + return Base64.decode(input, Base64.NO_WRAP); } /** @@ -113,8 +133,8 @@ public class EncodeUtils { * @param input 要Base64URL安全编码的字符串 * @return Base64URL安全编码后的字符串 */ - public static String base64UrlSafeEncode(String input) { - return Base64.encodeToString(input.getBytes(), Base64.URL_SAFE); + public static byte[] base64UrlSafeEncode(String input) { + return Base64.encode(input.getBytes(), Base64.URL_SAFE); } /** diff --git a/md/about_encrypt.md b/md/about_encrypt.md index 4f20c971..e70e561b 100644 --- a/md/about_encrypt.md +++ b/md/about_encrypt.md @@ -7,13 +7,19 @@ import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +import static com.blankj.utilcode.utils.ConvertUtils.*; /** *
  *     author: Blankj
  *     blog  : http://blankj.com
  *     time  : 2016/8/2
- *     desc  : 加密相关的工具类
+ *     desc  : 加密解密相关的工具类
  * 
*/ public class EncryptUtils { @@ -22,14 +28,45 @@ public class EncryptUtils { throw new UnsupportedOperationException("u can't fuck me..."); } + /*********************** 哈希加密相关 ***********************/ + /** + * MD2加密 + * + * @param data 明文字符串 + * @return 16进制密文 + */ + public static String encryptMD2ToString(String data) { + return encryptMD2ToString(data.getBytes()); + } + + /** + * MD2加密 + * + * @param data 明文字节数组 + * @return 16进制密文 + */ + public static String encryptMD2ToString(byte[] data) { + return bytes2HexString(encryptMD2(data)); + } + + /** + * MD2加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ + public static byte[] encryptMD2(byte[] data) { + return encryptAlgorithm(data, "MD2"); + } + /** * MD5加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getMD5(String data) { - return getMD5(data.getBytes()); + public static String encryptMD5ToString(String data) { + return encryptMD5ToString(data.getBytes()); } /** @@ -37,20 +74,20 @@ public class EncryptUtils { * * @param data 明文字符串 * @param salt 盐 - * @return 密文 + * @return 16进制加盐密文 */ - public static String getMD5(String data, String salt) { - return bytes2Hex(encryptMD5((data + salt).getBytes())); + public static String encryptMD5ToString(String data, String salt) { + return bytes2HexString(encryptMD5((data + salt).getBytes())); } /** * MD5加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getMD5(byte[] data) { - return bytes2Hex(encryptMD5(data)); + public static String encryptMD5ToString(byte[] data) { + return bytes2HexString(encryptMD5(data)); } /** @@ -58,13 +95,13 @@ public class EncryptUtils { * * @param data 明文字节数组 * @param salt 盐字节数组 - * @return 密文 + * @return 16进制加盐密文 */ - public static String getMD5(byte[] data, byte[] salt) { + public static String encryptMD5ToString(byte[] data, byte[] salt) { byte[] dataSalt = new byte[data.length + salt.length]; System.arraycopy(data, 0, dataSalt, 0, data.length); System.arraycopy(salt, 0, dataSalt, data.length, salt.length); - return bytes2Hex(encryptMD5(dataSalt)); + return bytes2HexString(encryptMD5(dataSalt)); } /** @@ -74,8 +111,169 @@ public class EncryptUtils { * @return 密文字节数组 */ public static byte[] encryptMD5(byte[] data) { + return encryptAlgorithm(data, "MD5"); + } + + /** + * SHA1加密 + * + * @param data 明文字符串 + * @return 16进制密文 + */ + public static String encryptSHA1ToString(String data) { + return encryptSHA1ToString(data.getBytes()); + } + + /** + * SHA1加密 + * + * @param data 明文字节数组 + * @return 16进制密文 + */ + public static String encryptSHA1ToString(byte[] data) { + return bytes2HexString(encryptSHA1(data)); + } + + /** + * SHA1加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ + public static byte[] encryptSHA1(byte[] data) { + return encryptAlgorithm(data, "SHA-1"); + } + + /** + * SHA224加密 + * + * @param data 明文字符串 + * @return 16进制密文 + */ + public static String encryptSHA224ToString(String data) { + return encryptSHA224ToString(data.getBytes()); + } + + /** + * SHA224加密 + * + * @param data 明文字节数组 + * @return 16进制密文 + */ + public static String encryptSHA224ToString(byte[] data) { + return bytes2HexString(encryptSHA224(data)); + } + + /** + * SHA224加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ + public static byte[] encryptSHA224(byte[] data) { + return encryptAlgorithm(data, "SHA-224"); + } + + /** + * SHA256加密 + * + * @param data 明文字符串 + * @return 16进制密文 + */ + public static String encryptSHA256ToString(String data) { + return encryptSHA256ToString(data.getBytes()); + } + + /** + * SHA256加密 + * + * @param data 明文字节数组 + * @return 16进制密文 + */ + public static String encryptSHA256ToString(byte[] data) { + return bytes2HexString(encryptSHA256(data)); + } + + /** + * SHA256加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ + public static byte[] encryptSHA256(byte[] data) { + return encryptAlgorithm(data, "SHA-256"); + } + + /** + * SHA384加密 + * + * @param data 明文字符串 + * @return 16进制密文 + */ + public static String encryptSHA384ToString(String data) { + return encryptSHA384ToString(data.getBytes()); + } + + /** + * SHA384加密 + * + * @param data 明文字节数组 + * @return 16进制密文 + */ + public static String encryptSHA384ToString(byte[] data) { + return bytes2HexString(encryptSHA384(data)); + } + + /** + * SHA384加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ + public static byte[] encryptSHA384(byte[] data) { + return encryptAlgorithm(data, "SHA-384"); + } + + /** + * SHA512加密 + * + * @param data 明文字符串 + * @return 16进制密文 + */ + public static String encryptSHA512ToString(String data) { + return encryptSHA512ToString(data.getBytes()); + } + + /** + * SHA512加密 + * + * @param data 明文字节数组 + * @return 16进制密文 + */ + public static String encryptSHA512ToString(byte[] data) { + return bytes2HexString(encryptSHA512(data)); + } + + /** + * SHA512加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ + public static byte[] encryptSHA512(byte[] data) { + return encryptAlgorithm(data, "SHA-512"); + } + + /** + * 对data进行algorithm算法加密 + * + * @param data 明文字节数组 + * @param algorithm 加密算法 + * @return 密文字节数组 + */ + private static byte[] encryptAlgorithm(byte[] data, String algorithm) { try { - MessageDigest md = MessageDigest.getInstance("MD5"); + MessageDigest md = MessageDigest.getInstance(algorithm); md.update(data); return md.digest(); } catch (NoSuchAlgorithmException e) { @@ -84,14 +282,34 @@ public class EncryptUtils { return new byte[0]; } + /** + * 获取文件的MD5校验码 + * + * @param filePath 文件路径 + * @return 文件的16进制密文 + */ + public static String encryptMD5File2String(String filePath) { + return encryptMD5File2String(new File(filePath)); + } + /** * 获取文件的MD5校验码 * * @param filePath 文件路径 * @return 文件的MD5校验码 */ - public static String getMD5File(String filePath) { - return getMD5File(new File(filePath)); + public static byte[] encryptMD5File(String filePath) { + return encryptMD5File(new File(filePath)); + } + + /** + * 获取文件的MD5校验码 + * + * @param file 文件 + * @return 文件的16进制密文 + */ + public static String encryptMD5File2String(File file) { + return encryptMD5File(file) != null ? bytes2HexString(encryptMD5File(file)) : ""; } /** @@ -100,7 +318,7 @@ public class EncryptUtils { * @param file 文件 * @return 文件的MD5校验码 */ - public static String getMD5File(File file) { + public static byte[] encryptMD5File(File file) { FileInputStream in = null; try { in = new FileInputStream(file); @@ -108,7 +326,7 @@ public class EncryptUtils { MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buffer); - return bytes2Hex(md.digest()); + return md.digest(); } catch (NoSuchAlgorithmException | IOException e) { e.printStackTrace(); } finally { @@ -119,60 +337,258 @@ public class EncryptUtils { } } } - return ""; + return null; } + /************************ DES加密相关 ***********************/ /** - * SHA加密 + * DES转变 + *

法算法名称/加密模式/填充方式

+ *

加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB

+ *

填充方式有:NoPadding、ZerosPadding、PKCS5Padding

+ */ + public static String DES_Transformation = "DES/ECB/NoPadding"; + public static String DES_Algorithm = "DES"; + + /** + * @param data 数据 + * @param key 秘钥 + * @param algorithm 采用何种DES算法 + * @param transformation 转变 + * @param isEncrypt 是否加密 + * @return 密文或者明文,适用于DES,3DES,AES + */ + public static byte[] DESTemplet(byte[] data, byte[] key, String algorithm, String transformation, boolean isEncrypt) { + try { + SecretKeySpec keySpec = new SecretKeySpec(key, algorithm); + Cipher cipher = Cipher.getInstance(transformation); + SecureRandom random = new SecureRandom(); + cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec, random); + return cipher.doFinal(data); + } catch (Throwable e) { + e.printStackTrace(); + } + return null; + } + + /** + * DES加密后转为Base64编码 * - * @param data 明文字符串 + * @param data 明文 + * @param key 8字节秘钥 + * @return Base64密文 + */ + public static byte[] encryptDES2Base64(byte[] data, byte[] key) { + return EncodeUtils.base64Encode(encryptDES(data, key)); + } + + /** + * DES加密后转为16进制 + * + * @param data 明文 + * @param key 8字节秘钥 + * @return 16进制密文 + */ + public static String encryptDES2HexString(byte[] data, byte[] key) { + return bytes2HexString(encryptDES(data, key)); + } + + /** + * DES加密 + * + * @param data 明文 + * @param key 8字节秘钥 * @return 密文 */ - public static String getSHA(String data) { - return getSHA(data.getBytes()); + public static byte[] encryptDES(byte[] data, byte[] key) { + return DESTemplet(data, key, DES_Algorithm, DES_Transformation, true); } /** - * SHA加密 + * DES解密Base64编码密文 * - * @param data 明文字节数组 + * @param data Base64编码密文 + * @param key 8字节秘钥 + * @return 明文 + */ + public static byte[] decryptBase64DES(byte[] data, byte[] key) { + return decryptDES(EncodeUtils.base64Decode(data), key); + } + + /** + * DES解密16进制密文 + * + * @param data 16进制密文 + * @param key 8字节秘钥 + * @return 明文 + */ + public static byte[] decryptHexStringDES(String data, byte[] key) { + return decryptDES(hexString2Bytes(data), key); + } + + /** + * DES解密 + * + * @param data 密文 + * @param key 8字节秘钥 + * @return 明文 + */ + public static byte[] decryptDES(byte[] data, byte[] key) { + return DESTemplet(data, key, DES_Algorithm, DES_Transformation, false); + } + + /************************ 3DES加密相关 ***********************/ + /** + * 3DES转变 + *

法算法名称/加密模式/填充方式

+ *

加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB

+ *

填充方式有:NoPadding、ZerosPadding、PKCS5Padding

+ */ + public static String TripleDES_Transformation = "DESede/ECB/NoPadding"; + public static String TripleDES_Algorithm = "DESede"; + + + /** + * 3DES加密后转为Base64编码 + * + * @param data 明文 + * @param key 24字节秘钥 + * @return Base64密文 + */ + public static byte[] encrypt3DES2Base64(byte[] data, byte[] key) { + return EncodeUtils.base64Encode(encrypt3DES(data, key)); + } + + /** + * 3DES加密后转为16进制 + * + * @param data 明文 + * @param key 24字节秘钥 + * @return 16进制密文 + */ + public static String encrypt3DES2HexString(byte[] data, byte[] key) { + return bytes2HexString(encrypt3DES(data, key)); + } + + /** + * 3DES加密 + * + * @param data 明文 + * @param key 24字节密钥 * @return 密文 */ - public static String getSHA(byte[] data) { - return bytes2Hex(encryptSHA(data)); + public static byte[] encrypt3DES(byte[] data, byte[] key) { + return DESTemplet(data, key, TripleDES_Algorithm, TripleDES_Transformation, true); } /** - * SHA加密 + * 3DES解密Base64编码密文 * - * @param data 明文字节数组 - * @return 密文字节数组 + * @param data Base64编码密文 + * @param key 24字节秘钥 + * @return 明文 */ - public static byte[] encryptSHA(byte[] data) { - try { - MessageDigest md = MessageDigest.getInstance("SHA"); - md.update(data); - return md.digest(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return new byte[0]; + public static byte[] decryptBase64_3DES(byte[] data, byte[] key) { + return decrypt3DES(EncodeUtils.base64Decode(data), key); } /** - * 一个byte转为2个hex字符 + * 3DES解密16进制密文 * - * @param src byte数组 - * @return 16进制大写字符串 + * @param data 16进制密文 + * @param key 24字节秘钥 + * @return 明文 */ - public static String bytes2Hex(byte[] src) { - char[] res = new char[src.length << 1]; - final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - for (int i = 0, j = 0; i < src.length; i++) { - res[j++] = hexDigits[src[i] >>> 4 & 0x0f]; - res[j++] = hexDigits[src[i] & 0x0f]; - } - return new String(res); + public static byte[] decryptHexString3DES(String data, byte[] key) { + return decrypt3DES(hexString2Bytes(data), key); + } + + /** + * 3DES解密 + * + * @param data 密文 + * @param key 24字节密钥 + * @return 明文 + */ + public static byte[] decrypt3DES(byte[] data, byte[] key) { + return DESTemplet(data, key, TripleDES_Algorithm, TripleDES_Transformation, false); + } + + /************************ AES加密相关 ***********************/ + /** + * AES转变 + *

法算法名称/加密模式/填充方式

+ *

加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB

+ *

填充方式有:NoPadding、ZerosPadding、PKCS5Padding

+ */ + public static String AES_Transformation = "AES/ECB/NoPadding"; + public static String AES_Algorithm = "AES"; + + + /** + * AES加密后转为Base64编码 + * + * @param data 明文 + * @param key 16、24、32字节秘钥 + * @return Base64密文 + */ + public static byte[] encryptAES2Base64(byte[] data, byte[] key) { + return EncodeUtils.base64Encode(encryptAES(data, key)); + } + + /** + * AES加密后转为16进制 + * + * @param data 明文 + * @param key 16、24、32字节秘钥 + * @return 16进制密文 + */ + public static String encryptAES2HexString(byte[] data, byte[] key) { + return bytes2HexString(encryptAES(data, key)); + } + + /** + * AES加密 + * + * @param data 明文 + * @param key 16、24、32字节秘钥 + * @return 密文 + */ + public static byte[] encryptAES(byte[] data, byte[] key) { + return DESTemplet(data, key, AES_Algorithm, AES_Transformation, true); + } + + /** + * AES解密Base64编码密文 + * + * @param data Base64编码密文 + * @param key 16、24、32字节秘钥 + * @return 明文 + */ + public static byte[] decryptBase64AES(byte[] data, byte[] key) { + return decryptAES(EncodeUtils.base64Decode(data), key); + } + + /** + * AES解密16进制密文 + * + * @param data 16进制密文 + * @param key 16、24、32字节秘钥 + * @return 明文 + */ + public static byte[] decryptHexStringAES(String data, byte[] key) { + return decryptAES(hexString2Bytes(data), key); + } + + /** + * AES解密 + * + * @param data 密文 + * @param key 16、24、32字节秘钥 + * @return 明文 + */ + public static byte[] decryptAES(byte[] data, byte[] key) { + return DESTemplet(data, key, AES_Algorithm, AES_Transformation, false); } } ``` diff --git a/md/about_image.md b/md/about_image.md new file mode 100644 index 00000000..90a886db --- /dev/null +++ b/md/about_image.md @@ -0,0 +1,18 @@ +# 编码解码相关 +``` java +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/8/12
+ *     desc  : 图片相关工具类
+ * 
+ */ +public class ImageUtils { + private ImageUtils() { + throw new UnsupportedOperationException("u can't fuck me..."); + } + + +} +``` diff --git a/md/about_keyboard.md b/md/about_keyboard.md index 4f15fd9b..9cae22cc 100644 --- a/md/about_keyboard.md +++ b/md/about_keyboard.md @@ -21,6 +21,12 @@ public class KeyboardUtils { throw new UnsupportedOperationException("u can't fuck me..."); } + /** + * 避免输入法面板遮挡 + *

在manifest.xml中activity中设置

+ *

android:windowSoftInputMode="stateVisible|adjustResize"

+ */ + /** * 动态隐藏软键盘 * @@ -131,7 +137,7 @@ public class KeyboardUtils { * 切换键盘显示与否状态 * * @param context 上下文 - * @param edit 输入框 + * @param edit 输入框 */ public static void toggleSoftInput(Context context, EditText edit) { edit.setFocusable(true); diff --git a/md/about_network.md b/md/about_network.md index 08c907e7..938d62a5 100644 --- a/md/about_network.md +++ b/md/about_network.md @@ -46,7 +46,7 @@ public class NetworkUtils { } /** - * 获取活动网路信息 + * 获取活动网络信息 * * @param context 上下文 * @return NetworkInfo diff --git a/md/about_phone.md b/md/about_phone.md index e7bb09a0..ca91e530 100644 --- a/md/about_phone.md +++ b/md/about_phone.md @@ -46,14 +46,14 @@ public class PhoneUtils { } /** - * 获取当前设备的IMIE + * 获取手机的IMIE *

需与上面的isPhone一起使用

*

需添加权限 android.permission.READ_PHONE_STATE

* * @param context 上下文 * @return IMIE码 */ - public static String getDeviceIMEI(Context context) { + public static String getPhoneIMEI(Context context) { String deviceId; if (isPhone(context)) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); diff --git a/md/about_sdcard.md b/md/about_sdcard.md new file mode 100644 index 00000000..7e9d6fb1 --- /dev/null +++ b/md/about_sdcard.md @@ -0,0 +1,177 @@ +# SD卡相关 +``` java +import android.os.Environment; +import android.os.StatFs; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/8/11
+ *     desc  : SD卡相关的工具类
+ * 
+ */ +public class SDCardUtils { + + private SDCardUtils() { + throw new UnsupportedOperationException("u can't fuck me..."); + } + + /** + * 获取设备SD卡是否可用 + * + * @return true : 可用
false : 不可用 + */ + public static boolean isSDCardEnable() { + return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); + } + + /** + * 获取设备SD卡路径 + *

一般是/storage/emulated/0/

+ * + * @return SD卡路径 + */ + public static String getSDCardPath() { + return Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator; + } + + /** + * 获取SD卡的剩余容量 单位byte + * + * @return + */ + public static long getSDCardAllSize() { + if (isSDCardEnable()) { + StatFs stat = new StatFs(getSDCardPath()); + // 获取空闲的数据块的数量 + long availableBlocks = (long) stat.getAvailableBlocks() - 4; + // 获取单个数据块的大小(byte) + long freeBlocks = stat.getAvailableBlocks(); + return freeBlocks * availableBlocks; + } + return 0; + } + + /** + * 获取指定路径所在空间的剩余可用容量字节数,单位byte + * + * @param filePath + * @return 容量字节 SDCard可用空间,内部存储可用空间 + */ + public static long getFreeBytes(String filePath) { + // 如果是sd卡的下的路径,则获取sd卡可用容量 + if (filePath.startsWith(getSDCardPath())) { + filePath = getSDCardPath(); + } else {// 如果是内部存储的路径,则获取内存存储的可用容量 + filePath = Environment.getDataDirectory().getAbsolutePath(); + } + StatFs stat = new StatFs(filePath); + long availableBlocks = (long) stat.getAvailableBlocks() - 4; + return stat.getBlockSize() * availableBlocks; + } + + /** + * 获取系统存储路径 + * + * @return + */ + public static String getRootDirectoryPath() { + return Environment.getRootDirectory().getAbsolutePath(); + } + + /** + * Check if the file is exists + * + * @param filePath + * @param fileName + * @return + */ + public static boolean isFileExistsInSDCard(String filePath, String fileName) { + boolean flag = false; + if (isSDCardEnable()) { + File file = new File(filePath, fileName); + if (file.exists()) { + flag = true; + } + } + return flag; + } + + /** + * Write file to SD card + * @param filePath + * @param filename + * @param content + * @return + * @throws Exception + */ + public static boolean saveFileToSDCard(String filePath, String filename, String content) + throws Exception { + boolean flag = false; + if (isSDCardEnable()) { + File dir = new File(filePath); + if (!dir.exists()) { + dir.mkdir(); + } + File file = new File(filePath, filename); + FileOutputStream outStream = new FileOutputStream(file); + outStream.write(content.getBytes()); + outStream.close(); + flag = true; + } + return flag; + } + + /** + * Read file as stream from SD card + * + * @param fileName + * String PATH = + * Environment.getExternalStorageDirectory().getAbsolutePath() + + * "/dirName"; + * @return + */ + public static byte[] readFileFromSDCard(String filePath, String fileName) { + byte[] buffer = null; + FileInputStream fin = null; + try { + if (isSDCardEnable()) { + String filePaht = filePath + "/" + fileName; + fin = new FileInputStream(filePaht); + int length = fin.available(); + buffer = new byte[length]; + fin.read(buffer); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (fin != null) fin.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return buffer; + } + + /** + * Delete file + * + * @param filePath + * @param fileName + * filePath = + * android.os.Environment.getExternalStorageDirectory().getPath() + * @return + */ + public static boolean deleteSDFile(String filePath, String fileName) { + File file = new File(filePath + "/" + fileName); + return !(!file.exists() || file.isDirectory()) && file.delete(); + } +} +``` \ No newline at end of file diff --git a/md/update_log.md b/md/update_log.md index e03b6f4a..fa5aaeef 100644 --- a/md/update_log.md +++ b/md/update_log.md @@ -1,4 +1,5 @@ ### 更新Log +#### 16/08/15 新增3DES和AES加密及单元检测,加密解密工具类基本完善,目录更新 #### 16/08/14 新增DES加密及单元检测 #### 16/08/13 新增MD2,SHA224,SHA256,SHA384,SHA512加密及单元测试,正折腾DES加密 #### 16/08/12 新增Base64和Html编码解码及他们的单元测试,新增TimeUtils单元测试,更新md @@ -12,4 +13,4 @@ #### 16/08/03 修复在onCreate中获取view尺寸的bug,MD5和SHA的Bug修复完成(在此感谢ssyijiu) #### 16/08/02 wifi设置界面bug修复,注释排版还在修改,获取mac地址增加判空,新增QQ群:74721490,欢迎加入,新增隐藏状态栏,注释更加全面,工具类已封装,写的时候真的是一个一个测试过去的,宝宝心里苦 #### 16/08/01 新增获取SD卡路径,手机和设备进行分类,代码bug修改部分,小修排版,正在封装类,新增目录中显示方法名,新增获取当前App版本Code -#### 16/07/31 新增点击屏幕空白区域隐藏软键盘,未能成功增加本页目录跳转功能(不支持) +#### 16/07/31 新增点击屏幕空白区域隐藏软键盘,未能成功增加本页目录跳转功能(不支持) \ No newline at end of file diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/ConstUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/ConstUtils.java index deeac012..2c71aa8b 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/ConstUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/ConstUtils.java @@ -5,7 +5,7 @@ package com.blankj.utilcode.utils; * author: Blankj * blog : http://blankj.com * time : 2016/8/11 - * desc : 单位相关工具类 + * desc : 常量相关工具类 * */ public class ConstUtils { @@ -53,54 +53,4 @@ public class ConstUtils { * 天与毫秒的倍数 */ public static final int DAY = 86400000; - - /******************** DES加密相关常量 ********************/ - /** - * DES加密为ECB、无填充 - */ - public static final String DES_ECB_NO_PADDING = "DES/ECB/NoPadding"; - /** - * DES加密为CBC、无填充 - */ - public static final String DES_CBC_NO_PADDING = "DES/CBC/NoPadding"; - /** - * DES加密为CFB、无填充 - */ - public static final String DES_CFB_NO_PADDING = "DES/CFB/NoPadding"; - /** - * DES加密为OFB、无填充 - */ - public static final String DES_OFB_NO_PADDING = "DES/OFB/NoPadding"; - /** - * DES加密为ECB、零填充 - */ - public static final String DES_ECB_ZEROS_PADDING = "DES/ECB/ZerosPadding"; - /** - * DES加密为CBC、零填充 - */ - public static final String DES_CBC_ZEROS_PADDING = "DES/CBC/ZerosPadding"; - /** - * DES加密为CFB、零填充 - */ - public static final String DES_CFB_ZEROS_PADDING = "DES/CFB/ZerosPadding"; - /** - * DES加密为OFB、零填充 - */ - public static final String DES_OFB_ZEROS_PADDING = "DES/OFB/ZerosPadding"; - /** - * DES加密为ECB、PKCS5Padding填充 - */ - public static final String DES_ECB_PKCS5_PADDING = "DES/ECB/PKCS5Padding"; - /** - * DES加密为CBC、PKCS5Padding填充 - */ - public static final String DES_CBC_PKCS5_PADDING = "DES/CBC/PKCS5Padding"; - /** - * DES加密为CFB、PKCS5Padding填充 - */ - public static final String DES_CFB_PKCS5_PADDING = "DES/CFB/PKCS5Padding"; - /** - * DES加密为OFB、PKCS5Padding填充 - */ - public static final String DES_OFB_PKCS5_PADDING = "DES/OFB/PKCS5Padding"; } diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/ConvertUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/ConvertUtils.java index ff98758b..d40bfe67 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/ConvertUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/ConvertUtils.java @@ -32,7 +32,7 @@ public class ConvertUtils { /** * 每2个hex字符转为1个byte *

例如:

- * bytes2HexString("00A8") returns { 0, (byte) 0xA8 } + * hexString2Bytes("00A8") returns { 0, (byte) 0xA8 } * * @param hexString 十六进制字符串 * @return byte数组 @@ -67,9 +67,12 @@ public class ConvertUtils { } /** - * char转byte + * charArr转byteArr + * + * @param chars 待转的char数组 + * @return byte数组 */ - public static byte[] getBytes(char[] chars) { + public static byte[] chars2Bytes(char[] chars) { int len = chars.length; byte[] bytes = new byte[len]; for (int i = 0; i < len; i++) { @@ -79,9 +82,12 @@ public class ConvertUtils { } /** - * byte转char + * byteArr转charArr + * + * @param bytes 待转的byte数组 + * @return char数组 */ - public static char[] getChars(byte[] bytes) { + public static char[] bytes2Chars(byte[] bytes) { int len = bytes.length; char[] chars = new char[len]; for (int i = 0; i < len; i++) { diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/DeviceUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/DeviceUtils.java index b0dabda1..133b3c31 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/DeviceUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/DeviceUtils.java @@ -72,8 +72,7 @@ public class DeviceUtils { * @return 设备厂商 */ public static String getManufacturer() { - String MANUFACTURER = Build.MANUFACTURER; - return MANUFACTURER; + return Build.MANUFACTURER; } /** diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/EncodeUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/EncodeUtils.java index dd590da5..28d9b97f 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/EncodeUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/EncodeUtils.java @@ -133,8 +133,8 @@ public class EncodeUtils { * @param input 要Base64URL安全编码的字符串 * @return Base64URL安全编码后的字符串 */ - public static String base64UrlSafeEncode(String input) { - return new String(Base64.encode(input.getBytes(), Base64.URL_SAFE)); + public static byte[] base64UrlSafeEncode(String input) { + return Base64.encode(input.getBytes(), Base64.URL_SAFE); } /** diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/EncryptUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/EncryptUtils.java index a40e23cd..08122296 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/EncryptUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/EncryptUtils.java @@ -10,19 +10,16 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.SecretKeySpec; -import static com.blankj.utilcode.utils.ConvertUtils.bytes2HexString; +import static com.blankj.utilcode.utils.ConvertUtils.*; /** *
  *     author: Blankj
  *     blog  : http://blankj.com
  *     time  : 2016/8/2
- *     desc  : 加密相关的工具类
+ *     desc  : 加密解密相关的工具类
  * 
*/ public class EncryptUtils { @@ -36,19 +33,19 @@ public class EncryptUtils { * MD2加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getMD2(String data) { - return getMD2(data.getBytes()); + public static String encryptMD2ToString(String data) { + return encryptMD2ToString(data.getBytes()); } /** * MD2加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getMD2(byte[] data) { + public static String encryptMD2ToString(byte[] data) { return bytes2HexString(encryptMD2(data)); } @@ -66,10 +63,10 @@ public class EncryptUtils { * MD5加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getMD5(String data) { - return getMD5(data.getBytes()); + public static String encryptMD5ToString(String data) { + return encryptMD5ToString(data.getBytes()); } /** @@ -77,9 +74,9 @@ public class EncryptUtils { * * @param data 明文字符串 * @param salt 盐 - * @return 密文 + * @return 16进制加盐密文 */ - public static String getMD5(String data, String salt) { + public static String encryptMD5ToString(String data, String salt) { return bytes2HexString(encryptMD5((data + salt).getBytes())); } @@ -87,9 +84,9 @@ public class EncryptUtils { * MD5加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getMD5(byte[] data) { + public static String encryptMD5ToString(byte[] data) { return bytes2HexString(encryptMD5(data)); } @@ -98,9 +95,9 @@ public class EncryptUtils { * * @param data 明文字节数组 * @param salt 盐字节数组 - * @return 密文 + * @return 16进制加盐密文 */ - public static String getMD5(byte[] data, byte[] salt) { + public static String encryptMD5ToString(byte[] data, byte[] salt) { byte[] dataSalt = new byte[data.length + salt.length]; System.arraycopy(data, 0, dataSalt, 0, data.length); System.arraycopy(salt, 0, dataSalt, data.length, salt.length); @@ -121,19 +118,19 @@ public class EncryptUtils { * SHA1加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA1(String data) { - return getSHA1(data.getBytes()); + public static String encryptSHA1ToString(String data) { + return encryptSHA1ToString(data.getBytes()); } /** * SHA1加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA1(byte[] data) { + public static String encryptSHA1ToString(byte[] data) { return bytes2HexString(encryptSHA1(data)); } @@ -151,19 +148,19 @@ public class EncryptUtils { * SHA224加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA224(String data) { - return getSHA224(data.getBytes()); + public static String encryptSHA224ToString(String data) { + return encryptSHA224ToString(data.getBytes()); } /** * SHA224加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA224(byte[] data) { + public static String encryptSHA224ToString(byte[] data) { return bytes2HexString(encryptSHA224(data)); } @@ -181,19 +178,19 @@ public class EncryptUtils { * SHA256加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA256(String data) { - return getSHA256(data.getBytes()); + public static String encryptSHA256ToString(String data) { + return encryptSHA256ToString(data.getBytes()); } /** * SHA256加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA256(byte[] data) { + public static String encryptSHA256ToString(byte[] data) { return bytes2HexString(encryptSHA256(data)); } @@ -211,19 +208,19 @@ public class EncryptUtils { * SHA384加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA384(String data) { - return getSHA384(data.getBytes()); + public static String encryptSHA384ToString(String data) { + return encryptSHA384ToString(data.getBytes()); } /** * SHA384加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA384(byte[] data) { + public static String encryptSHA384ToString(byte[] data) { return bytes2HexString(encryptSHA384(data)); } @@ -241,19 +238,19 @@ public class EncryptUtils { * SHA512加密 * * @param data 明文字符串 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA512(String data) { - return getSHA512(data.getBytes()); + public static String encryptSHA512ToString(String data) { + return encryptSHA512ToString(data.getBytes()); } /** * SHA512加密 * * @param data 明文字节数组 - * @return 密文 + * @return 16进制密文 */ - public static String getSHA512(byte[] data) { + public static String encryptSHA512ToString(byte[] data) { return bytes2HexString(encryptSHA512(data)); } @@ -285,14 +282,34 @@ public class EncryptUtils { return new byte[0]; } + /** + * 获取文件的MD5校验码 + * + * @param filePath 文件路径 + * @return 文件的16进制密文 + */ + public static String encryptMD5File2String(String filePath) { + return encryptMD5File2String(new File(filePath)); + } + /** * 获取文件的MD5校验码 * * @param filePath 文件路径 * @return 文件的MD5校验码 */ - public static String getMD5File(String filePath) { - return getMD5File(new File(filePath)); + public static byte[] encryptMD5File(String filePath) { + return encryptMD5File(new File(filePath)); + } + + /** + * 获取文件的MD5校验码 + * + * @param file 文件 + * @return 文件的16进制密文 + */ + public static String encryptMD5File2String(File file) { + return encryptMD5File(file) != null ? bytes2HexString(encryptMD5File(file)) : ""; } /** @@ -301,7 +318,7 @@ public class EncryptUtils { * @param file 文件 * @return 文件的MD5校验码 */ - public static String getMD5File(File file) { + public static byte[] encryptMD5File(File file) { FileInputStream in = null; try { in = new FileInputStream(file); @@ -309,7 +326,7 @@ public class EncryptUtils { MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buffer); - return bytes2HexString(md.digest()); + return md.digest(); } catch (NoSuchAlgorithmException | IOException e) { e.printStackTrace(); } finally { @@ -320,153 +337,257 @@ public class EncryptUtils { } } } - return ""; + return null; + } + + /************************ DES加密相关 ***********************/ + /** + * DES转变 + *

法算法名称/加密模式/填充方式

+ *

加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB

+ *

填充方式有:NoPadding、ZerosPadding、PKCS5Padding

+ */ + public static String DES_Transformation = "DES/ECB/NoPadding"; + public static String DES_Algorithm = "DES"; + + /** + * @param data 数据 + * @param key 秘钥 + * @param algorithm 采用何种DES算法 + * @param transformation 转变 + * @param isEncrypt 是否加密 + * @return 密文或者明文,适用于DES,3DES,AES + */ + public static byte[] DESTemplet(byte[] data, byte[] key, String algorithm, String transformation, boolean isEncrypt) { + try { + SecretKeySpec keySpec = new SecretKeySpec(key, algorithm); + Cipher cipher = Cipher.getInstance(transformation); + SecureRandom random = new SecureRandom(); + cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec, random); + return cipher.doFinal(data); + } catch (Throwable e) { + e.printStackTrace(); + } + return null; } - /*********************** DES加密相关 ***********************/ /** - * 生成密钥key对象 + * DES加密后转为Base64编码 * - * @param key 秘钥字节数组 - * @return 秘钥对象 - * @throws Exception + * @param data 明文 + * @param key 8字节秘钥 + * @return Base64密文 */ - private static SecretKey keyGenerator(byte[] key) throws Exception { - DESKeySpec desKey = new DESKeySpec(key); - SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); - return keyFactory.generateSecret(desKey); + public static byte[] encryptDES2Base64(byte[] data, byte[] key) { + return EncodeUtils.base64Encode(encryptDES(data, key)); } /** - * DES加密后再经Base64编码 + * DES加密后转为16进制 * - * @param data 明文 - * @param key 秘钥 - * @param transformation 算法名称/加密模式/填充方式,详见ConstUtils之DES加密相关常量 - * @return 经Base64编码后的密文 + * @param data 明文 + * @param key 8字节秘钥 + * @return 16进制密文 */ - public static byte[] encryptDESWithBase64(byte[] data, byte[] key, String transformation) { - return EncodeUtils.base64Encode(encryptDES(data, key, transformation)); + public static String encryptDES2HexString(byte[] data, byte[] key) { + return bytes2HexString(encryptDES(data, key)); } /** * DES加密 * - * @param data 明文 - * @param key 秘钥 - * @param transformation 算法名称/加密模式/填充方式,详见ConstUtils之DES加密相关常量 + * @param data 明文 + * @param key 8字节秘钥 * @return 密文 */ - public static byte[] encryptDES(byte[] data, byte[] key, String transformation) { - try { - SecretKey secretKey = keyGenerator(key); - Cipher cipher = Cipher.getInstance(transformation); - SecureRandom random = new SecureRandom(); - cipher.init(Cipher.ENCRYPT_MODE, secretKey, random); - return cipher.doFinal(data); - } catch (Throwable e) { - e.printStackTrace(); - } - return null; + public static byte[] encryptDES(byte[] data, byte[] key) { + return DESTemplet(data, key, DES_Algorithm, DES_Transformation, true); } /** - * DES解密带有Base64编码后的DES密文 + * DES解密Base64编码密文 * - * @param data 带有Base64编码后的DES密文 - * @param key 秘钥 - * @param transformation 算法名称/加密模式/填充方式,详见ConstUtils之DES加密相关常量 + * @param data Base64编码密文 + * @param key 8字节秘钥 + * @return 明文 + */ + public static byte[] decryptBase64DES(byte[] data, byte[] key) { + return decryptDES(EncodeUtils.base64Decode(data), key); + } + + /** + * DES解密16进制密文 + * + * @param data 16进制密文 + * @param key 8字节秘钥 * @return 明文 */ - public static byte[] decryptDESWithBase64(byte[] data, byte[] key, String transformation) { - return decryptDES(EncodeUtils.base64Decode(data), key, transformation); + public static byte[] decryptHexStringDES(String data, byte[] key) { + return decryptDES(hexString2Bytes(data), key); } /** * DES解密 * - * @param data 密文 - * @param key 秘钥 - * @param transformation 算法名称/加密模式/填充方式,详见ConstUtils之DES加密相关常量 + * @param data 密文 + * @param key 8字节秘钥 * @return 明文 */ - public static byte[] decryptDES(byte[] data, byte[] key, String transformation) { - try { - SecretKey secretKey = keyGenerator(key); - Cipher cipher = Cipher.getInstance(transformation); - cipher.init(Cipher.DECRYPT_MODE, secretKey); - return cipher.doFinal(data); - } catch (Throwable e) { - e.printStackTrace(); - } - return null; + public static byte[] decryptDES(byte[] data, byte[] key) { + return DESTemplet(data, key, DES_Algorithm, DES_Transformation, false); } - /*********************** AES加密相关 ***********************/ + /************************ 3DES加密相关 ***********************/ + /** + * 3DES转变 + *

法算法名称/加密模式/填充方式

+ *

加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB

+ *

填充方式有:NoPadding、ZerosPadding、PKCS5Padding

+ */ + public static String TripleDES_Transformation = "DESede/ECB/NoPadding"; + public static String TripleDES_Algorithm = "DESede"; - public static byte[] decrypt(byte[] sSrc, String sKey) throws Exception { - try { - // 判断Key是否正确 - if (sKey == null) { - System.out.print("Key为空null"); - return null; - } - // 判断Key是否为16位 - if (sKey.length() != 16) { - System.out.print("Key长度不是16位"); - return null; - } - byte[] raw = sKey.getBytes("ASCII"); - SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); - Cipher cipher = Cipher.getInstance("AES"); - cipher.init(Cipher.DECRYPT_MODE, skeySpec); - byte[] encrypted1 = sSrc; - try { - byte[] original = cipher.doFinal(encrypted1); - return original; - } catch (Exception e) { - System.out.println(e.toString()); - return null; - } - } catch (Exception ex) { - System.out.println(ex.toString()); - return null; - } + + /** + * 3DES加密后转为Base64编码 + * + * @param data 明文 + * @param key 24字节秘钥 + * @return Base64密文 + */ + public static byte[] encrypt3DES2Base64(byte[] data, byte[] key) { + return EncodeUtils.base64Encode(encrypt3DES(data, key)); } - // 判断Key是否正确 - public static byte[] encrypt(byte[] sSrc, String sKey) throws Exception { - if (sKey == null) { - System.out.print("Key为空null"); - return null; - } - // 判断Key是否为16位 - if (sKey.length() != 16) { - System.out.print("Key长度不是16位"); - return null; - } - byte[] raw = sKey.getBytes("ASCII"); - SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); - Cipher cipher = Cipher.getInstance("AES"); - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - byte[] encrypted = cipher.doFinal(sSrc); - return encrypted; + /** + * 3DES加密后转为16进制 + * + * @param data 明文 + * @param key 24字节秘钥 + * @return 16进制密文 + */ + public static String encrypt3DES2HexString(byte[] data, byte[] key) { + return bytes2HexString(encrypt3DES(data, key)); } - public static byte[] parseHexStr2Byte(String strhex) { - if (strhex == null) { - return null; - } - int l = strhex.length(); - if (l % 2 == 1) { - return null; - } - byte[] b = new byte[l / 2]; - for (int i = 0; i != l / 2; i++) { - b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), - 16); - } - return b; + /** + * 3DES加密 + * + * @param data 明文 + * @param key 24字节密钥 + * @return 密文 + */ + public static byte[] encrypt3DES(byte[] data, byte[] key) { + return DESTemplet(data, key, TripleDES_Algorithm, TripleDES_Transformation, true); + } + + /** + * 3DES解密Base64编码密文 + * + * @param data Base64编码密文 + * @param key 24字节秘钥 + * @return 明文 + */ + public static byte[] decryptBase64_3DES(byte[] data, byte[] key) { + return decrypt3DES(EncodeUtils.base64Decode(data), key); + } + + /** + * 3DES解密16进制密文 + * + * @param data 16进制密文 + * @param key 24字节秘钥 + * @return 明文 + */ + public static byte[] decryptHexString3DES(String data, byte[] key) { + return decrypt3DES(hexString2Bytes(data), key); + } + + /** + * 3DES解密 + * + * @param data 密文 + * @param key 24字节密钥 + * @return 明文 + */ + public static byte[] decrypt3DES(byte[] data, byte[] key) { + return DESTemplet(data, key, TripleDES_Algorithm, TripleDES_Transformation, false); } -} + /************************ AES加密相关 ***********************/ + /** + * AES转变 + *

法算法名称/加密模式/填充方式

+ *

加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB

+ *

填充方式有:NoPadding、ZerosPadding、PKCS5Padding

+ */ + public static String AES_Transformation = "AES/ECB/NoPadding"; + public static String AES_Algorithm = "AES"; + + + /** + * AES加密后转为Base64编码 + * + * @param data 明文 + * @param key 16、24、32字节秘钥 + * @return Base64密文 + */ + public static byte[] encryptAES2Base64(byte[] data, byte[] key) { + return EncodeUtils.base64Encode(encryptAES(data, key)); + } + + /** + * AES加密后转为16进制 + * + * @param data 明文 + * @param key 16、24、32字节秘钥 + * @return 16进制密文 + */ + public static String encryptAES2HexString(byte[] data, byte[] key) { + return bytes2HexString(encryptAES(data, key)); + } + + /** + * AES加密 + * + * @param data 明文 + * @param key 16、24、32字节秘钥 + * @return 密文 + */ + public static byte[] encryptAES(byte[] data, byte[] key) { + return DESTemplet(data, key, AES_Algorithm, AES_Transformation, true); + } + + /** + * AES解密Base64编码密文 + * + * @param data Base64编码密文 + * @param key 16、24、32字节秘钥 + * @return 明文 + */ + public static byte[] decryptBase64AES(byte[] data, byte[] key) { + return decryptAES(EncodeUtils.base64Decode(data), key); + } + + /** + * AES解密16进制密文 + * + * @param data 16进制密文 + * @param key 16、24、32字节秘钥 + * @return 明文 + */ + public static byte[] decryptHexStringAES(String data, byte[] key) { + return decryptAES(hexString2Bytes(data), key); + } + + /** + * AES解密 + * + * @param data 密文 + * @param key 16、24、32字节秘钥 + * @return 明文 + */ + public static byte[] decryptAES(byte[] data, byte[] key) { + return DESTemplet(data, key, AES_Algorithm, AES_Transformation, false); + } +} \ No newline at end of file diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/ImageUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/ImageUtils.java index c42ba54e..d5778edb 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/ImageUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/ImageUtils.java @@ -1,12 +1,5 @@ package com.blankj.utilcode.utils; -import android.graphics.Bitmap; -import android.graphics.Bitmap.CompressFormat; -import android.graphics.BitmapFactory; -import android.util.Base64; - -import java.io.ByteArrayOutputStream; - /** *
  *     author: Blankj
@@ -16,33 +9,9 @@ import java.io.ByteArrayOutputStream;
  * 
*/ public class ImageUtils { - - /** - * 将Bitmap转换成字符串 - * - * @param bitmap - * @return - */ - public static String bitmaptoString(Bitmap bitmap) { - String string = null; - ByteArrayOutputStream bStream = new ByteArrayOutputStream(); - bitmap.compress(CompressFormat.PNG, 100, bStream); - byte[] bytes = bStream.toByteArray(); - string = Base64.encodeToString(bytes, Base64.DEFAULT); - return string; + private ImageUtils() { + throw new UnsupportedOperationException("u can't fuck me..."); } - /** - * 把byte数组转化成 bitmap对象 - * - * @param b - * @return - */ - public static Bitmap bytes2Bimap(byte[] b) { - if (b.length != 0) { - return BitmapFactory.decodeByteArray(b, 0, b.length); - } else { - return null; - } - } + } diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/KeyboardUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/KeyboardUtils.java index 3ee6170a..53a3468f 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/KeyboardUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/KeyboardUtils.java @@ -21,6 +21,12 @@ public class KeyboardUtils { throw new UnsupportedOperationException("u can't fuck me..."); } + /** + * 避免输入法面板遮挡 + *

在manifest.xml中activity中设置

+ *

android:windowSoftInputMode="stateVisible|adjustResize"

+ */ + /** * 动态隐藏软键盘 * @@ -131,7 +137,7 @@ public class KeyboardUtils { * 切换键盘显示与否状态 * * @param context 上下文 - * @param edit 输入框 + * @param edit 输入框 */ public static void toggleSoftInput(Context context, EditText edit) { edit.setFocusable(true); @@ -141,4 +147,4 @@ public class KeyboardUtils { .getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } -} +} \ No newline at end of file diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/NetworkUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/NetworkUtils.java index 67768b8e..ec1b6cff 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/NetworkUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/NetworkUtils.java @@ -46,7 +46,7 @@ public class NetworkUtils { } /** - * 获取活动网路信息 + * 获取活动网络信息 * * @param context 上下文 * @return NetworkInfo diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/PhoneUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/PhoneUtils.java index 405bb798..001f9aa4 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/PhoneUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/PhoneUtils.java @@ -46,14 +46,14 @@ public class PhoneUtils { } /** - * 获取当前设备的IMIE + * 获取手机的IMIE *

需与上面的isPhone一起使用

*

需添加权限 android.permission.READ_PHONE_STATE

* * @param context 上下文 * @return IMIE码 */ - public static String getDeviceIMEI(Context context) { + public static String getPhoneIMEI(Context context) { String deviceId; if (isPhone(context)) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); @@ -308,4 +308,4 @@ public class PhoneUtils { e.printStackTrace(); } } -} +} \ No newline at end of file diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/SDCardUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/SDCardUtils.java index 22fb336c..652e55df 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/SDCardUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/SDCardUtils.java @@ -173,4 +173,4 @@ public class SDCardUtils { File file = new File(filePath + "/" + fileName); return !(!file.exists() || file.isDirectory()) && file.delete(); } -} +} \ No newline at end of file diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/ScreenUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/ScreenUtils.java index 96a78c00..5f4d0191 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/ScreenUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/ScreenUtils.java @@ -234,4 +234,4 @@ public class ScreenUtils { .getSystemService(Context.KEYGUARD_SERVICE); return km.inKeyguardRestrictedInputMode(); } -} +} \ No newline at end of file diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/ShellUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/ShellUtils.java index 7dede99d..0a756c03 100644 --- a/utilcode/src/main/java/com/blankj/utilcode/utils/ShellUtils.java +++ b/utilcode/src/main/java/com/blankj/utilcode/utils/ShellUtils.java @@ -189,4 +189,4 @@ public class ShellUtils { this.errorMsg = errorMsg; } } -} +} \ No newline at end of file diff --git a/utilcode/src/test/java/com/blankj/utilcode/utils/EncryptUtilsTest.java b/utilcode/src/test/java/com/blankj/utilcode/utils/EncryptUtilsTest.java index cf24869c..c0a0a98e 100644 --- a/utilcode/src/test/java/com/blankj/utilcode/utils/EncryptUtilsTest.java +++ b/utilcode/src/test/java/com/blankj/utilcode/utils/EncryptUtilsTest.java @@ -6,6 +6,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static com.blankj.utilcode.utils.ConvertUtils.*; +import static com.blankj.utilcode.utils.EncodeUtils.*; import static com.blankj.utilcode.utils.EncryptUtils.*; import static com.google.common.truth.Truth.assertThat; @@ -21,124 +22,123 @@ import static com.google.common.truth.Truth.assertThat; @Config(manifest = Config.NONE) public class EncryptUtilsTest { - String blankjMD5 = "AAC25CD336E01C8655F4EC7875445A60"; String blankjMD2 = "15435017570D8A73449E25C4622E17A4"; + String blankjMD5 = "AAC25CD336E01C8655F4EC7875445A60"; String blankjSHA1 = "C606ACCB1FEB669E19D080ADDDDBB8E6CDA5F43C"; String blankjSHA224 = "F4C5C0E8CF56CAC4D06DB6B523F67621859A9D79BDA4B2AC03097D5F"; String blankjSHA256 = "8BD80AE90DFBA112786367BEBDDEE60A638EF5B82682EDF8F3D3CA8E6BFEF648"; String blankjSHA384 = "BF831E5221FC108D6A72ACB888BA3EB0C030A5F01BA2F739856BE70681D86F992B85E0D461101C74BAEDA895BD422557"; String blankjSHA512 = "D59D31067F614ED3586F85A31FEFDB7F33096316DA26EBE0FF440B241C8560D96650F100D78C512560C976949EFA89CB5D5589DCF68C7FAADE98F03BCFEC2B45"; - @Test - public void testGetMD5() throws Exception { - assertThat(getMD5("blankj")).isEqualTo(blankjMD5); - assertThat(getMD5("blank", "j")).isEqualTo(blankjMD5); - assertThat(getMD5("blankj".getBytes())).isEqualTo(blankjMD5); - assertThat(getMD5("blank".getBytes(), "j".getBytes())).isEqualTo(blankjMD5); - } - - @Test - public void testEncryptMD5() throws Exception { - assertThat(bytes2HexString(encryptMD5("blankj".getBytes()))).isEqualTo(blankjMD5); - } - - @Test - public void testGetMD2() throws Exception { - assertThat(getMD2("blankj")).isEqualTo(blankjMD2); - assertThat(getMD2("blankj".getBytes())).isEqualTo(blankjMD2); - } - @Test public void testEncryptMD2() throws Exception { - assertThat(bytes2HexString(encryptMD2("blankj".getBytes()))).isEqualTo(blankjMD2); + assertThat(encryptMD2ToString("blankj")).isEqualTo(blankjMD2); + assertThat(encryptMD2ToString("blankj".getBytes())).isEqualTo(blankjMD2); + assertThat(encryptMD2("blankj".getBytes())).isEqualTo(hexString2Bytes(blankjMD2)); } @Test - public void testGetSHA1() throws Exception { - assertThat(getSHA1("blankj")).isEqualTo(blankjSHA1); - assertThat(getSHA1("blankj".getBytes())).isEqualTo(blankjSHA1); + public void testEncryptMD5() throws Exception { + assertThat(encryptMD5ToString("blankj")).isEqualTo(blankjMD5); + assertThat(encryptMD5ToString("blankj".getBytes())).isEqualTo(blankjMD5); + assertThat(encryptMD5("blankj".getBytes())).isEqualTo(hexString2Bytes(blankjMD5)); } @Test public void testEncryptSHA1() throws Exception { - assertThat(bytes2HexString(encryptSHA1("blankj".getBytes()))).isEqualTo(blankjSHA1); - } - - @Test - public void testGetSHA224() throws Exception { - assertThat(getSHA224("blankj")).isEqualTo(blankjSHA224); - assertThat(getSHA224("blankj".getBytes())).isEqualTo(blankjSHA224); + assertThat(encryptSHA1ToString("blankj")).isEqualTo(blankjSHA1); + assertThat(encryptSHA1ToString("blankj".getBytes())).isEqualTo(blankjSHA1); + assertThat(encryptSHA1("blankj".getBytes())).isEqualTo(hexString2Bytes(blankjSHA1)); } @Test public void testEncryptSHA224() throws Exception { - assertThat(bytes2HexString(encryptSHA224("blankj".getBytes()))).isEqualTo(blankjSHA224); - } - - @Test - public void testGetSHA256() throws Exception { - assertThat(getSHA256("blankj")).isEqualTo(blankjSHA256); - assertThat(getSHA256("blankj".getBytes())).isEqualTo(blankjSHA256); + assertThat(encryptSHA224ToString("blankj")).isEqualTo(blankjSHA224); + assertThat(encryptSHA224ToString("blankj".getBytes())).isEqualTo(blankjSHA224); + assertThat(encryptSHA224("blankj".getBytes())).isEqualTo(hexString2Bytes(blankjSHA224)); } @Test public void testEncryptSHA256() throws Exception { - assertThat(bytes2HexString(encryptSHA256("blankj".getBytes()))).isEqualTo(blankjSHA256); - } - - @Test - public void testGetSHA384() throws Exception { - assertThat(getSHA384("blankj")).isEqualTo(blankjSHA384); - assertThat(getSHA384("blankj".getBytes())).isEqualTo(blankjSHA384); + assertThat(encryptSHA256ToString("blankj")).isEqualTo(blankjSHA256); + assertThat(encryptSHA256ToString("blankj".getBytes())).isEqualTo(blankjSHA256); + assertThat(encryptSHA256("blankj".getBytes())).isEqualTo(hexString2Bytes(blankjSHA256)); } @Test public void testEncryptSHA384() throws Exception { - assertThat(bytes2HexString(encryptSHA384("blankj".getBytes()))).isEqualTo(blankjSHA384); + assertThat(encryptSHA384ToString("blankj")).isEqualTo(blankjSHA384); + assertThat(encryptSHA384ToString("blankj".getBytes())).isEqualTo(blankjSHA384); + assertThat(encryptSHA384("blankj".getBytes())).isEqualTo(hexString2Bytes(blankjSHA384)); } @Test - public void testGetSHA512() throws Exception { - assertThat(getSHA512("blankj")).isEqualTo(blankjSHA512); - assertThat(getSHA512("blankj".getBytes())).isEqualTo(blankjSHA512); + public void testEncryptSHA512() throws Exception { + assertThat(encryptSHA512ToString("blankj")).isEqualTo(blankjSHA512); + assertThat(encryptSHA512ToString("blankj".getBytes())).isEqualTo(blankjSHA512); + assertThat(encryptSHA512("blankj".getBytes())).isEqualTo(hexString2Bytes(blankjSHA512)); } + String dataDES = "0008DB3345AB0223"; + String keyDES = "6801020304050607"; + String resDES = "1F7962581118F360"; + byte[] bytesDataDES = hexString2Bytes(dataDES); + byte[] bytesKeyDES = hexString2Bytes(keyDES); + byte[] bytesResDES = hexString2Bytes(resDES); + @Test - public void testEncryptSHA512() throws Exception { - assertThat(bytes2HexString(encryptSHA512("blankj".getBytes()))).isEqualTo(blankjSHA512); + public void testEncryptDES() throws Exception { + assertThat(encryptDES(bytesDataDES, bytesKeyDES)).isEqualTo(bytesResDES); + assertThat(encryptDES2HexString(bytesDataDES, bytesKeyDES)).isEqualTo(resDES); + assertThat(encryptDES2Base64(bytesDataDES, bytesKeyDES)).isEqualTo(base64Encode(bytesResDES)); } @Test - public void testGetMD5File() throws Exception { - + public void testDecryptDES() throws Exception { + assertThat(decryptDES(bytesResDES, bytesKeyDES)).isEqualTo(bytesDataDES); + assertThat(decryptHexStringDES(resDES, bytesKeyDES)).isEqualTo(bytesDataDES); + assertThat(decryptBase64DES(base64Encode(bytesResDES), bytesKeyDES)).isEqualTo(bytesDataDES); } - String data = "0008DB3345AB0223"; - String key = "6801020304050607"; - String des = "1F7962581118F360"; - byte[] bytesData = hexString2Bytes(data); - byte[] bytesKey = hexString2Bytes(key); - byte[] byteDes = hexString2Bytes(des); + String data3DES = "1111111111111111"; + String key3DES = "111111111111111111111111111111111111111111111111"; + String res3DES = "F40379AB9E0EC533"; + byte[] bytesDataDES3 = hexString2Bytes(data3DES); + byte[] bytesKeyDES3 = hexString2Bytes(key3DES); + byte[] bytesResDES3 = hexString2Bytes(res3DES); @Test - public void testEncryptDESWithBase64() throws Exception { - assertThat(encryptDESWithBase64(bytesData, bytesKey, ConstUtils.DES_ECB_NO_PADDING)) - .isEqualTo(EncodeUtils.base64Encode(byteDes)); + public void testEncrypt3DES() throws Exception { + assertThat(encrypt3DES(bytesDataDES3, bytesKeyDES3)).isEqualTo(bytesResDES3); + assertThat(encrypt3DES2HexString(bytesDataDES3, bytesKeyDES3)).isEqualTo(res3DES); + assertThat(encrypt3DES2Base64(bytesDataDES3, bytesKeyDES3)).isEqualTo(base64Encode(bytesResDES3)); } @Test - public void testDecryptDESWithBase64() throws Exception { - assertThat(decryptDESWithBase64(EncodeUtils.base64Encode(byteDes), bytesKey, ConstUtils.DES_ECB_NO_PADDING)) - .isEqualTo(bytesData); + public void testDecrypt3DES() throws Exception { + assertThat(decrypt3DES(bytesResDES3, bytesKeyDES3)).isEqualTo(bytesDataDES3); + assertThat(decryptHexString3DES(res3DES, bytesKeyDES3)).isEqualTo(bytesDataDES3); + assertThat(decryptBase64_3DES(base64Encode(bytesResDES3), bytesKeyDES3)).isEqualTo(bytesDataDES3); } + String dataAES = "11111111111111111111111111111111"; + String keyAES = "11111111111111111111111111111111"; + String resAES = "E56E26F5608B8D268F2556E198A0E01B"; + byte[] bytesDataAES = hexString2Bytes(dataAES); + byte[] bytesKeyAES = hexString2Bytes(keyAES); + byte[] bytesResAES = hexString2Bytes(resAES); + @Test - public void testEncryptDES() throws Exception { - assertThat(encryptDES(bytesData, bytesKey, ConstUtils.DES_ECB_NO_PADDING)).isEqualTo(byteDes); + public void testEncryptAES() throws Exception { + assertThat(encryptAES(bytesDataAES, bytesKeyAES)).isEqualTo(bytesResAES); + assertThat(encryptAES2HexString(bytesDataAES, bytesKeyAES)).isEqualTo(resAES); + assertThat(encryptAES2Base64(bytesDataAES, bytesKeyAES)).isEqualTo(base64Encode(bytesResAES)); } @Test - public void testDecryptDES() throws Exception { - assertThat(decryptDES(byteDes, bytesKey, ConstUtils.DES_ECB_NO_PADDING)).isEqualTo(bytesData); + public void testDecryptAES() throws Exception { + assertThat(decryptAES(bytesResAES, bytesKeyAES)).isEqualTo(bytesDataAES); + assertThat(decryptHexStringAES(resAES, bytesKeyAES)).isEqualTo(bytesDataAES); + assertThat(decryptBase64AES(base64Encode(bytesResAES), bytesKeyAES)).isEqualTo(bytesDataAES); } } \ No newline at end of file diff --git a/utilcode/utilcode.iml b/utilcode/utilcode.iml index ea8917fb..87347794 100644 --- a/utilcode/utilcode.iml +++ b/utilcode/utilcode.iml @@ -102,13 +102,13 @@ - + - - - + + + @@ -118,11 +118,11 @@ - + - + @@ -144,13 +144,13 @@ - - + - - + + + \ No newline at end of file -- GitLab