密码安全的PRNG(伪随机数发生器)

时间:2015-06-23 11:32:27

标签: java algorithm random cryptography prng

生成加密安全PRNG的最佳和最快算法是什么?我的要求如下。

  • 在每次运行中,我需要生成数百万的长度为10的数字。
  • 它不应该允许通过观察一定数量的迭代来预测未来的迭代。
  • 数字应该是唯一的。不允许重复。
  • 速度也很重要,因为它会在每次迭代中产生数百万个数字。

我检查了Mersenne Twister算法,但似乎它不具有加密安全性。他们说,可以通过检查624次迭代来预测。

P.S。如果有Java实现会更好。

2 个答案:

答案 0 :(得分:1)

您的独特要求意味着您不能使用任何类型的RNG(我之前的评论错误),因为随机数字将包含重复。相反,使用密码并加密数字:0,1,2,3 ......这将提供有保证的唯一结果。由于密码是可逆的,每个密文都会解密回原始的明文,因此密文是明文的排列。

您还需要数字"长度为10"。我假设这意味着十位小数,[1,000,000,000 .. 9,999,999,999]。这意味着您需要一个在[0 .. 8,999,999,999]范围内工作的密码,只需将1e9添加到输出中。

那更复杂。可以使用Hasty Pudding cipher,可以为您想要的任何数字范围设置,也可以将自己的Feistel cipher滚动,并将其块大小设置为下一个更高的2的幂。如果数字超出范围然后重新加密它,直到它在范围内。 Feistel选项会更快,但不太安全。你可以通过增加轮数来使其更加安全,但代价是减速。

答案 1 :(得分:0)

使用线性反馈移位寄存器。该算法快速而安全。 基于度n的原始特征多项式构建寄存器。这将给出2 ^ n - 1个唯一数字的序列。之后序列将重复。不要种​​子为零。一些众所周知的流密码算法基于LFSR,因此您可以提取和调查实现。例如LILI-128(但其在C中的参考实现)