ski*_*ppy 7 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);
Run Code Online (Sandbox Code Playgroud)
eri*_*son 12
该算法使用168位密钥(尽管由于漏洞,它具有112位的有效强度).要使用该长度的对称密钥,需要在Java运行时中安装"无限强度权限策略".
" 非法密钥大小"消息表示策略不允许密钥长度; 如果算法的密钥长度不正确,SunJCE提供程序将使用" 错误的密钥大小" 消息.
请注意,"PBEWithMD5AndTripleDES"是一种不好的算法.
基于密码的加密通常遵循PKCS#5.它定义了称为PBES1的DES(或RC2)的加密方案.由于PBES1旨在生成64位(或更少)密钥,因此Oracle创建了一个专有扩展来生成更长的密钥.它没有像PKCS#5那样受到同样的审查,如果你需要与任何其他平台进行互操作,你必须深入研究源代码,找出密钥和初始化向量是如何导出的. .
初始化向量是从密码派生的,这也很奇怪.IV的目的是每次使用相同的密钥加密给定的纯文本时创建不同的密文.如果从密钥生成IV,则该目的被否定.PBES1使用的密钥导出算法通过合并每次使用密码时假设不同的"盐"来避免这种情况.但是,这可能很容易搞砸了; 直接向密码初始化提供IV是更常规的,并且使得发生的事情变得更加明显.
PKCS#5还定义了一个名为PBKDF2的密钥派生算法,Java现在支持该算法.它为PBES1提供了卓越的安全性,因为初始化向量和密码所需的任何其他参数不是从密码派生的,而是独立选择的.
这是使用AES的PBKDF2的示例.如果您不能按照建议更新为AES,则可以通过使用密钥长度192并将出现次数"AES"更改为"DESede"将该示例应用于DESede.
有三种键控选项可以与TDEA一起使用("Triple DES"或"DESede").它们采用64位,128位或192位密钥(包括奇偶校验位),具体取决于选项.
TDEA实施所接受的密钥大小取决于提供商; 即使您使用的是有效DES而不是TDEA的56位密钥选项,也有一些要求您形成192位密钥.大多数实现将使用16或24个字节作为密钥.
只有三键选项(168位,或带奇偶校验的192位)才能被视为"强加密".它有112位的有效强度.