好的,我猜这完全是主观的等等,但我在思考随机数生成器的熵来源。通常生成器使用当前时间作为种子,对吧?那么,我很好奇还有哪些其他的来源可以用来产生完全有效的随机(宽松定义)数字。
使用多个来源(例如时间+当前硬盘寻道时间[我们在这里进行幻想])一起创建的数字是否比单个来源的数字更“随机”?源数量的逻辑极限是什么?多少才足够?选取时间只是因为它方便吗?
如果这种提问不被允许,请原谅,但我很好奇这些来源背后的理论。
好的,我猜这完全是主观的等等,但我在思考随机数生成器的熵来源。通常生成器使用当前时间作为种子,对吧?那么,我很好奇还有哪些其他的来源可以用来产生完全有效的随机(宽松定义)数字。
使用多个来源(例如时间+当前硬盘寻道时间[我们在这里进行幻想])一起创建的数字是否比单个来源的数字更“随机”?源数量的逻辑极限是什么?多少才足够?选取时间只是因为它方便吗?
如果这种提问不被允许,请原谅,但我很好奇这些来源背后的理论。
我使用Random.ORG,它们提供来自大气噪声的免费随机数据,我用它来定期重新生成 Mersene-Twister RNG 的种子。这是一种没有硬件依赖性的最随机的方法。
我曾使用过一款加密程序,它利用用户的鼠标移动来生成随机数。唯一的问题是,该程序必须暂停并要求用户在几秒钟内随机移动鼠标才能正常工作,这可能并不总是实际可行的。
很抱歉我来晚了(这个讨论已经进行了3年半了?),但我对PRN生成和替代熵源产生了新的兴趣。Linux内核开发人员Rusty Russell最近在他的博客上讨论了替代熵源(而不是/dev/urandom
)。
但是,我对他的选择并不是很满意;网卡的MAC地址永远不会改变(虽然它与所有其他地址都不同),而PID似乎是一个可能样本量太小的选择。
我已经在我的Linux机器上尝试了Mersenne Twister,它使用以下算法进行种子生成。如果有人愿意并感兴趣,请提供任何评论/反馈:
/proc
文件数量 * 256位。对以下每个/proc
文件,计算SHA256摘要:
/proc/meminfo
/proc/self/maps
/proc/self/smaps
/proc/interrupts
/proc/diskstats
/proc/self/stat
将每个256位哈希值放置到(1)中创建的数组的各自区域内。
我很想听取任何人对此的反馈。欢迎批评。我会为自己使用上述/proc
文件进行辩护,因为它们不断变化(特别是/proc/self/*
文件),而TSC总是产生不同的值(纳秒[或更好]分辨率,如果我没记错的话)。我已经在这方面运行了Diehard tests(达到数百亿个比特),看起来表现良好。但这可能更多地证明了Mersenne Twister作为PRNG的可靠性,而不是我如何进行种子处理。
当然,这些并不是完全无法被黑客攻击的,但我只是不认为所有这些(以及SHA*)都会在我的有生之年被攻破和破解。