【问题标题】:How can Deterministic Pseudo Random Number Generator generate 64 byte hash from 32 byte seed using SHA-256 hashing function?确定性伪随机数生成器如何使用 SHA-256 散列函数从 32 字节种子生成 64 字节散列?
【发布时间】:2022-02-21 00:24:47
【问题描述】:

SHA-256 散列函数始终输出 32 字节散列。如何使用 32 字节种子和 SHA-256 哈希函数创建 64 字节哈希输出?

我听说他们使用这样的技术(伪代码):

init_hash = SHA256 (seed)
next_hash = SHA256 (init_hash + 1)
next_hash_vol2 = SHA256 (next_hash + 2)
next_hash_vol3 = SHA256 (next_hash_vol2 + 3)
...
next_hash_volA = SHA256 (next_hash_vol9 + A)
...
next_hash_vol10 = SHA256 (next_hash_volF + 10)
...
...
next_hash_vol64 = SHA256 (next_hash_vol63 + 40)

这听起来真不错!但问题是 SHA-256 总是生成 32 字节的输出,但我需要 64 字节:(

【问题讨论】:

  • 只需调用 SHA256 函数两次,对两次调用之间的种子进行一些小的更改,例如递增它。
  • @DavidSchwartz 你的意思是 next_hash = SHA256 (种子)。然后 next_hash + (concatenate) + SHA256 (next_hash + 1) ?

标签: random hash cryptography sha256 sha2


【解决方案1】:

如果你从一个 32 字节的种子和一个 32 字节的散列开始,无论你扩展多少,你最终都会得到 32 字节的熵。

鉴于此,您有很多选择,例如 @David Schwartz 建议的选择。这是伪代码中的另一个选项:

hash64(inputString)
  hash1 = SHA256(inputString)
  hash2 = SHA256(hash1)
  return concatenate(hash1, hash2)
end hash64

许多其他类似的选项也是可能的,例如:

hash64(inputString)
  gnirtStupni = reverse(inputString)
  hash1 = SHA256(inputString)
  hash2 = SHA256(gnirtStupni)
  return concatenate(hash1, hash2)
end hash64

本质上,两个独立的散列基于相同的输入,但经过调整,使得散列不相同。然后连接两个哈希。

【讨论】:

  • 感谢您的清晰解释!竖起大拇指!
猜你喜欢
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2014-05-21
相关资源
最近更新 更多