PBEWithMD5AndTripleDES的密钥大小是多少?

时间:2012-02-24 14:39:35

标签: java encryption cryptography

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

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

2 个答案:

答案 0 :(得分:12)

PBEWith< Hash> AndTripleDES需要“无限制力量”政策

此算法使用168位密钥(尽管由于漏洞,它的有效强度为112位)。要使用该长度的对称密钥,您需要在Java运行时中安装"unlimited strength jurisdiction policy"

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

不要使用PBEWith< Hash> AndTripleDES

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

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

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

使用PBKDF2而不是

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

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

TDEA键控选项

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

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

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

答案 1 :(得分:2)

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

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

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

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