java - 加密安全 PRNG(伪随机数生成器)

标签 java algorithm random cryptography prng

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

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

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

附言如果有Java实现就更好了。

最佳答案

您的独特要求意味着您不能使用任何类型的 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其 block 大小设置为 2 的下一个更高次方。如果数字超出范围,则重新加密直到它在范围内。 Feistel 选项会更快,但安全性较低。您可以通过以降低速度为代价增加轮数来使其更安全。

关于java - 加密安全 PRNG(伪随机数生成器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31001626/

相关文章:

java - 如何在redhat中安装maven 2.2.1?

java - 当我更改窗口大小时,我的动画球不会在中间交叉

c# - 算法:分析网页的标签

加载 View 时 ImageView 中的 IOS 随机图像

Java随机种子

java - 从 C 获取结构体(通过引用)

java - 如何在 Java 11 上使用 Web 服务?包 javax.jws 不存在

c++ - 查找最大数量的硬币和选定的硬币

algorithm - 函数的复杂度是多少 f(n) = f(n-1)+f(n-2)+f(n-3)+...+1

algorithm - O(1) 中的唯一(非重复)随机数?