java - 迪菲·赫尔曼 至 AES

标签 java encryption cryptography diffie-hellman

我正在尝试创建一个可以使用加密数据从客户端向服务器发送数据的应用程序。我已经用 Java 设置了基本的 Diffie Hellman key 交换,我只是想知道如何将其转换为 AES-128 key 。以下是我的 key 交换产生的数字: 电话:4573933405280121148638398211571439564285952361546943120309506329340820508585065573754040898302752368221937348493581573782 66964833470586440402143656016984515685636547468440107473389838711366443865576311856400429127497891070073230731697132145328437 85763128771045651074137977867781277726926260077346003 克数:405 生成 key :362484416103160463739407231504395739366454563120320280643652403455916322924563853364183958412573595944235128879125695518 47749513145040862559588574541468845827085159018247962009639778000068069176753753861222140233559881791396088762185913485540314 156993368037042615619321223426679365899278177180176354 p 和生成的 key 都是 299 个字符长。我尝试自己解决这个问题,并阅读了有关使用 SHA-256 对生成的 key 进行哈希处理的内容,这就是结果: SHA-256:4631d862806f2c22ae28959a8ffb441789ab306468d6bf04d87435dd81890519 然而,我不知道如何将其中任何一个转换为 16 字节(128 位) key 。例如 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}。我需要取结果的前 16 个数字吗?

任何帮助或信息都会很棒,我将非常感激。如果需要更多信息,请询问我。

最佳答案

您需要的是 key derivation function ,它将把任何包含足够随机性的位串(例如 Diffie–Hellman 共享 secret )作为输入,并将其“加扰”以产生一个或多个固定长度的均匀随机位串,例如合适的位串。用作 AES键。

您可以使用许多标准化的 KDF,但如果您想要具体的推荐,我更喜欢 HKDF (RFC 5869)。 它是一种“提取并扩展”类型的 KDF,这意味着它首先将输入字符串处理为内部主 key 字符串(在规范中称为“PRK”),然后可以使用该主 key 字符串导出任意金额关键 Material 。

HKDF 是一种通用的高级结构,可以使用任何安全的 cryptographic hash function 进行实例化。如SHA-2 ,因此,即使您的加密库不提供内置的 HKDF 实现,您自己编写一个也不难。 RFC 中的规范写得很好并且可读,我强烈建议您花几分钟阅读它。

与大多数 KDF 一样,HKDF 的扩展步骤采用可选的“info”字符串,该字符串用于调整 key 派生过程,以便可以重用相同的输入字符串(或 PRK)来派生多个(有效)独立的 key 键,只要每个键使用不同的“info”字符串即可。 (提取阶段用于从输入字符串中导出 PRK,也采用具有类似效果的“salt”参数。)

有人认为 HKDF 没有做的是 key stretching ,如果输入的是用户选择的密码,这很有用(有些人会说必不可少)。如果您需要的话,您可以使用例如PBKDF2scrypt反而。 (也可以用 PBKDF2 替换 HKDF 的提取阶段,并按原样使用扩展阶段;事实上,这是我推荐的用于使用 PBKDF2 生成多个哈希 block 的 key Material 的方法。)幸运的是,对于 Diffie-Hellman,共享 secret 具有足够的熵,因此不需要 key 拉伸(stretch)。

关于java - 迪菲·赫尔曼 至 AES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23743932/

相关文章:

android - 如何使用 Android 版 Spongy CaSTLe 加密和解密文件

android - 内置加密 API 的不同操作系统

java - 在浏览器中使用Netty将短信与websocket绑定(bind)

java - 如何在JasperReports中获取列表的第一个元素?

java - 使用 HTTPS URL 从 java.net.URLConnection 返回什么?结果加密了吗?

c# - PasswordDeriveBytes 函数

java - Adler32 快速重复

java - 获取 ruby​​ 的 "RSA/ECB/OAEPWithSHA-256AndMGF1Padding"组合

java - 使用网格计算提高耗时程序的效率

java - Google App Engine 数据存储区中的赞成票和反对票设计