我正在寻找实现加密系统的库,并对使用 NaCl:网络和密码学库特别感兴趣盒子功能 http://nacl.cr.yp.to/box.html。显然,它使用对称加密 XSalsa20、用于公私加密的 Curve25519 和用于身份验证的 Poly1305 作为其原语。
然而,该文档在它们的使用方式方面似乎还不够。例如,它提到为了计算密钥,它使用发送者的私钥和接收者的公钥来计算秘密密钥。但它没有解释如何。有人能解释一下吗?
如果我使用相同的公钥和私钥,我将不会在下次尝试时生成相同的密钥,这将是灾难性的。有谁知道其背后的解释,或者为我提供一些有关函数如何工作而不是如何使用函数的更多文档?
如何crypto_box
work?
box
在两个密钥上使用 Diffie-Hellman 密钥交换并对结果进行哈希处理。然后它使用它作为密钥secret_box
.
crypto_box
相当于crypto_box_beforenm
其次是crypto_box_afternm
.
-
crypto_box_beforenm
是哈希密钥交换,其工作原理如 Curve25519 论文中所述,在 Curve25519 上使用椭圆曲线 Diffie-Hellman 密钥交换,并使用 HSalsa 哈希结果。这会产生一个 32 字节的共享密钥。
k = 哈希(Curve25519(b, A)) = 哈希(Curve25519(a, B))
crypto_box_afternm
与crypto_secret_box
。它需要一个 24 字节的随机数和一个 32 字节的密钥。它是一种经过身份验证的流密码,使用 XSalsa20 进行加密,使用 Poly1305 作为 MAC。 XSalsa20输出的前32个字节用于MAC,其余的是xor
编入明文以对其进行加密。
如果多次使用会发生什么?
如果您采用两个固定密钥对,则密钥交换的结果将始终相同。
但对称部分secret_box
即使您多次使用某个密钥,只要您从不重复使用该密钥的随机数,即(密钥,随机数)对必须是唯一的,它也是安全的。
对于所有现代经过身份验证的流密码(例如 AES-GCM 或 XSalsa20-Poly1305),此属性几乎相同。
创建唯一随机数的常见方法是:
- 使用 8 字节前缀和随机 16 字节值(无状态,随机 16 字节很可能是唯一的)
- 使用 16 字节前缀和 8 字节计数器(有状态,在为每个数据包递增的连接中有用)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)