joa*_*imb 7 encryption encryption-asymmetric nonce libsodium
我正在编写一个应用程序,用户可以通过端到端加密在设备之间进行通信.为此,我使用libsodium加密库.非对称加密函数crypto_box(...)需要一个nonce作为参数之一.
我对如何处理nonce有点困惑.是否需要使用不同的nonce加密每个人的消息?这似乎不正确,因为我必须将使用过的nonces存储在具有公共访问权限的服务器上,攻击者可以再次使用其中一个使用过的nonce.
从A到B发送的所有消息都具有不同的nonce或者nonce用于从A发送到B的消息是否足以用于从C发送到B?
有人可以向我解释一下.
使用给定共享密钥发送的每条消息都需要唯一的随机数。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)) 就安全了。
是否需要使用不同的nonce加密每个人的消息?
是.事实上,从来没有,以往任何时候都使用相同的随机数多于一个相同的私钥.确实,您必须跟踪nonce才能完成此任务.
这似乎不正确,因为我必须将使用过的nonces存储在具有公共访问权限的服务器上,攻击者可以再次使用其中一个使用过的nonce.
为什么要将你的随机数存储在具有公共访问权限的服务器上?您如何看待攻击者可以"使用"这些随机数?他们需要你的私钥才能这样做.
为什么不能将nonce存储在与私钥相同的位置?