3DES解密错误密钥长度无效

时间:2013-12-30 08:18:07

标签: java encryption cryptography 3des

我正在使用3DESC来解密数据,但我得到了以下异常

java.security.InvalidKeyException: Invalid key length: 16 bytes

我的代码:

public static byte[] decrypt3DESCBC(byte[] keyBytes, byte[] ivBytes,
        byte[] dataBytes) {
    try {
        AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        SecretKeySpec newKey = new SecretKeySpec(keyBytes, "DESede");
        Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec); // Causes Exception
        return cipher.doFinal(dataBytes);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

打印上面使用的所有字节数组

keyBytes : FC15780BB4B0**********0876482C1B // Masked 10 Characters
ivBytes : 0000000000000000
dataBytes : AF53C90F7FAD977E**********69DB5A2BF3080F9F07F4BFEA3EDB4DE96887BE7D40A5A590C0911A // Masked 10 Characters

2 个答案:

答案 0 :(得分:8)

DES-EDE密码可以与3个不同的子密钥一起使用,因此密钥大小应该是24个字节(3个8字节)。如果你只想使用2个键(即在这种模式下,第一个键==最后一个键),那么你只需要复制键阵列的前8个字节。

byte[] key;
if (keyBytes.length == 16) {
    key = new byte[24];
    System.arraycopy(keyBytes, 0, key, 0, 16);
    System.arraycopy(keyBytes, 0, key, 16, 8);
} else {
    key = keyBytes;
}

答案 1 :(得分:3)

您使用的旧Java版本不能处理128位密钥长度。原则上,3DES总是使用三个键 - 键ABC - 当我们将奇偶校验位包含在计数中时,每个键为64位(对于单个DES用A加密,然后用B解密,然后用C再次加密)。但是,128位(双)密钥使用A = C.因此,要创建有效的24字节密钥,需要将前8个字节复制并连接到数组的尾部。或者您可以升级到更新的JRE,或使用可接受16字节3DES密钥的提供程序。

请注意,192位(168位有效)3DES密钥比128位(112位有效)位密钥更安全; NIST(处理美国政府的密码学标准化)不再接受128位3DES。如果可能,您应该尝试切换到AES; AES没有这种恶作剧,而且更加安全。