如果我使用前5个十六进制字符,然后使用前5个忽略第一个字符,以此类推,重复删除第一个字符,每个数字都是一样随机吗?
我的意思示例是512位十六进制字符串。
26657320797d4f5b385d43274a246178263f3b686b645e375b45643442
是否从字符串的随机位置中选择的5个字符的任何部分保证是一个相当随机的数字?
我试图使一个简单的基于散列种子生成的随机数。
#1 楼
假设我对一个随机数生成器(带有随机数)的输出进行了哈希处理,那么生成的SHA256哈希数是否会与输入的数字一样随机?
假设您翻转了一个完美的公平的硬币。您将其翻转1024次以创建1024位的位字符串。
因为硬币是完全公平的,这意味着0和1的每个字符串都将以完全相同的概率出现。琴弦?好了,为了让SHA-512提供完全统一的512位输出,必须是这样的情况:如果我们对每个1024位字符串进行哈希处理,则每个512位哈希值必须精确显示为$ 2 ^ {512 } $次。
没有证据表明SHA-512的行为如此。如果事实真是如此,我将感到非常惊讶!
就这样,对真正随机流进行散列的输出是有偏见的流。这种偏见的确很小,但仍会存在。因此,对这个特定问题的答案是否定的。
实际上,偏差是如此之小,以至于没有关系。实际上,许多硬件RNG会对熵池进行哈希处理以产生输出字节。
但是,值得注意的是,使用这样的RNG作为生成一次性便签的基础实际上破坏了安全性证明!从技术上讲这是不安全的,但是利用它会很幸运。
#2 楼
SHA-256(以及任何加密安全的哈希算法)所产生的输出对于不知道输入的观察者来说,会像均匀一致的随机序列一样出现。很多随机数生成器,例如ANSI X9.31的RNG和NIST SP 800-90 Hash_DRBG使用SHA系列哈希函数,原因是难以将所得序列与随机序列区分开。
从字符串的随机位置中选择5个字符保证是一个相当随机的数字吗?
因此,答案是:任何连续的5个字符对于偶然的观察者来说都是随机出现的,可能性很大。 (此外,很可能会偶然出现诸如99999之类的序列,这些序列不会随机出现。)
但是,您实际上要寻找的好处是什么?
如果RNG很好,并且产生统一的随机数,则不需要SHA-256。
如果RNG能够产生熵但具有较大的偏差,则SHA-256是非常好的收集熵的良好功能。如果函数的输入包含至少256位的熵,则该函数的输出的每个输出位具有近1位的熵。在此过程中只会损失很少的熵。
使用SHA-256(如NIST SP 800-90中的Hash_DRBG之类的结构)可以在存在真正熵但收集速度较慢的情况下使用。一旦能够收集256位熵(为了安全起见,最好多加一点),就可以使用熵实例化Hash_DRBG / SHA-256,它将能够处理数十亿个随机数。
请记住这些不是很好的用法:
如果以太少的熵(甚至小于256位的输入)馈送SHA-256,则输出可能看起来随机,但不是。精明的对手可以滥用此功能。
OTP(有关详细信息,请阅读西蒙的答案)。
换句话说:如果您对哈希的输入简短或过于可预测,那么输出。
评论
$ \ begingroup $
我正在寻找的好处是从2个种子中随机生成数字的简单方法,对我来说,好处是2个种子进入并随机种子了。取十六进制哈希的前5个字符为随机数。
$ \ endgroup $
– John T
2014年1月10日21:35
$ \ begingroup $
为了合并随机输入,散列函数非常好:输出趋于接近源的组合(或散列的输出长度)。
$ \ endgroup $
–user4982
2014年1月10日在22:16
$ \ begingroup $
如果种子不是随机的,则输出也不会是随机的。如果种子总共不具有至少80位的熵,则输出将少于该数量。
$ \ endgroup $
–斯蒂芬·托瑟(Stephen Touset)
2014年1月11日,下午2:45
$ \ begingroup $
另外,根据应用程序,您可能需要考虑一方不诚实并使用固定值作为其种子的可能性(如果另一种子的熵少于80位,则减少总熵)。
$ \ endgroup $
–斯蒂芬·托瑟(Stephen Touset)
2014年1月11日下午4:34
$ \ begingroup $
“观察” ...对我而言这没有意义。为了清楚起见,我很想编辑您的开场白,但我真的不知道您在说什么。你能澄清一下吗?否则,很好的答案。
$ \ endgroup $
–疯狂
16年1月12日在8:16
评论
如果某些字符的“随机性”始终不如其他字符低,则表明哈希函数存在严重缺陷。当散列数据本身已经是随机的时,为什么还要提及随机数?如果要从生成器中获取许多数字,那不是计数器吗?