提交 28230334 编写于 作者: C cmj

see 08/15 log

上级 947c3681
......@@ -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
......
# 常量相关
``` java
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/11
* desc : 常量相关工具类
* </pre>
*/
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
# 转换相关
``` java
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/13
* desc : 转换相关工具类
* </pre>
*/
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字符
* <p>例如:</p>
* 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
* <p>例如:</p>
* 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
......@@ -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;
}
/**
......
......@@ -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);
}
/**
......
......@@ -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.*;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/2
* desc : 加密相关的工具类
* desc : 加密解密相关的工具类
* </pre>
*/
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转变
* <p>法算法名称/加密模式/填充方式</p>
* <p>加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB</p>
* <p>填充方式有:NoPadding、ZerosPadding、PKCS5Padding</p>
*/
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转变
* <p>法算法名称/加密模式/填充方式</p>
* <p>加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB</p>
* <p>填充方式有:NoPadding、ZerosPadding、PKCS5Padding</p>
*/
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转变
* <p>法算法名称/加密模式/填充方式</p>
* <p>加密模式有:电子密码本模式ECB、加密块链模式CBC、加密反馈模式CFB、输出反馈模式OFB</p>
* <p>填充方式有:NoPadding、ZerosPadding、PKCS5Padding</p>
*/
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);
}
}
```
# 编码解码相关
``` java
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/12
* desc : 图片相关工具类
* </pre>
*/
public class ImageUtils {
private ImageUtils() {
throw new UnsupportedOperationException("u can't fuck me...");
}
}
```
......@@ -21,6 +21,12 @@ public class KeyboardUtils {
throw new UnsupportedOperationException("u can't fuck me...");
}
/**
* 避免输入法面板遮挡
* <p>在manifest.xml中activity中设置</p>
* <p>android:windowSoftInputMode="stateVisible|adjustResize"</p>
*/
/**
* 动态隐藏软键盘
*
......@@ -131,7 +137,7 @@ public class KeyboardUtils {
* 切换键盘显示与否状态
*
* @param context 上下文
* @param edit 输入框
* @param edit 输入框
*/
public static void toggleSoftInput(Context context, EditText edit) {
edit.setFocusable(true);
......
......@@ -46,7 +46,7 @@ public class NetworkUtils {
}
/**
* 获取活动网信息
* 获取活动网信息
*
* @param context 上下文
* @return NetworkInfo
......
......@@ -46,14 +46,14 @@ public class PhoneUtils {
}
/**
* 获取当前设备的IMIE
* 获取手机的IMIE
* <p>需与上面的isPhone一起使用</p>
* <p>需添加权限 android.permission.READ_PHONE_STATE</p>
*
* @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);
......
# 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;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/11
* desc : SD卡相关的工具类
* </pre>
*/
public class SDCardUtils {
private SDCardUtils() {
throw new UnsupportedOperationException("u can't fuck me...");
}
/**
* 获取设备SD卡是否可用
*
* @return true : 可用<br>false : 不可用
*/
public static boolean isSDCardEnable() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
/**
* 获取设备SD卡路径
* <p>一般是/storage/emulated/0/</p>
*
* @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
### 更新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
......@@ -5,7 +5,7 @@ package com.blankj.utilcode.utils;
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/11
* desc : 单位相关工具类
* desc : 常量相关工具类
* </pre>
*/
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";
}
......@@ -32,7 +32,7 @@ public class ConvertUtils {
/**
* 每2个hex字符转为1个byte
* <p>例如:</p>
* 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++) {
......
......@@ -72,8 +72,7 @@ public class DeviceUtils {
* @return 设备厂商
*/
public static String getManufacturer() {
String MANUFACTURER = Build.MANUFACTURER;
return MANUFACTURER;
return Build.MANUFACTURER;
}
/**
......
......@@ -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);
}
/**
......
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;
/**
* <pre>
* author: Blankj
......@@ -16,33 +9,9 @@ import java.io.ByteArrayOutputStream;
* </pre>
*/
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;
}
}
}
......@@ -21,6 +21,12 @@ public class KeyboardUtils {
throw new UnsupportedOperationException("u can't fuck me...");
}
/**
* 避免输入法面板遮挡
* <p>在manifest.xml中activity中设置</p>
* <p>android:windowSoftInputMode="stateVisible|adjustResize"</p>
*/
/**
* 动态隐藏软键盘
*
......@@ -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
......@@ -46,7 +46,7 @@ public class NetworkUtils {
}
/**
* 获取活动网信息
* 获取活动网信息
*
* @param context 上下文
* @return NetworkInfo
......
......@@ -46,14 +46,14 @@ public class PhoneUtils {
}
/**
* 获取当前设备的IMIE
* 获取手机的IMIE
* <p>需与上面的isPhone一起使用</p>
* <p>需添加权限 android.permission.READ_PHONE_STATE</p>
*
* @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
......@@ -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
......@@ -234,4 +234,4 @@ public class ScreenUtils {
.getSystemService(Context.KEYGUARD_SERVICE);
return km.inKeyguardRestrictedInputMode();
}
}
}
\ No newline at end of file
......@@ -189,4 +189,4 @@ public class ShellUtils {
this.errorMsg = errorMsg;
}
}
}
}
\ No newline at end of file
......@@ -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
......@@ -102,13 +102,13 @@
<excludeFolder url="file://$MODULE_DIR$/build/poms" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
<orderEntry type="jdk" jdkName="Android API 23 Platform (2)" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" scope="TEST" name="maven-ant-tasks-2.1.3" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="backport-util-concurrent-3.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="ant-1.8.0" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="xercesMinimal-1.9.6.2" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-ant-tasks-2.1.3" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-profile-2.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="xercesMinimal-1.9.6.2" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="ant-1.8.0" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-settings-2.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="hamcrest-library-1.3" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="asm-commons-5.0.1" level="project" />
......@@ -118,11 +118,11 @@
<orderEntry type="library" exported="" scope="TEST" name="wagon-http-lightweight-1.0-beta-6" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="nekohtml-1.9.6.2" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-error-diagnostics-2.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="wagon-file-1.0-beta-6" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="asm-5.0.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="wagon-file-1.0-beta-6" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-repository-metadata-2.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="wagon-provider-api-1.0-beta-6" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="xstream-1.4.8" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="wagon-provider-api-1.0-beta-6" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="asm-util-5.0.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="bcprov-jdk16-1.46" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="wagon-http-shared-1.0-beta-6" level="project" />
......@@ -144,13 +144,13 @@
<orderEntry type="library" exported="" scope="TEST" name="robolectric-resources-3.1.2" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="protobuf-java-2.6.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-project-2.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="hamcrest-core-1.3" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="vtd-xml-2.11" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="plexus-container-default-1.0-alpha-9-stable-1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="hamcrest-core-1.3" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="junit-4.12" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-artifact-manager-2.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="shadows-core-v23-3.1.2" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="plexus-container-default-1.0-alpha-9-stable-1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="classworlds-1.1-alpha-2" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="shadows-core-v23-3.1.2" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="maven-artifact-manager-2.2.1" level="project" />
<orderEntry type="library" exported="" scope="TEST" name="plexus-interpolation-1.11" level="project" />
</component>
</module>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册