我正在使用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
的实际长度不正确?
答案 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的模数大小。
注意:
Provider#getName()
(以及可能返回有关提供者有用信息的其他获取方法),而不是班级名称。类名称是实现的详细信息,并且实际上可能会更改-即使提供程序名称没有更改。