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

问题描述 投票:0回答:1

[据我了解,像RNGCryptoServiceProvider的CSRNG仍通过PRNG传递真正的随机用户数据(如鼠标移动等)来清理输出并使其平均分配。这些位需要完全独立。

((这是针对理论上无限的计算能力的攻击者)如果CSRNG接收1KB真正的随机数据并将其扩展为1MB,则攻击者所需要做的就是生成1KB数据的每种组合,然后对其进行扩展,然后查看哪1MB数据生成一次返回有意义的英语输出的便笺簿。我在某处读到,如果一次性垫板在RNG中的任何地方都具有PRNG,则它只是一种美化的流密码。我想知道真正随机的起始数据是否足够大,可以使用而不是加密扩展。我需要一次性的真正随机输出,而不仅仅是加密安全的RNG。或者,也许还有其他方法可以以某种方式获取真正的随机数据,从而使所有位彼此独立。我在想用鼠标坐标进行XOR运算几秒钟,然后可能是Environment.TickCount的最后一位,然后可能是将麦克风输入(1234)设置为好。但是,正如有人在stackoverflow上指出的那样,我真的应该只让OS处理所有事情。不幸的是,这不可能,因为使用了PSRNG。我想避免使用硬件解决方案,因为这意味着它是一个易于使用的程序,并且也不使用RDRAND,因为它还使用了PRNG(除非RDRAND可以在通过PRNG之前返回真正的随机数据?) 。如果有这种可能的话,将不胜感激。我一直在进行数周的研究,以为RNGCryptoServiceProvider足以满足一个时间要求。谢谢。

(附带说明:对于大多数加密函数,您不需要真正的熵,只需具有不可预测性即可。对于一次性垫板,它必须是随机的,否则不是一次性垫板。)

random cryptography entropy
1个回答
0
投票

通常,获取“真正随机数据”的唯一方法是从nondeterministic sources收集难以猜测的位,然后将这些位压缩为一个随机数据块。

获取“真正随机的数据”涉及很多问题,包括以下内容:

  1. 源必须是不确定的,也就是说,其输出不能由其输入确定。非确定性来源的示例包括输入设备的计时;热噪声;以及麦克风和摄像头输出记录的噪音。
  2. 源的输出必须很难猜测。这更正式地称为,例如每32位输出中有64位熵。但是,测量熵并非易事。如果您需要1 MB(800万比特)的真正随机数据,则需要具有至少800万比特的熵的数据(实际上,取决于熵的源,熵的长度将是1 MB的许多倍),然后压缩以某种方式将数据转换为1 MB数据,同时保留该熵。源必须彼此独立。
  3. 应该有两个或多个独立来源。这是因为不可能仅从一个来源提取全部随机性(由于所谓的“ Pinkus证明”)。另一方面,从三个或更多独立来源中提取随机性是微不足道的。
© www.soinside.com 2019 - 2024. All rights reserved.