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

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;
}

您使用的是不处理 128 位密钥长度的旧 Java 版本。原则上,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没有这些恶作剧,而且更安全。

最新更新