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

我正在使用3DESC解密数据,但我得到以下exception

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没有这种恶作剧,而且更加安全。