我正在寻找实现加密系统的库,并对使用 NaCl:网络和密码学库特别是 box 函数 感兴趣。显然,它使用对称加密 XSalsa20、用于公私加密的 Curve25519 和用于身份验证的 Poly1305 作为其原语。
但是,文档在它们的使用方式方面似乎还不够。例如,它提到为了计算密钥,它使用发送者的私钥和接收者的公钥来计算秘密密钥。但它没有解释如何。谁能解释一下吗?
如果我使用相同的公钥和私钥,我不希望在下次尝试时生成相同的密钥,因为这将是灾难性的。有谁知道它背后的解释,或者给我提供一些关于函数如何工作而不是如何使用函数的更多文档?
crypto_box
如何运作?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。
创建唯一随机数的常见方法是:
例如,它提到要计算密钥,它使用发送者的 私钥和接收者的公钥来计算秘密密钥。 但它没有解释如何。谁能解释一下吗?
有一个很好看、易于理解的视频,但是是德语:https://www.youtube.com/watch?v=aC05R9xqbgE。该视频解释了“离散对数”和“椭圆曲线”解决方案。
在“椭圆曲线”场景中,公钥P是曲线上的一个点(具有x和y坐标)。 P 是通过生成器 G(由曲线定义)与秘密密钥 K 相乘来计算的。要计算秘密密钥 S,只需将对等点 P(对等点的公钥)与自己的秘密密钥 K(a标量)。双方都进行此操作:
S_Alice = P_Bob 乘数 K_Alice = G 乘数 K_Bob 乘数 K_Alice
S_Bob = P_Alice 乘数 K_Bob = G 乘数 K_Alice 乘数 K_Bob
由于曲线是一个交换群,乘法的顺序并不重要,所以从上面的计算可以看出,最终Bob和Alice计算出了相同的密钥。