gpt4 book ai didi

encryption - 如何在非对称加密(libsodium)中使用随机数?

转载 作者:行者123 更新时间:2023-12-04 10:50:59 46 4
gpt4 key购买 nike

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

我对如何处理随机数有点困惑。发给一个人的每条消息都需要使用不同的随机数加密吗?这似乎不正确,因为我必须将使用过的随机数存储在具有公共(public)访问权限的服务器上,攻击者可以再次使用其中一个使用过的随机数。

从 A 发送到 B 的所有消息都具有不同的 nonce 就足够了吗?

有人可以向我解释一下吗。

最佳答案

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

什么是共享 secret ?它是根据(A 的 key ,B 的公钥)或(A 的公钥,B 的 key )计算得出的 key 。 A 和 B 根据他们拥有的内容执行不同的计算,但最终得到相同的共享 key 。
crypto_box 中使用的共享 secret 长度为 256 位。这是巨大的。您可以放心地认为,每个“对话”的共享 secret 都是独一无二的。

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

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

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

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

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

但与 crypto_boxcrypto_secretbox ,每次只选择一个随机数(randombytes_buf(nonce, sizeof nonce)),你就安全了。

关于encryption - 如何在非对称加密(libsodium)中使用随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24191544/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com