关于NaCL加密库的问题

时间:2012-12-01 20:47:26

标签: encryption cryptography encryption-symmetric encryption-asymmetric nacl-cryptography

我一直在寻找实施加密系统的库,并且有兴趣使用NaCl:网络和密码学库,特别是box function。显然,它使用对称加密XSalsa20,Curve25519用于公共私有密码术,Poly1305用于身份验证作为它的原语。

但是,文档的使用方式看起来不够充分。例如,它提到计算密钥时它使用发送者的私钥和接收者的公钥来计算密钥。但它没有解释如何。任何人都可以对此有所了解吗?

如果我使用相同的公钥和私钥,我将不会在下次尝试时生成相同的密钥,这将是灾难性的。有没有人知道它背后的解释,或者让我了解一些关于函数如何工作的文档,而不是如何使用函数?

2 个答案:

答案 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_afternmcrypto_secret_box相同。它需要一个24字节的随机数和一个32字节的密钥。它是经过身份验证的流密码,使用XSalsa20进行加密,使用Poly1305作为MAC。 XSalsa20输出的前32个字节用于MAC,其余为xor加入明文加密。

多次使用会怎样?

如果您使用两个固定密钥对,密钥交换的结果将始终相同。

但是,即使您多次使用密钥,对称部分secret_box也是安全的,只要您从不为该密钥重用nonce,即(key,nonce)对必须是唯一的。

对于所有现代经过身份验证的流密码,例如AES-GCM或XSalsa20-Poly1305,此属性几乎相同。

创建唯一nonce的常用方法是:

  • 使用8字节前缀和随机16字节值(无状态,随机16字节最可能是唯一的)
  • 使用16字节前缀和8字节计数器(有状态,在每个数据包递增的连接中很有用)

答案 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最终都计算了相同的密钥。