如何在非对称加密(libsodium)中使用nonce?

joa*_*imb 7 encryption encryption-asymmetric nonce libsodium

我正在编写一个应用程序,用户可以通过端到端加密在设备之间进行通信.为此,我使用libsodium加密库.非对称加密函数crypto_box(...)需要一个nonce作为参数之一.

我对如何处理nonce有点困惑.是否需要使用不同的nonce加密每个人的消息?这似乎不正确,因为我必须将使用过的nonces存储在具有公共访问权限的服务器上,攻击者可以再次使用其中一个使用过的nonce.

从A到B发送的所有消息都具有不同的nonce或者nonce用于从A发送到B的消息是否足以用于从C发送到B?

有人可以向我解释一下.

Fra*_*nis 6

使用给定共享密钥发送的每条消息都需要唯一的随机数。nonce 不必是秘密的;一个简单的计数器完全没问题;即使相同的消息发送两次,更改 nonce 中的单个位也会使密文看起来完全不同。

什么是共享秘密?它是根据(A 的私钥,B 的公钥)或(A 的公钥,B 的私钥)计算得出的密钥。A 和 B 根据他们拥有的内容执行不同的计算,但最终得到相同的共享秘密。

中使用的共享秘密 crypto_box长度为 256 位。这是巨大的。您可以放心地认为,每个“对话”的共享秘密都是独一无二的。

因此,(A, B)、(A, C) 和 (C, B) 可以使用相同的随机数安全地交换消息。但是如果 A 使用给定的随机数向 B 发送消息,则 B 不能使用相同的随机数向 A 发送消息。对于 A 和 B 之间的对话期间交换的所有内容,随机数必须是唯一的。

所以,一个简单的计数器就可以了。让 A 选择偶数,将奇数留给 B,在每条消息发送后将随机数增加 2,您就可以开始了。

但是密码中使用的 crypto_box构造中实际上有一个非常大的随机数。192 位。

这意味着,如果你忽略我写的所有内容,每次发送消息时只选择一个随机数,发生冲突的可能性很小,你可以放心,它在实践中永远不会发生。

钠(AES128-CTR、ChaCha20、Salsa20)中包含的一些流密码具有较短的随机数,并且需要计数器以避免冲突。这就是为什么它们位于文档的“高级”部分。

但是使用crypto_boxand crypto_secretbox,每次只选择一个随机数 ( randombytes_buf(nonce, sizeof nonce)) 就安全了。


Jay*_*van 5

是否需要使用不同的nonce加密每个人的消息?

是.事实上,从来没有,以往任何时候都使用相同的随机数多于一个相同的私钥.确实,您必须跟踪nonce才能完成此任务.

这似乎不正确,因为我必须将使用过的nonces存储在具有公共访问权限的服务器上,攻击者可以再次使用其中一个使用过的nonce.

为什么要将你的随机数存储在具有公共访问权限的服务器上?您如何看待攻击者可以"使用"这些随机数?他们需要你的私钥才能这样做.

为什么不能将nonce存储在与私钥相同的位置?

  • 如果A向B发送加密消息.B是否必须使用相同的随机数(用于通过A加密消息)来解密消息?或者它生成一个新的nonce来解密消息.我知道加密和解密需要彼此公钥.我想弄清楚的是,是否需要在A和B之间交换现时用于en/decry除公钥以外的数据. (5认同)