diedthreetimes diedthreetimes - 10 months ago 71
Android Question

Is there a java equivalent to OpenSSL's bn_rand_range?

Specifically, I just want to generate a cryptographically secure random number between 0 and some number x.

In OpenSSL this is done with the function


I can implement it myself using Java's
BigInteger(int bits, Random r)
constructor (which generates a number from 0 to 2bits). But I would like, if possible, to use a better tested algorithm for the sake of security.

Is there a standard way to do this in Java?

P.S. I am actually using Android, but I don't know how to do it in standard Java.

EDIT: x is a large integer stored as a

Answer Source

As far as I can tell, this functionality is not provided. But it is easy enough to implement yourself.

Random r = new SecureRandom();    
BigInteger q = something_big;
BigInteger ans;

    ans = BigInteger(bits_in_q, r);
while (ans.compareTo(q) >= 0); // bn_rand_range generates numbers < q