非法密钥大小 - AES CBC 解密

nor*_*r0x 2 java encryption aes cbc-mode

我正在做一些简单的加密/解密编码,但遇到了一个我自己无法解决的问题。

我有一个十六进制编码的密文。密文为AES,块长128bits,密钥长度256bits。密码块模式为CBC。IV 是密文的第一个块。

异常消息是非法密钥大小。

这是我的解密()函数:

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;
}
Run Code Online (Sandbox Code Playgroud)

我有这些函数来做转换 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;
}
Run Code Online (Sandbox Code Playgroud)

也许你可以帮助我。非常感谢!

Pav*_*ral 5

您可能已达到Oracle JRE 中的密钥大小限制。从链接的文件:

如果需要更强的算法(例如,具有 256 位密钥的 AES),则必须获取JCE Unlimited Strength Jurisdiction Policy Files并将其安装在 JDK/JRE 中。

用户有责任确认当地法规允许此操作。