我试图用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 );
我被告知padding应该是PKCS7但是当我使用AES/CBC/PKCS7PADDING
启动密码时它会说:Cannot find any provider supporting AES/CBC/PKCS7PADDING
如果我使用AES/CBC/PKCS5PADDING
,我会Illegal key size
,但我已检查密钥大小是否为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;
}
答案 0 :(得分:3)
如果您使用IllegalKeySize
获得AES-256
例外,请检查以确保您在活动JVM中安装了JCE Unlimited Cryptographic Strength Policy files。任何AES密钥长度超过128 bits
都需要它们。
(PKCS#7填充方案为effectively equivalent to PKCS #5 in Java(规范定义中的块大小不同),但Java从未在其列表中添加PKCS#7名称,因此使用PKCS5Padding
是正确的。)
答案 1 :(得分:1)
首先看@Andy的答案。
如果您收到的是非法密钥大小"错误然后密钥大小不正确,你需要通过调试找出原因。为UTF-8键创建变量
byte[] keyBytes = key.getBytes("UTF-8")
并将其显示为十六进制,这样就可以确切地看到它发生了什么。
内联转换基本上无法调试。
PKCS#5填充是PKCS#7填充的一个子集,并且在每个实例中都是相同的,PKCS#5只是懒惰开发人员对DES的名称保留。
PKCS#5填充与PKCS#7填充相同,只是它仅为使用64位(8字节)块大小的块密码定义。在实践中,这两者可以互换使用。
答案 2 :(得分:-1)
您需要使用充气城堡作为PKCS7PADDING的提供者。