【问题标题】:Questions about the NaCL crypto library关于 NaCL 加密库的问题
【发布时间】:2012-11-19 18:13:08
【问题描述】:
我正在寻找实现加密系统的库,并且对使用 NaCl: Networking and Cryptography 库特别是 box function 很感兴趣。显然,它使用对称加密 XSalsa20,Curve25519 用于公私加密,Poly1305 用于身份验证作为其原语。
但是,文档的使用方式似乎不够充分。例如,它提到要计算密钥,它使用发送者的私钥和接收者的公钥来计算密钥。但它没有解释如何。有人能解释一下吗?
如果我要使用相同的公钥和私钥,我不会在下一次尝试时生成相同的密钥,这将是灾难性的。有谁知道它背后的解释,或者给我提供更多关于函数如何工作而不是如何使用函数的文档?
【问题讨论】:
标签:
encryption
cryptography
encryption-symmetric
encryption-asymmetric
nacl-cryptography
【解决方案1】:
例如,它提到要计算密钥,它使用发送者的
私钥和接收者的公钥来计算密钥。
但它没有解释如何。有人能解释一下吗?
有一个很好的、易于理解的视频,但使用德语: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 都计算出了相同的密钥。 p>
【解决方案2】:
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 字节的 nonce 和一个 32 字节的密钥。它是一种经过身份验证的流密码,使用 XSalsa20 进行加密,使用 Poly1305 作为 MAC。 XSalsa20输出的前32字节用于MAC,其余的xored到明文加密。
如果多次使用会怎样?
如果你取两个固定的密钥对,那么密钥交换的结果总是一样的。
但对称部分secret_box 是安全的,即使您多次使用一个密钥,只要您从不为该密钥重复使用随机数,即(密钥,随机数)对必须是唯一的。
对于所有现代经过身份验证的流密码(例如 AES-GCM 或 XSalsa20-Poly1305)而言,此属性几乎相同。
创建唯一随机数的常用方法有:
- 使用 8 字节前缀和随机 16 字节值(无状态,随机 16 字节很可能是唯一的)
- 使用 16 字节前缀和 8 字节计数器(有状态的,在为每个数据包递增的连接中很有用)