我在Java中实现了Diffie–Hellman key exchange,其中有一些大型组RFC 3526。我的输出是一个相当大的字节数组。 使用河豚键的输出的第一个448位(56字节)安全吗?我是否应该以任何方式转换字节,或者为键选取任何特定的字节?从Diffie-Hellman输出中选择一个加密密钥
回答
从理论的角度来看,不,它不安全。并不是我可以指出实际的攻击;但是Diffie-Hellman密钥交换的输出是由q元素组成的组中的一个元素,并且最多提供sqrt(q)安全性。截断该元素的编码部分看起来不是一个好主意...
“正确的”方法是使用单向密钥导出函数。简而言之,使用散列函数(如SHA-256)处理Diffie-Hellman输出,并使用散列结果作为关键字。关于Diffie-Hellman步骤,散列时间可以忽略不计。 Java已经包含了SHA-256和SHA-512的良好实现,并且如果你是在兼容非常古老的Java实现之后(例如随Internet Explorer 5.5提供的Microsoft JVM),那么你可以使用独立的SHA-2 Java实现如sphlib中的一个。或者可能从spec中重新实现(这并不难):FIPS 180-3 (a PDF file)。
如果你需要超过128位的密钥,那么这意味着你是2050年左右的时间旅行者;假设您使用适当的对称加密方案,128位(远远)足以保护您。
说起来:河豚不是真的推荐了。它有64位块,这意味着当加密的数据长度达到几千兆字节时会产生麻烦,现在的大小并不那么大。你最好使用128位块密码,如AES。而且,在任何严重的对称加密系统中,您都需要密钥完整性检查。这可以通过使用诸如HMAC之类的MAC(消息认证代码)来完成,其本身构建在散列函数之上(然后再次,易于实现,并且在sphlib中有Java实现)。或者,甚至更好的是,在组合的加密/ MAC模式下使用AES,这将为您处理棘手的细节(因为恰当地使用分组密码是而不是容易);查找CWC和GCM(两者均无专利权;后者已获NIST批准)。
您提出的解决方案取决于Diffie-Hellman交换的最重要的位是否是硬核。已知有一些小的结果表明最重要的位是不可预测的,但我不知道有足够强的文件表明您的方法是正确的。
但是,有几个关于从Diffie-Hellman密钥派生密钥的建议。 例如一个不错的论文是NIST SP 800-135。到目前为止,这只是一个草案,可以找到here。但是,它审查了一些现有的标准。当然,使用标准总是比你自己开发更可取。
尽管Thomas Pornin的建议看起来合理,但它仍然是一个临时解决方案。为了安全起见,你应该不要使用它。相反,我会使用已经分析过的东西(例如,TLS版本1.2中使用的密钥派生方案)。
- 1. 从密码导出加密密钥
- 2. 从jck密钥库中导出密钥
- 3. 加密输入的密钥
- 4. 输出减少一个密钥一起
- 5. 如何选择python-gnupg中的加密/解密密钥?
- 6. EFS加密密钥弹出
- 7. 从嵌套对象中选择密钥
- 8. 从选择器中删除密钥
- 9. 从加密钥匙从内存加密++
- 10. 如何从NSDictionary中选择一个随机密钥?
- 11. 从表中只选择一个行有相同的密钥值
- 12. 只用一个密钥在密钥中查找密钥名称?
- 13. 为什么从密钥中删除密钥,将密钥从另一个密码中删除?
- 14. 为什么解密的密钥与加密密钥不一样?
- 15. 从对象中筛选出一个密钥用于发送
- 16. 选择Guava Cache的密钥
- 17. 如何传输AES加密密钥?
- 18. 多个密钥的加密/解密
- 19. s3cmd与OpenPGP加密密钥 - 这是一个密码或密码?
- 20. CodeIgniter中的加密密钥
- 21. 从密码中导出加密/解密密钥时,哪种编码最常用?
- 22. 更改密钥输出
- 23. 用c中的单个密钥加密
- 24. Rijndael加密密钥
- 25. DES加密密钥
- 26. Mysql加密密钥
- 27. VIM:加密密钥
- 28. 加密AES密钥?
- 29. AES密钥,加密
- 30. 如何使用一个密钥加密多个密码?
非常丰富。我正在使用相当小包大小的UDP通信加密。从我读过的内容来看,Blowfish看起来媲美AES,但速度更快。我以前忽视了MAC,但现在我会仔细研究一下。 – 2010-10-07 00:40:17
对于与速度有关的任何事情,您都应该进行测量。与12年前的3DES相比,河豚被认为是快速的;但AES比3DES快得多。河豚也被称为有一个慢钥匙计划(改变一个新的钥匙是昂贵的)。从安全角度来看,AES要好得多,如果只是因为它被更多的密码学家仔细研究。 Blowfish设计师甚至制作了一个名为Twofish的新版本,该版本是成为AES的候选人(但是Rijndael被选中,并成为AES)。 – 2010-10-07 11:51:54
正确的方法是使用标准,而不是自己设计密码方案。 – Accipitridae 2010-10-13 08:57:55