7

我正在寻找实现加密系统的库,并且对使用 NaCl: Networking and Cryptography 库特别是box 函数很感兴趣。显然,它使用对称加密 XSalsa20、Curve25519 用于公私加密,Poly1305 用于身份验证作为其原语。

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

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

4

2 回答 2

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 = 哈希(曲线 25519(b,A))= 哈希(曲线 25519(a,B))

  • crypto_box_afternm与 相同crypto_secret_box。它需要一个 24 字节的 nonce 和一个 32 字节的密钥。它是一种经过身份验证的流密码,使用 XSalsa20 进行加密,使用 Poly1305 作为 MAC。XSalsa20 输出的前 32 个字节用于 MAC,其余字节被xor编入明文进行加密。

如果你多次使用它会发生什么?

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

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

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

创建唯一随机数的常用方法是:

  • 使用 8 字节前缀和随机 16 字节值(无状态,随机 16 字节很可能是唯一的)
  • 使用 16 字节前缀和 8 字节计数器(有状态,在为每个数据包递增的连接中很有用)
于 2012-12-01T21:30:54.390 回答
1

例如,它提到要计算密钥,它使用发送者的私钥和接收者的公钥来计算密钥。但它没有解释如何。任何人都可以阐明它吗?

有一个很好的、可以理解的视频,但用的是德语:https ://www.youtube.com/watch?v=aC05R9xqbg ​​E。该视频解释了“离散对数”和“椭圆曲线”解决方案。

在“椭圆曲线”场景中,公钥 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 都计算出了相同的密钥。

于 2016-02-03T15:55:17.357 回答