
Java Random 상태 복제 도구로, 관찰된 출력에서 내부 상태를 복구하여 향후 난수 값을 예측하며, LCG 기반 PRNG의 취약점을 입증합니다.
node 폴더의 README를 참조하세요.
java.util.Random의 nextDouble로 생성된 double이 주어지면, 동일한 상태를 가진 Random을 재생성하십시오. 이 ReplicatedRandom은 원래 Random의 미래 값을 예측하는 데 사용할 수 있습니다.
예제:
Random r = new Random();
ReplicatedRandom rr = new ReplicatedRandom();
rr.replicateState(r.nextDouble());
System.out.println(r.nextDouble() == rr.nextDouble()); // True
System.out.println(r.nextDouble() == rr.nextDouble()); // True
System.out.println(r.nextDouble() == rr.nextDouble()); // True
Math.random()도 내부적으로 Random을 사용하므로 동일하게 작동합니다:
ReplicatedRandom rr = new ReplicatedRandom();
rr.replicateState(Math.random());
System.out.println(Math.random() == rr.nextDouble()); // True
System.out.println(Math.random() == rr.nextDouble()); // True
System.out.println(Math.random() == rr.nextDouble()); // True
nextInt()에도 작동하지만 연속된 두 값이 필요합니다:
Random r = new Random();
ReplicatedRandom rr = new ReplicatedRandom();
rr.replicateState(r.nextInt(), r.nextInt());
System.out.println(r.nextInt() == rr.nextInt()); // True
System.out.println(r.nextInt() == rr.nextInt()); // True
System.out.println(r.nextInt() == rr.nextInt()); // True
자세한 내용은 이 블로그 게시물을 참조하세요.