2014-06-12 72 views
4

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

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

从A发送到B的所有消息具有不同的随机数还是不能使用从A发送消息到B不能用于从C发送到B?

有人可以请解释给我。

+2

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

回答

3

是否需要使用不同的随机数来加密一个人的每条消息?

是的。实际上,从来没有,有史以来使用相同的随机数多于一个相同的私钥。确实,你将不得不跟踪nonce来完成这一点。

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

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

为什么你不能将随机数存储在与私钥相同的地方?

+0

但是,当A想要将加密的消息发送给B时,A使用B的PUBLIC密钥加密消息。这是我感到困惑的地方。因此,A决定了随机数,B不能控制使用哪一个随机数来加密发送给B的消息,然后用B的私钥解密。我在这里错过了什么? – joakimb

+0

找到这个链接:http://curvecp.org/nonces.html,它说:“在一个特定的nonce被用来加密一个数据包之后,永远不能使用相同的nonce来加密从发送者的密钥到这个数据包的另一个数据包接收方的公共密钥,并且不得使用相同的随机数来加密从接收方的密钥到发送方公钥的另一个数据包。“现在我明白了,只有在A和B之间,同一个随机数不能被使用两次。 – joakimb

+4

如果A向B发送加密消息,B是否必须使用相同的随机数(用于通过A加密消息)来解密消息?或者它生成一个新的随机数来解密消息。我明白加密和解密需要彼此的公钥。我试图弄清楚的是,如果需要在A和B之间交换非公开密钥以外的其他数据,必须交换随机数。 – Feru

2

对于使用给定共享密钥发送的每条消息,都需要唯一的随机数。随机数不一定是保密的;一个简单的柜台是完全正确的;即使发送两次相同的消息,改变随机数中的一位也会使密文看起来完全不同。

什么是共享秘密?它是从(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_boxcrypto_secretbox,只需每次随机选择一个随机数(randombytes_buf(nonce, sizeof nonce))即可安全使用。