Java 逆向工程随机数发生器
我如何对这个随机生成器进行反向工程,以便它从生成的随机值返回初始值“123456”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++;
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中详细描述了它使用的算法,以便您重新实现它。甚至设置种子的算法
nextInt(int)
甚至nextInt()
都不会返回生成器的整个48位状态
为了避免这种情况,你可能需要做一些“令人讨厌的反思”来提取状态。如果要这样做,源代码将显示Random
类记录种子的值。所以你可以直接提取它。。。以同样的方式
(如何?搜索解释如何使用反射访问私有字段的问答。)
你需要什么?我是说,你能解释得更清楚些吗。你需要找出随机数背后的逻辑吗?我想知道如何实现(编码)反向方法,这样我就可以从生成的随机数中获得初始值,因为如果我对随机数123456Java使用
nextInt(27)
,它将始终生成相同的随机数,我相信它使用48位LCG。它始终是一个可逆的生成器,因此给定输出位,您可以快速获得种子:@severinpapadeux在我问这个问题之前,我看到了这个问题,但我真的不知道如何在上面的代码中实现它,如果您能提供帮助,那就太好了。123456不是您的初始值,它是用于生成后续随机数的种子。无法从单个输出恢复种子。由于这不是加密RNG,您可以从足够的输出量中恢复它。有关详细信息,请参阅。@rossum:Random类的next()*方法不使用LCG的低位16位,因此这些方法从未被观察到。这使得恢复比您的链接建议的更具挑战性。是的,不使用低16位确实会使恢复更加困难,但这只需要一组较长的输出来确定生成器的所有参数。16位是65536位,因此在最大值下,许多输出将决定一切。我怀疑比这要少很多,但如果不进行计算,我无法确定。