首先:我确实知道真正的随机数生成器应该有真正的随机输入,就像一些无法预测的东西。
现在,考虑一下:一个繁忙的邮件服务器每秒可以在 /var/log/maillog(Postfix)中生成数十行。假设我跟踪日志文件中的最后 500 行并计算 SHA512 消息摘要。这将为我提供 512 位(64 字节)的相当随机的数据。当然,假设我是唯一有权访问日志文件的人,并且没有人知道我在这样做。我可以每分钟这样做,每分钟获得 512 个相当随机的位。反过来,这可以用来加密一些秘密的东西。
真正的密码学家当然会说这很糟糕,我不应该这样做(相信我的生成器的随机性),但我仍然很好奇。在不访问服务器的情况下预测我的“随机”数据有多难?
当然,它不一定是日志文件。例如,它可以是以太网接口上的一个窃听器。繁忙的 10 Gig 路由器会产生大量数据。本身不是随机的,而是通过 SHA 消息摘要运行的,如果没有确切的输入,预测输出不是几乎不可能吗?
至于伪随机生成器,我认为它可以工作。但它会比已知的 PRNG 更好吗?
答案1
并且没有人知道我在做这件事。
这违背了 Kerckhoff 的原则。一般来说,我们假设对手知道正在使用的方案。毕竟,只需要一个受感染的人/系统就能证明这一点。
如果无法访问服务器,预测我的“随机”数据有多难?
相对容易,因为对手可能有方法通过攻击系统来插入自己的日志条目。
当然,它不一定是日志文件。例如,它可以是以太网接口上的一个分路器。繁忙的 10 Gig 路由器会产生大量数据。
此类数据通常已被系统的 RNG 使用。通常不使用路由器,因为依赖外部设备/服务很危险。
本身不是随机的,而是通过 SHA 消息摘要运行的,如果没有精确的输入,预测输出不是几乎不可能吗?
不可以。尽管不可能反转哈希函数,但加密哈希并不能阻止对手猜测输入。
通常,随机数生成器的种子生成过程已经对新输入执行了某种哈希处理。如果只是为了减少 I/O,自己先进行哈希处理仍然有意义。
至于伪随机生成器,我认为它可以工作。但它会比已知的 PRNG 更好吗?
你的方法需要太多的熵才能生成好的随机数。一个好的 PRNG 几乎可以在 128-256 位上永远运行完全随机熵。
您可以使用它来提炼(压缩)来自大输入的熵,然后您可以使用它向系统的随机数生成器添加额外的种子。
一般来说你不需要它;只需随机使用系统,它将使用更好的深思熟虑的方案来收集熵。