生成加密安全PRNG的最佳和最快算法是什么?我的要求如下。
我检查了Mersenne Twister算法,但似乎它不具有加密安全性。他们说,可以通过检查624次迭代来预测。
P.S。如果有Java实现会更好。
答案 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中的参考实现)