我正在做一些简单的加密/解密编码,我遇到了一个问题,我自己也搞不清楚。
我有一个十六进制编码的密文。密文是AES,块长度为128位,密钥长度为256位。密码块模式是CBC。 IV是密文的第一个块。
异常消息是非法密钥大小。
这是我的decrypt()函数:
public static byte[] decrypt() throws Exception
{
try{
byte[] ciphertextBytes = convertToBytes("cb12f5ca1bae224ad44fdff6e66f9a53e25f1000183ba5568958430c11c6eafc62c04de8bf27e0ac7104b598fb492142");
byte[] keyBytes = convertToBytes("CFDC65CB003DD50FF5D6D826D62CF9CA6C64489D60CB02D18C1B58C636F8220D");
byte[] ivBytes = convertToBytes("cb12f5ca1bae224a");
SecretKey aesKey = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(ivBytes));
byte[] result = cipher.doFinal(ciphertextBytes);
return result;
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
return null;
}
我有那些函数来做转换String / ByteArray
//convert ByteArray to Hex String
public static String convertToHex(byte[] byteArray)
{
StringBuilder sb = new StringBuilder();
for (byte b : byteArray)
{
sb.append(String.format("%02X", b));
}
return sb.toString();
}
//convert String to ByteArray
private static byte[] convertToBytes(String input) {
int length = input.length();
byte[] output = new byte[length / 2];
for (int i = 0; i < length; i += 2) {
output[i / 2] = (byte) ((digit(input.charAt(i), 16) << 4) | digit(input.charAt(i+1), 16));
}
return output;
}
也许你可以帮助我。 非常感谢你!
答案 0 :(得分:4)
您可能已经点击了key-size limit in Oracle JRE。来自链接文档:
如果需要更强大的算法(例如,使用256位密钥的AES),则必须获取JCE Unlimited Strength Jurisdiction Policy Files并将其安装在JDK / JRE中。
用户有责任根据当地法规验证此操作是否允许。