java - PBEWithMD5AndTripleDES 的 key 大小是多少?

标签 java encryption cryptography

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

java.security.InvalidKeyException: 非法 key 大小

我在网上查了一下,发现 DES 使用 64 位 key ,而 TripleDES 使用 128 位 key 。我不清楚我的密码短语如何用于生成 key 的细节,也不知道去哪里看才能完全理解这一点。我的密码长度为 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);

最佳答案

PBEWithAndTripleDES 需要“无限强度”策略

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

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

不要使用 PBEWithAndTripleDES

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

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

同样奇怪的是,初始化 vector 是从密码推导出来的。 IV 的目的是在每次使用相同 key 加密给定明文时创建不同的密文。如果 IV 是从 key 生成的,那么这个目的就失败了。 PBES1 使用的 key 派生算法通过合并每次使用密码时应该不同的“盐”来避免这种情况。但是,搞砸这件事很容易;直接向密码初始化提供 IV 更为传统,并使正在发生的事情更加明显。

改用 PBKDF2

PKCS #5 还定义了一种称为 PBKDF2 的 key 派生算法,现在 Java 支持该算法。它提供了优于 PBES1 的安全性,因为初始化 vector 和密码所需的任何其他参数不是从密码中派生出来的,而是独立选择的。

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

TDEA 键控选项

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

TDEA 实现接受的 key 大小取决于提供者;有些要求您形成 192 位 key ,即使您使用的是 56 位 key 选项,它实际上是 DES 而不是 TDEA。大多数实现将采用 16 或 24 字节作为 key 。

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

关于java - PBEWithMD5AndTripleDES 的 key 大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9432518/

相关文章:

java - Eclipse JDT ASTParser - MethodVisitor 问题

Vb.net 到 golang AES

java - 添加 PDF 撤销信息作为签名属性 pdfRevocationInfoArchival OID 1.2.840.113583.1.1.8

authentication - 使用 openSSL 验证我的自签名证书

java - 无法正确实现 sleep()

java - ADT 和集合有什么区别?

javascript - 通过 crypto-js 的 base64 编码器

php加密的ssl session 数据

c++密码处理安全实践?

java - 通过单击按钮关闭模式窗口