【问题标题】:How to use nonces in asymmetric encryption (libsodium)?如何在非对称加密(libsodium)中使用随机数?
【发布时间】:2014-08-03 04:48:02
【问题描述】:

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

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

从 A 发送到 B 的所有消息都具有不同的 nonce 就足够了吗?或者可以使用 nonce 从 A 发送消息到 B 不能用于从 C 发送到 B?

谁能给我解释一下。

【问题讨论】:

  • “nonce”实际上是“Number used ONCE”的缩写。所以是的,你使用不同的数字!

标签: encryption encryption-asymmetric nonce libsodium


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    发给一个人的每条消息都需要使用不同的随机数加密吗?

    是的。事实上,neverever 对同一个私钥使用多个相同的 nonce。确实,您必须跟踪 nonce 才能完成此操作。

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

    为什么必须将 nonce 存储在可公开访问的服务器上?您认为攻击者如何“使用”随机数?他们需要你的私钥才能这样做。

    为什么你不能将 nonce 和你的私钥存储在同一个地方?

    【讨论】:

    • 但是当 A 想向 B 发送加密消息时,A 使用 B:s PUBLIC 密钥对消息进行加密。这是我感到困惑的地方。因此,A 决定 nonce,而 B 无法控制使用哪个 nonce 来加密发送给 B 并随后使用 B:s 私钥解密的消息。我在这里错过了什么?
    • 找到这个链接:curvecp.org/nonces.html,上面写着:“在使用特定的随机数加密数据包后,决不能使用相同的随机数加密从发送方密钥到接收方密钥的另一个数据包。公钥,并且永远不能使用相同的随机数来加密从接收者的密钥到发送者的公钥的另一个数据包。”现在我明白了,只有在 A 和 B 之间,相同的 nonce 不能被使用两次。
    • 如果 A 向 B 发送加密消息,B 是否必须使用相同的 nonce(用于 A 加密消息)来解密消息?或者它会生成一个新的随机数来解密消息。我了解加密和解密需要彼此的公钥。我想弄清楚的是,是否需要在 A 和 B 之间交换 nonce 以对公钥以外的数据进行加密/解密。
    • @Feru 是的,nonce 不是秘密,它包含在密文有效负载中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多