Я видел, как это размещено в разных формах здесь и здесь , которые объясняют, как java.util.Random
библиотека использует генератор линейных конгруэнтных псевдослучайных чисел , который может быть взломан с использованием двух значений. Может ли этот тип эксплойта go на один уровень глубже угадать данные nextByte
, используемые для заполнения оставшейся части значения BigInteger?
private static Random generator = new Random();
public static String uncrackableRandomNumber() {
return new BigInteger(128, generator);
}
Фрагмент дополнительного уровня генерации байтов используя java.util.Random
(rnd
).
public BigInteger(int numBits, Random rnd) {
this(1, randomBits(numBits, rnd));
}
private static byte[] randomBits(int numBits, Random rnd) {
if (numBits < 0)
throw new IllegalArgumentException("numBits must be non-negative");
int numBytes = (int) (((long) numBits + 7) / 8); // avoid overflow
byte[] randomBits = new byte[numBytes];
// Generate random bytes and mask out any excess bits
if (numBytes > 0) {
rnd.nextBytes(randomBits);
int excessBits = 8 * numBytes - numBits;
randomBits[0] &= (1 << (8 - excessBits)) - 1;
}
return randomBits;
}
Первые два числа: 233458857748780331814340414981023411537
и 141610568161066839752374346774468879751
, как я могу определить следующий номер, учитывая только эту информацию?