JAVA AES 256解密
我想用AES解密一些数据。我得到了256位密钥和16字节IV,如下所示:JAVA AES 256解密,java,encryption,cryptography,aes,Java,Encryption,Cryptography,Aes,我想用AES解密一些数据。我得到了256位密钥和16字节IV,如下所示: String key = "Hh1s1f4T2mpN3yCh4ngeL8t3r\\.Thxpp"; int[] v = {11, 1, 555, 222, 241, 21, 11, 33, 35, 91, 45, 6, 14, 30, 22, 234}; String IV = Arrays.toString( v ); 我被告知填充应该是PKCS7,但当我用AES/CBC/PKCS7PADDING初始化
String key = "Hh1s1f4T2mpN3yCh4ngeL8t3r\\.Thxpp";
int[] v = {11, 1, 555, 222, 241, 21, 11, 33, 35, 91, 45, 6, 14, 30, 22, 234};
String IV = Arrays.toString( v );
我被告知填充应该是PKCS7,但当我用AES/CBC/PKCS7PADDING
初始化密码时,它会说:找不到任何支持AES/CBC/PKCS7PADDING的提供者
如果我使用AES/CBC/PKCS5PADDING
我会得到非法密钥大小
,但我已经检查了密钥大小是否为32
public static String decrypt(String key, String initVector, String encrypted) {
try {
System.out.println( "Key size: " + key.getBytes("UTF-8").length );
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
return new String(original);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
您需要使用bouncy castle作为PKCS7PADDING的提供程序。如果您在
AES-256
中遇到IllegalKeySize
异常,请检查以确保在活动JVM中安装了。超过128位的任何AES密钥长度都需要它们
(PKCS#7填充方案为(块大小在规范定义中不同),但Java从未将PKCS#7名称添加到其列表中,因此使用PKCS5Padding
是正确的。)首先查看@Andy的答案
如果出现“非法密钥大小”错误,则密钥大小不正确,需要通过调试找出原因。为UTF-8键创建一个变量
byte[] keyBytes = key.getBytes("UTF-8")
并将其显示为十六进制,这样您就可以准确地看到它发生了什么
内联转换基本上不可能调试
PKCS#5填充是PKCS#7填充的一个子集,在每种情况下都是相同的,PKCS#5只是懒惰的开发人员从DES保留下来的名称
:
PKCS#5填充与PKCS#7填充相同,只是它仅为使用64位(8字节)块大小的块密码定义。实际上,两者可以互换使用
在本例中,PKCS5只是一个命名问题,当AES添加到DES代码时,名称未更新为PKCS7。这两个名字的意图和用途都是一样的。感谢您的澄清,这就解决了问题。有趣的是,我们的生产环境确实包含了这些库,就像其他人报道的那样。不同之处在于,生产使用的是OpenJDK,而开发使用的是Oracle。