[据我了解,像RNGCryptoServiceProvider的CSRNG仍通过PRNG传递真正的随机用户数据(如鼠标移动等)来清理输出并使其平均分配。这些位需要完全独立。
((这是针对理论上无限的计算能力的攻击者)如果CSRNG接收1KB真正的随机数据并将其扩展为1MB,则攻击者所需要做的就是生成1KB数据的每种组合,然后对其进行扩展,然后查看哪1MB数据生成一次返回有意义的英语输出的便笺簿。我在某处读到,如果一次性垫板在RNG中的任何地方都具有PRNG,则它只是一种美化的流密码。我想知道真正随机的起始数据是否足够大,可以使用而不是加密扩展。我需要一次性的真正随机输出,而不仅仅是加密安全的RNG。或者,也许还有其他方法可以以某种方式获取真正的随机数据,从而使所有位彼此独立。我在想用鼠标坐标进行XOR运算几秒钟,然后可能是Environment.TickCount的最后一位,然后可能是将麦克风输入(1,2,3,4)设置为好。但是,正如有人在stackoverflow上指出的那样,我真的应该只让OS处理所有事情。不幸的是,这不可能,因为使用了PSRNG。我想避免使用硬件解决方案,因为这意味着它是一个易于使用的程序,并且也不使用RDRAND,因为它还使用了PRNG(除非RDRAND可以在通过PRNG之前返回真正的随机数据?) 。如果有这种可能的话,将不胜感激。我一直在进行数周的研究,以为RNGCryptoServiceProvider足以满足一个时间要求。谢谢。
(附带说明:对于大多数加密函数,您不需要真正的熵,只需具有不可预测性即可。对于一次性垫板,它必须是随机的,否则不是一次性垫板。)
通常,获取“真正随机数据”的唯一方法是从nondeterministic sources收集难以猜测的位,然后将这些位压缩为一个随机数据块。
获取“真正随机的数据”涉及很多问题,包括以下内容: