逆向工程随机数发生器

时间:2018-05-19 03:54:04

标签: 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++;
        sb.append(r.nextInt(27)).append(",");
    }
    String[] reverseNumber= sb.toString().split(",");
    System.out.println(Arrays.toString(reverseNumber)); // [9, 11, 19, 16, 19, 4, 15]            
  }
}

1 个答案:

答案 0 :(得分:2)

从字面上看,您不需要对Random类进行逆向工程。

  • 发布源代码供所有人查看。 (例如,谷歌搜索“java.util.Random source”...)

  • 它使用的算法在javadocs中有详细描述,您可以重新实现它。甚至是用于设置种子的算法。

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

要解决这个问题,你可能需要做一些“讨厌的反思”来提取状态。如果您打算这样做,源代码会显示Random类记录种子的值。所以你也可以直接提取它......以同样的方式。

(如何?搜索Q&amp; A,解释如何使用反射访问私有字段。)