我正在寻找实现加密系统的库,并对使用NaCl:网络和密码学库感兴趣,特别是box function。显然,它使用对称加密XSalsa20、用于公私加密的Curve25519和用于身份验证的Poly1305作为其原语。
然而,这些文档在使用方式上看起来是不够的。例如,它提到,为了计算密钥,它使用发送方的私钥和接收方的公钥来计算秘密密钥。但这并不能解释为什么。有没有人能解释一下呢?
如果我使用相同的公钥和私钥,我就不会在下一次尝试时生成相同的密钥,这将是灾难性的。有没有人知道它背后的解释,或者给我更多关于函数如何工作而不是如何使用函数的文档?
发布于 2012-12-02 05:30:54
crypto_box是如何工作的?
box在两个密钥上使用Diffie-Hellman密钥交换,并对结果进行哈希处理。然后它使用它作为secret_box的密钥。
crypto_box等价于crypto_box_beforenm,其次是散列密钥交换,其工作原理如Curve25519论文中所述,在Curve25519上使用椭圆曲线迪菲-赫尔曼密钥交换,使用HSalsa对结果进行散列。这会产生一个32字节的共享密钥。K=散列(Curve25519(b,A)) =散列(Curve25519(a,B))
crypto_box_afternm与crypto_secret_box相同。它需要一个24字节的nonce和一个32字节的密钥。它是一个经过身份验证的流密码,使用XSalsa20进行加密,使用Poly1305作为MAC。XSalsa20输出的前32个字节用于媒体访问控制,其余的被xor到明文中进行加密。如果您多次使用它,会发生什么?
如果您采用两个固定的密钥对,则密钥交换的结果将始终相同。
但是,对称部分密钥是安全的,即使您多次使用一个密钥,只要您从不为该密钥重用现时值,即( secret_box,现时值)对必须是唯一的。
这个属性对于所有现代的经过身份验证的流密码几乎都是一样的,比如AES-GCM或XSalsa20-Poly1305。
创建唯一随机数的常见方法是:
发布于 2016-02-03 23:55:17
例如,
提到,为了计算密钥,它使用发送方的私钥和接收方的公钥来计算秘密密钥。但这并不能解释为什么。有没有人能解释一下呢?
有一个不错的、容易理解的视频,但用的是德语:https://www.youtube.com/watch?v=aC05R9xqbgE。这个视频解释了“离散对数”和“椭圆曲线”的解决方案。
在“椭圆曲线”场景中,公钥P是曲线上的一个点(具有x和y坐标)。P是通过生成器G(由曲线定义)与秘密密钥K.To的乘积来计算的。计算秘密密钥S,只需将对等点P(对等点的公钥)与自己的秘密密钥K(标量数)相乘即可。两个对等体都执行此操作:
S_Alice = P_Bob多个K_Alice =G多个K_Bob多个K_Alice
S_Bob = P_Alice多个K_Bob =G多个K_Alice多个K_Bob
因为曲线是一个交换组,所以乘法的顺序并不重要,所以从上面的计算中可以看出,鲍勃和爱丽丝最终都计算了一个相同的密钥。
https://stackoverflow.com/questions/13663604
复制相似问题