我一直在寻找实施加密系统的库,并且有兴趣使用NaCl:网络和密码学库,特别是box function。显然,它使用对称加密XSalsa20,Curve25519用于公共私有密码术,Poly1305用于身份验证作为它的原语。
但是,文档的使用方式看起来不够充分。例如,它提到计算密钥时它使用发送者的私钥和接收者的公钥来计算密钥。但它没有解释如何。任何人都可以对此有所了解吗?
如果我使用相同的公钥和私钥,我将不会在下次尝试时生成相同的密钥,这将是灾难性的。有没有人知道它背后的解释,或者让我了解一些关于函数如何工作的文档,而不是如何使用函数?
答案 0 :(得分:16)
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 = Hash(Curve25519(b,A))= Hash(Curve25519(a,B))
crypto_box_afternm
与crypto_secret_box
相同。它需要一个24字节的随机数和一个32字节的密钥。它是经过身份验证的流密码,使用XSalsa20进行加密,使用Poly1305作为MAC。 XSalsa20输出的前32个字节用于MAC,其余为xor
加入明文加密。
如果您使用两个固定密钥对,密钥交换的结果将始终相同。
但是,即使您多次使用密钥,对称部分secret_box
也是安全的,只要您从不为该密钥重用nonce,即(key,nonce)对必须是唯一的。
对于所有现代经过身份验证的流密码,例如AES-GCM或XSalsa20-Poly1305,此属性几乎相同。
创建唯一nonce的常用方法是:
答案 1 :(得分:1)
例如,它提到要计算使用发件人的密钥 私钥和接收者的公钥来计算密钥。 但它没有解释如何。任何人都可以对此有所了解吗?
有一个很好的,可以理解的视频,但用德语:https://www.youtube.com/watch?v=aC05R9xqbgE。该视频解释了“离散对数”和“椭圆曲线”解决方案。
在“椭圆曲线”场景中,公钥P是曲线上的点(具有x和y坐标)。 P是通过将生成器G(由曲线定义)与秘密密钥K相乘来计算的。为了计算秘密密钥S,只需将对等点P(对等方的公钥)与自己的密钥K相乘(a标量数字)。两个对等体都进行此操作:
S_Alice = P_Bob mult K_Alice = G mult K_Bob mult K_Alice
S_Bob = P_Alice mult K_Bob = G mult K_Alice mult K_Bob
由于曲线是可交换组,乘法的顺序无关紧要,因此从上面的计算可以看出,Bob和Alice最终都计算了相同的密钥。