为什么从Java DES KeyGenerator生成的密钥的大小不正确?

时间:2018-09-28 19:38:12

标签: java cryptography jce key-generator

我正在使用Java的SunJCE提供程序来生成7位密钥:

isStopped

运行上述程序时,出现错误,表明 KeyGenerator v = KeyGenerator.getInstance("DES") Provider p = v.getProvider assert(p.getClass().getSimpleName() == "SunJCE") v.init(56) Key k = v.generateKey() assert(k.getEncoded().getLength == 7) 的长度实际上是8(64位)而不是56位,奇怪的是k已初始化只能生成56位密钥,为什么KeyGenerator的实际长度不正确?

1 个答案:

答案 0 :(得分:2)

DES密钥每7位使用8位编码,其中每个字节的最低有效位用于使位数为奇数。因此,如果前7位将6、4或2位设置为1,则将最低有效位设置为1。否则它会被重置/未设置/保留为零。因此,将56位DES密钥编码为64位/ 8字节,将用于三重DES的112位2密钥编码为128位,并使用192位编码168位DES密钥。

可以将奇偶校验位用作某种检查,以查看DES密钥是否未更改(尽管这也不是很有效)。如今,大多数DES实现都将完全忽略奇偶校验位,但是Java KeyGenerator仍会正确设置它们。您可以通过对结果密钥中的每个字节Integer.bitCount(b & 0xFF) % 2 == 1验证b来进行测试:它应该始终返回true


更多现代对称密码尝试使用完全(伪)随机密钥; 256位AES或HMAC密钥仅由随机字节组成。

对于大多数不对称密码而言并非如此;对大多数非对称密码的公钥或私钥进行编码将比密钥大小产生更多的比特。非对称密码的密钥大小通常是确定密钥强度的参数的大小,例如RSA的模数大小。


注意:

  • DES的密钥大小(和强度)只有56位,并且被认为是完全损坏的:使用128位或更多位的密钥(如果您注意的话,还应排除两键112位三重DES密钥)和现代密码(例如AES)。
  • 您的断言测试的东西应该始终是真实的,而对我来说却毫无意义。如果需要测试,则使用随机数生成器来生成密钥(不幸的是,这些密钥很难测试)。
  • 在测试提供者名称时-如果您问我这是一种危险且不可移植的做法-那么您至少应使用Provider#getName()(以及可能返回有关提供者有用信息的其他获取方法),而不是班级名称。类名称是实现的详细信息,并且实际上可能会更改-即使提供程序名称没有更改。