【问题标题】:Is it possible to reverse a pseudo random number generator?是否可以反转伪随机数生成器?
【发布时间】:2022-01-29 05:09:05
【问题描述】:

是否可以反转伪随机数生成器? 例如,获取一组生成的数字并获取原始种子。 如果是这样,这将如何实施?

【问题讨论】:

  • 我认为总是有不止一个种子可以生成一个数字序列,无论长度是多少......你可能会找到一个种子,但应该不止一个......即使你找到了它也可能不正确,因为序列中的下一个数字是未知的
  • 假设得到下一个伪随机数的方程是可逆的。给定一个由公式生成的数字,然后您可以应用逆来获得先前的伪随机数。这是种子吗?你怎么知道的?如果你再次应用逆公式,那是种子吗?还是应该再应用逆向 12,842 次?

标签: random reverse random-seed


【解决方案1】:

这完全有可能——您只需要创建一个适合您目的的 PRNG。这完全取决于您需要完成什么 - 如果您更详细地描述您的情况,我很乐意提供更多建议。

对于一般背景,以下是一些用于反转线性同余生成器的资源: Reversible pseudo-random sequence generator

pseudo random distribution which guarantees all possible permutations of value sequence - C++

以下是一些用于反转梅森捻线器的方法: http://www.randombit.net/bitbashing/2009/07/21/inverting_mt19937_tempering.html http://b10l.com/reversing-the-mersenne-twister-rng-temper-function/

【讨论】:

    【解决方案2】:

    一般来说,不会。如果您拥有完整的数字数组,那么对于大多数生成器来说应该是可能。如果你没有所有的数字或不知道你有哪些数字(你有第 12 个还是第 300 个?),你根本无法弄清楚,因为你不知道在哪里停下来。

    您必须了解生成器的详细信息。解码线性同余生成器将不同于基于计数器的 PRNG,这将不同于梅森捻线器,而梅森捻线器将不同于斐波那契生成器。另外,您可能需要知道生成器的参数。如果您拥有所有这些并且生成数字的方程式是可逆的,那么这是可能的。至于如何,这真的取决于PRNG。

    【讨论】:

    • 如果您知道索引和几个字符,您是否仍然无法反转它们?
    • Ah: en.wikipedia.org/wiki/… "CSPRNG 要求分为两组:第一,它们通过统计随机性测试;第二,它们在严重攻击下仍能保持良好状态,即使它们的初始或运行的一部分状态可供攻击者使用。”
    【解决方案3】:

    使用the language Janus 一种时间可逆语言来进行可逆计算。

    您可能会做一些事情,例如创建一个执行此操作的程序(伪代码):

    x = seed
    x = my_Janus_prng(x)
    x = reversible_modulus_op(x, N) + offset
    

    Janus 能够为您提供一个程序,该程序采用输出数字和反转所有内容所需的任何其他数据,并为您提供以 x = seed 结尾的程序。

    我不知道有关 Janus 的所有详细信息,也不知道您是如何做到这一点的,但只是想我会提到它。

    显然,您想要做的可能是一个更好的主意,因为如果 RNG 不是单射函数,那么它应该映射回什么等等。

    所以你想编写一个输出数组的 Janus 程序。然后,Janus 反转程序的输入将采用一个数组(理想情况下)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-08
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2012-02-09
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多