我正在尝试使用AES / ECB / PKCS7Padding创建加密和解密功能。
private static byte[] INITIALIZATION_VECTOR = new byte[] { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };
public static String encrypt(String token) {
Cipher cipher = null;
SecretKey key = null;
String tokenAsHex = null;
byte[] encryptedToken = null;
byte[] sksKey = "6iOmT2V6mnd0".getBytes(); // SecretKeySpec key.
try {
key = new SecretKeySpec(sksKey, "AES");
AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
encryptedToken = cipher.doFinal(token.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return Base64.encodeBase64String(encryptedToken);
}
public static String decrypt(String token) {
Cipher cipher = null;
SecretKey key = null;
byte[] decryptedToken = null;
byte[] sksKey = "6iOmT2V6mnd0".getBytes(); // SecretKeySpec key.
try {
key = new SecretKeySpec(sksKey, "AES");
AlgorithmParameterSpec paramSpec = new IvParameterSpec(INITIALIZATION_VECTOR);
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
decryptedToken = cipher.doFinal(Base64.decodeBase64(token));
} catch(Exception e){
e.printStackTrace();
}
if (decryptedToken == null) {
System.out.println("Unable to decrypt the following token: " + token);
}
return new String(decryptedToken);
}
我已经编辑了我的程序。
现在dycryption似乎工作,但它只适用于PKCS5Padding,当我尝试使用PKCS7Padding它说它找不到提供者,它怎么可能?
答案 0 :(得分:2)
你有几个错误:
不要将密文转换为字符串 - 这可能是有损转换。相反,将其保留为字节数组或将其转换为十六进制或base64。
您需要存储IV以便在解密期间使用。目前你只是扔掉它(用你的enc
方法)。一种常见的技术是在密文前加上你的IV(可能用分隔符分隔)。
从解密的字节创建字符串时,应指定字符集。
这可能不是一个详尽的清单,但它肯定足以引起您的主要问题。修复这些问题,然后告诉我们您是否仍然看到错误(在您的问题中发布错误)。
此外,返回带有"error"
的字符串设计很糟糕。在Java中,使用异常来指示出现了问题。