Eri*_*rop 5 java encryption blowfish diffie-hellman
我在Java中使用RFC 3526中的一些大型组实现了Diffie-Hellman密钥交换.我的输出是一个相当大的字节数组.使用河豚键的输出的前448位(56字节)是否安全?我应该以任何方式转换字节,还是选择密钥的任何特定字节?
从理论上来说,不,它不安全。并不是说我可以查明真正的攻击;但 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中的那个。或者可能从规范中重新实现它(这并不难):FIPS 180-3(PDF 文件)。
如果您的密钥需要超过 128 位,那么这意味着您是 2050 年左右的时间旅行者;假设您使用适当的对称加密方案,128 位(远远)足以暂时保护您。
说到这里:河豚已经不再推荐了。它有 64 位块,这意味着当加密数据长度达到几 GB 时就会出现问题,而现在这个大小已经不算大了。您最好使用 128 位分组密码,例如AES。此外,在任何严格的对称加密系统中,您都需要密钥完整性检查。这可以通过 MAC(消息身份验证代码)(例如HMAC )来完成,它本身是基于哈希函数构建的(话又说回来,很容易实现,并且 sphlib 中有一个 Java 实现)。或者,更好的是,在组合加密/MAC 模式下使用 AES,这将为您处理棘手的细节(因为正确使用分组密码并不容易);查找CWC和GCM(两者均无专利;后者已获得NIST批准)。
| 归档时间: |
|
| 查看次数: |
2218 次 |
| 最近记录: |