如果给你一条数据让你三层加密采用SecureRandom安全随机数,当key,使用GCM模式,.对他的安全随机数加
算法本身是安全的。AES暴力破解,算力要求也是很高的。关键是你用于加密的key何如保存或者说保护,一般逆向破解就是去发掘key。使用的是什么算法,一般根据算法特征还是很好猜测与定位的。
private static String TRANSFORMATION = "AES/GCM/NoPadding";
private static String random;
private static String alias = "encryptData";
private static String ANDROID_KEY_STORE = "AndroidKeyStore";
// 加密随机数
@RequiresApi(api = Build.VERSION_CODES.M)
@SuppressLint("WrongConstant")
public static SecretBean encryptRandow(Context context) {
// 判断keystroe密钥库中是否存在该密钥
if (!isHaveKeyStore(alias)) {
createKey(alias);
}
try {
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry(alias, null);
SecretKey secretKey = secretKeyEntry.getSecretKey();
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] randomIV = cipher.getIV();
byte[] bytes = cipher.doFinal(random.getBytes("UTF-8"));
// 密文随机key
String encryRandom = parseByte2HexStr(bytes);
String iv = parseByte2HexStr(randomIV);
// 返回密文秘钥
SecretBean encryptBean = new SecretBean();
encryptBean.setCiphertextKey(encryRandom);
encryptBean.setWorkingIV(iv);
return encryptBean;
} catch (Exception e) {
e.printStackTrace();
Log.i("lwx random ", e.getMessage());
return null;
}
}
// 加密明文
@RequiresApi(api = Build.VERSION_CODES.M)
public static SecretBean encryptData(String needEncrypt, Context context) {
// 生成安全随机数
random = getRandomKey();
try {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
// 明文随机key
SecretKeySpec secretKeySpec = new SecretKeySpec(random.getBytes("UTF-8"), TRANSFORMATION);
// 初始化 cipher
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] cipherIV = cipher.getIV();
byte[] priencrypted = cipher.doFinal(needEncrypt.getBytes("UTF-8"));
// 转换成密文字符串
String encryptedText = parseByte2HexStr(priencrypted);
String iv = parseByte2HexStr(cipherIV);
SecretBean encryBean = new SecretBean();
encryBean.setCipherIV(iv);
encryBean.setEncryptedText(encryptedText);
return encryBean;
} catch (Exception e) {
String message = e.getMessage();
Log.i("lwx", "massage" + message);
return null;
}
}
//这是用到的工具
// 生成安全随机数
private static String getRandomKey() {
String val = "";
SecureRandom random = new SecureRandom();
for (int i = 0; i < 16; i++) {
String charOrNum = ((random.nextInt(2) % 2) == 0) ? "char" : "num";
if ("char".equalsIgnoreCase(charOrNum)) {
int choice = ((random.nextInt(2) % 2) == 0) ? 65 : 97;
val += (char) (choice + random.nextInt(26));
} else if ("num".equalsIgnoreCase(charOrNum)) {
val += String.valueOf(random.nextInt(10));
}
}
return val;
}
// byte[]转换成16进制字符串
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
// 将每个字节都转成16进制的
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
// 为保证格式统一,用两位16进制的表示一个字节
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
// 16进展字符串转换成byte[]数组
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
// 两个16进制表示一个字节,所以字节数组大小为hexStr.length() / 2
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
// 每次获取16进制字符串中的两个转成10进制(0-255)
int num = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 2), 16);
// 将10进制强转为byte
result[i] = (byte) num;
}
return result;
}