PBEWithMD5AndTripleDES的密钥大小是多少?

我试图用现有代码中的PBEWithMD5AndTripleDES替换PBEWithMD5AndDES。 到目前为止,我使用的是我之前使用的相同密码,并收到此exception:

java.security.InvalidKeyException:非法密钥大小

我在网上查看,看到DES使用64位密钥,而TripleDES使用128位密钥。 我不清楚我的密码短语如何用于生成密钥的细节,并且不确定在哪里完全理解这一点。 我的密码长度为260个字符。 我尝试加倍长度,但我得到了同样的例外。

我从我的密码生成一个PBEKeySpec,有一个8字节的盐和12的迭代次数。我看到有另一个构造函数接受了一个keyLength参数,但文档将其描述为“要派生”,而我不是明白。 我有一个想法,我需要修改迭代计数和/或提供一个keyLength参数,但我不想盲目地这样做而不完全理解我在做什么。

以下是我目前使用的代码的基本概要:

String passphrase = ... byte[] salt = ... int iterationCount = 12; String algorithm = "PBEWithMD5AndTripleDES"; KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount); SecretKey key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec); Cipher cipher = Cipher.getInstance(key.getAlgorithm()); AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount); cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); byte[] encoded = cipher.doFinal(data); 

PBEWith AndTripleDES需要“无限强度”政策

该算法使用168位密钥(尽管由于漏洞,它具有112位的有效强度)。 要使用该长度的对称密钥,需要在Java运行时中安装“无限强度权限策略” 。

非法密钥大小”消息表示策略不允许密钥长度; 如果算法的密钥长度不正确,SunJCE提供程序将使用“ 错误的密钥大小”消息。

不要使用PBEWith AndTripleDES

请注意,“PBEWithMD5AndTripleDES”是一种不好的算法。

基于密码的加密通常遵循PKCS#5。 它定义了称为PBES1的DES(或RC2)的加密方案。 由于PBES1旨在生成64位(或更少)密钥,因此Oracle创建了一个专有扩展来生成更长的密钥。 它没有像PKCS#5那样受到同样的审查,如果你需要与任何其他平台进行互操作,你必须深入研究源代码 ,找出密钥和初始化向量是如何导出的。 。

初始化向量是从密码派生的,这也很奇怪。 IV的目的是每次使用相同的密钥加密给定的纯文本时创建不同的密文。 如果从密钥生成IV,则该目的被否定。 PBES1使用的密钥导出算法通过结合每次使用密码时应该是不同的“盐”来避免这种情况。 但是,这可能很容易搞砸了; 直接向密码初始化提供IV是更传统的,并且使得发生的事情变得更加明显。

请改用PBKDF2

PKCS#5还定义了一个名为PBKDF2的密钥派生算法,现在Java支持该算法。 它为PBES1提供了卓越的安全性,因为初始化向量和密码所需的任何其他参数不是从密码派生的,而是独立选择的。

以下是使用AES的PBKDF2的示例 。 如果您不能按照建议更新为AES,则可以通过使用密钥长度192并将出现次数“AES”更改为“DESede”将该示例应用于DESede。

TDEA键控选项

有三种键控选项可以与TDEA一起使用(“Triple DES”或“DESede”)。 它们采用64位,128位或192位密钥(包括奇偶校验位),具体取决于选项。

TDEA实施所接受的密钥大小取决于提供商; 即使您使用的是有效DES而不是TDEA的56位密钥选项,也有一些要求您形成192位密钥。 大多数实现将使用16或24个字节作为密钥。

只有三键选项(168位,或带奇偶校验的192位)才能被视为“强加密”。 它有112位的有效强度。

正如埃里克森所说,这个问题的“正确”答案是在JRE中安装无限强度管辖权政策文件。

这将使PBEWithMD5AndTripleDES加密“工作”,但据我所知,结果数据无法解密。 您将获得填充错误exception。 可能有一些方法可以解决它,但这足以certificate我追求这条路线并不值得,因为它似乎是一条没有足够的路可以解决错误或推广工作实例。

我还发现了一个PBEWithSHA1AndTripleDES并尝试了它,但在解密时得到了相同的填充错误。

我能够将我们的要求从PBEWithMD5AndTripleDES改为TripleDES(DESede),这为我解决了整个问题!