2015-06-23 71 views
0

生成加密安全PRNG的最佳和最快的算法是什么?我的要求如下。加密安全PRNG(伪随机数生成器)

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

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

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

+1

投反对票的人请解释原因。 –

+1

使用Java的'SecureRandom'。如果速度不够快,那么再问一遍。 – rossum

+0

伪随机数发生器将始终可预测,因为它们使用确定性方法来产生数字。这就是为什么他们是* pseudo * -random。 你显然在寻找的是一个[*真实*随机数发生器](https://en.wikipedia.org/wiki/Random_number_generation#.22True.22_random_numbers_vs._pseudo-random_numbers)。这些通常使用[硬件输入](https://en.wikipedia.org/wiki/Hardware_random_number_generator),从鼠标移动和视频输入到衰减放射性材料。 –

回答

1

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

你也想要数字“长度十”。我假设这意味着十位小数,[1,000,000,000 .. 9,999,999,999]。这意味着您需要一个在[0 .. 8,999,999,999]范围内工作的密码,并且只需将1e9添加到输出。

这比较复杂。您可以使用Hasty Pudding cipher,它可以设置为您想要的任意范围的数字,也可以将您自己的Feistel cipher设置为块大小设置为下一个更高的2的幂。如果数字超出范围,则重新对其加密,直到它为止在范围内。 Feistel选项会更快,但不太安全。你可以通过增加回合数来增加回合的安全性,但要以降低速度为代价。

+0

他们的关键字是[格式保留加密](https://en.wikipedia.org/wiki/Format-preserving_encryption),我会推荐[AES-FFX](http://csrc.nist.gov/groups/ST/工具/ BCM /文件/ proposedmodes/FFX/FFX-spec.pdf)。 –

0

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