Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 逆向工程随机数发生器_Java_Random_Reverse Engineering_Reverse - Fatal编程技术网

Java 逆向工程随机数发生器

Java 逆向工程随机数发生器,java,random,reverse-engineering,reverse,Java,Random,Reverse Engineering,Reverse,我如何对这个随机生成器进行反向工程,以便它从生成的随机值返回初始值“123456” public class calcus { public static void main(String[] args) { int count = 0; StringBuilder sb = new StringBuilder(); Random r = new Random(123456); while (count < 7) { count++;

我如何对这个随机生成器进行反向工程,以便它从生成的随机值返回初始值“123456”

public class calcus {
  public static void main(String[] args)  {
    int count = 0;
    StringBuilder sb = new StringBuilder();
    Random r = new Random(123456);
    while (count < 7) {
        count++;
        sb.append(r.nextInt(27)).append(",");
    }
    String[] reverseNumber= sb.toString().split(",");
    System.out.println(Arrays.toString(reverseNumber)); // [9, 11, 19, 16, 19, 4, 15]            
  }
}
公共类计算{
公共静态void main(字符串[]args){
整数计数=0;
StringBuilder sb=新的StringBuilder();
随机r=新随机(123456);
而(计数<7){
计数++;
sb.append(r.nextInt(27))。append(“,”);
}
字符串[]ReverseEnumber=sb.toString().split(“,”);
System.out.println(Arrays.toString(reverseEnumber));//[9,11,19,16,19,4,15]
}
}

实际上,您不需要对随机类进行反向工程

  • 源代码已发布,供所有人查看。(例如,google的“java.util.Random source”…)

  • javadocs中详细描述了它使用的算法,以便您重新实现它。甚至设置种子的算法

但是,如果您询问是否可以反向运行随机序列来恢复种子,则需要仔细检查代码并计算LCG的反函数。但我不确定这是否足够,因为
nextInt(int)
甚至
nextInt()
都不会返回生成器的整个48位状态

为了避免这种情况,你可能需要做一些“令人讨厌的反思”来提取状态。如果要这样做,源代码将显示
Random
类记录种子的值。所以你可以直接提取它。。。以同样的方式

(如何?搜索解释如何使用反射访问私有字段的问答。)



你需要什么?我是说,你能解释得更清楚些吗。你需要找出随机数背后的逻辑吗?我想知道如何实现(编码)反向方法,这样我就可以从生成的随机数中获得初始值,因为如果我对随机数123456Java使用
nextInt(27)
,它将始终生成相同的随机数,我相信它使用48位LCG。它始终是一个可逆的生成器,因此给定输出位,您可以快速获得种子:@severinpapadeux在我问这个问题之前,我看到了这个问题,但我真的不知道如何在上面的代码中实现它,如果您能提供帮助,那就太好了。123456不是您的初始值,它是用于生成后续随机数的种子。无法从单个输出恢复种子。由于这不是加密RNG,您可以从足够的输出量中恢复它。有关详细信息,请参阅。@rossum:Random类的next()*方法不使用LCG的低位16位,因此这些方法从未被观察到。这使得恢复比您的链接建议的更具挑战性。是的,不使用低16位确实会使恢复更加困难,但这只需要一组较长的输出来确定生成器的所有参数。16位是65536位,因此在最大值下,许多输出将决定一切。我怀疑比这要少很多,但如果不进行计算,我无法确定。