如何获得真正的随机数据,而不是像CSRNG那样将随机数据输入PRNG种子?



据我所知,像RNGCryptoServiceProvider这样的CSRNG仍然通过PRNG传递真正的随机用户数据,如鼠标移动等,以净化输出并使其均匀分布。位需要完全独立。

(这是针对理论上无限算力攻击者的( 如果 CSRNG 获取 1KB 的真正随机数据并将其扩展到 1MB,攻击者所要做的就是生成 1KB 数据的每个组合,对其进行扩展,然后查看哪 1MB 数据生成返回合理英语输出的一次性键盘。我在某处读到,如果一次性键盘在 RNG 的任何地方都有 PRNG,它只是一个美化的流密码。我想知道真正随机的起始数据是否足够大,可以只使用而不是加密扩展。我需要一次性键盘的真正随机输出,而不仅仅是加密安全的 RNG。或者,如果有其他方法可以以某种方式获得真正的随机数据,以便所有位彼此独立。我想了几秒钟与鼠标坐标进行异或运算,然后可能是环境的最后一位数字.TickCount,然后可能还会获得麦克风输入(1,2,3,4(。但是,正如一些人在stackoverflow上指出的那样,我真的应该让操作系统处理这一切。不幸的是,这是不可能的,因为使用了PSRNG。我想避免使用硬件解决方案,因为这是一个易于使用的程序,并且也不使用 RDRAND,因为它也使用 PRNG(除非 RDRAND 可以在通过 PRNG 之前返回真正的随机数据??如果这样的事情是可能的,将不胜感激任何回应;我已经为此工作了几个星期,给人的印象是RNGCryptoServiceProvider足以一次性使用。谢谢。

(旁注:有人说,对于大多数加密函数,你不需要真正的熵,只需要不可预测性。 对于一次性垫,它必须是随机的,否则它不是一次性垫。

如您所知,"真正随机"意味着每个位都独立于其他所有内容并且均匀分布。然而,这个理想在实践中即使不是不可能,也是很难实现的。一般来说,在实践中获得"真正随机数据"的最接近方法是从非确定性来源收集难以猜测的位,然后将这些位压缩成随机数据块。

要接近"真正的随机数据",涉及许多问题,包括以下内容:

  1. 源必须是不确定的,也就是说,它们的输出不能由它们的输入决定。非确定性源的示例包括输入设备的时序;热噪声;以及麦克风和摄像头输出记录的噪声。
  2. 源的输出一定很难猜测。这更正式地称为,例如每 64 位输出 32 位熵。然而,测量熵远非微不足道。如果您需要 1 MB(800 万位(的真正随机数据,则需要具有至少 800 万位熵的数据(实际上,根据来源的不同,熵的长度将超过 1 MB 的许多倍(,然后将数据以某种方式压缩为 1 MB 的数据,同时保留该熵。
  3. 源必须彼此独立。
  4. 应该有两个或多个独立来源。这是因为不可能只从一个来源中提取完全随机性(参见McInnes and Pinkas 1990(。另一方面,从三个或更多独立来源提取随机性相对微不足道,但仍存在选择合适的随机性提取器的问题,并且对随机性提取器的调查超出了本答案的范围。

通常,出于随机数生成目的,可用的源越多越好。

引用:

  • McInnes, J. L., & Pinkas, B. (1990, August(.关于使用弱随机密钥进行私钥加密的不可能性。密码学理论与应用会议(第421-435页(。

最新更新