Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to generate a seed out of a sequence of numbers?

For example if java produces the pseudorandom sequence: 9 3 2 5 6 by using 23 as a seed, how can I do the inverse? i.e. getting 23 out of the sequence 9 3 2 5 6.

Or how do I assign a seed for a certain sequence?

It is easy to do if there is a database - just assign a random key for the sequence

INSERT INTO SEQUENCE_TABLE VALUES (RANDOM_KEY, SEQUENCE)

However if I'm not permitted to use a database, Is there a formula to do such a thing?

like image 774
Frank Smith Avatar asked Jan 20 '12 04:01

Frank Smith


1 Answers

Yes, it's absolutely easy to reverse engineer the number stream of a poorly designed pseudo random number generator, such as the Linear Congruential PRNG implementation in the Java programming language (java.util.Random).

In fact, with as few as TWO values from that particular generator, and the information on the order in which the values emerged, the entire stream can be predicted.

Random random = new Random();
long v1 = random.nextInt();
long v2 = random.nextInt();
for (int i = 0; i < 65536; i++) {
    long seed = v1 * 65536 + i;
    if (((seed * multiplier + addend) & mask) >>> 16) == v2) {
        System.out.println("Seed found: " + seed);
        break;
    }
}

This is precisely why it's critical to use cryptographically secure random number generators that have been vetted by the community at large for implementations that require security.

There is much more information on reverse engineering PRNGs, including java.util.Random here. ...

like image 91
ingyhere Avatar answered Sep 19 '22 15:09

ingyhere