对于使用给定共享密钥发送的每条消息,都需要唯一的随机数。随机数不一定是保密的;一个简单的柜台是完全正确的;即使发送两次相同的消息,改变随机数中的一位也会使密文看起来完全不同。
什么是共享秘密?它是从(A的秘密密钥,B的公钥)或(A的公钥,B的秘密密钥)计算得出的密钥。 A和B根据他们的具体情况执行不同的计算,但最终得到相同的共享密钥。
crypto_box
中使用的共享机密长度为256位。这是巨大的。您可以放心地认为,共享秘密对每个“对话”都是独一无二的。因此,(A,B),(A,C)和(C,B)可以安全地使用相同的随机数交换消息。 但是,如果A使用给定的随机数向B发送消息,则B不能使用相同的随机数发送消息给A。在A和B之间的对话期间交换的所有东西都必须是唯一的。
所以,一个简单的计数器可以很好。有一个选择偶数,给B留下奇数,每发送一条消息后将现时数加2,你就可以走了。
但crypto_box
结构中使用的密码实际上有一个非常巨大的随机数。 192位。
这意味着,如果您忽略了我写的所有内容,并且每次发送消息时都会随机选择一个随机数,碰撞的可能性非常小,您可以放心,它在实践中永远不会发生。
钠(AES128-CTR,ChaCha20,Salsa20)中包含的一些流密码具有较短的随机数,并且需要计数器以避免碰撞。这就是为什么他们在文档的“高级”部分。
但是使用crypto_box
和crypto_secretbox
,只需每次随机选择一个随机数(randombytes_buf(nonce, sizeof nonce)
)即可安全使用。
“nonce”实际上是“Number used ONCE”的缩写。所以是的,你使用不同的数字! – OJFord