【问题标题】:How to use salsa20 counter nonce?如何使用 salsa20 计数器随机数?
【发布时间】:2016-04-29 11:05:26
【问题描述】:
  1. 我不确定我是否正确:消息计数器可以用作/代替随机数?

我的意思是这样的消息:

标题(2字节)|计数器(8bytes) |正文(n 字节加密) | HMAC-SHA1

计数器 = 1(63 位 = 0)可以吗?

  1. 我知道我不应该将同一个密钥与同一个 nonce 使用两次。 当一个新的连接开始并且计数器再次从 1 开始时,我该怎么办?

【问题讨论】:

  • WRT 2:使用新密钥。考虑使用插入的加密的长期秘密进行密钥交换。
  • @ThomasM.DuBuisson 我无法更改密码;我没有存储设备来保存新密钥。
  • 我没有建议使用不同的密码或将密钥存储在程序内存中以外的任何地方。也许您应该更详细地解释您的问题和/或咨询顾问。
  • 顺便说一句,HMAC-SHA128 应该是什么?您应该使用 SHA1 或 SHA256 的完整身份验证标签。
  • @Artjom B 是的,应该是应用HMAC和SHA128后产生的标签。

标签: encryption cryptography nonce


【解决方案1】:

我知道我不应该两次使用相同的密钥和相同的随机数。新连接启动后,计数器又从 1 开始了怎么办?

如果您重复使用具有相同密钥的随机数,this happens。您应该将用作随机数的计数器存储在客户端的某个位置,为您发送的每条消息递增它,然后在发送该消息之前将其写回存储。这很重要,因为如果您未能将其写回,但发送了消息,则下一条消息将使用相同的计数器。如果您无法将计数器写回,您真的不应该发送消息。

如果您无法在客户端存储类似计数器之类的东西,那么您可以随机生成随机数。 64位并没有为良好的抗碰撞提供太多空间。您应该期望在 232 条具有相同密钥的消息之后获得第一次随机数冲突。如果您的消息比这少得多,那么您可以简单地生成一个随机随机数并相当确定不会发生冲突。如果您想更加确定,请使用 XSalsa20,它使用 192 位 IV/nonce。

我不确定我是否正确:消息计数器可以用作/代替随机数?

Nonce 表示使用一次的次数。如果你总是增加计数器,那么你将总是有一个不同的数字,你使用一次。所以,是的,计数器可以用作随机数。

【讨论】:

  • 关于您对使用计数器作为随机数的评论,如果计数器存储在无符号 64 位中,即使每次递增,它最终也会回绕到 0 .. 那还会被认为是随机数?
  • @Jake 不,这不再是一个随机数了。在它环绕之前,您需要在某个时候使用新密钥。如果您不想联系需要接收这些消息的每个人,您可以添加一个密钥计数器,并且每次使用随机数环绕时,您将散列密钥以获得“新”密钥并设置nonce 为 0。然后,您可以使用存储在密文和 nonce 旁边的第二个计数器值来表示密钥的这种进步。
  • 我想我明白了...之前是HMAC (key, msg, nonce (counter)) .. 然后当计数器重置时,我们会做.. HMAC (hash(key), msg, nonce (reset to 0)) .. 还放一个关键计数器。所以基本上使用哈希链的概念作为新密钥。
  • 是的,完全正确。这将是完成这项任务的众多方法之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多