Можно ли предсказать случайно сгенерированный BigInteger, который использует библиотеку Random по умолчанию Java? - PullRequest
0 голосов
/ 07 мая 2020

Я видел, как это размещено в разных формах здесь и здесь , которые объясняют, как 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, как я могу определить следующий номер, учитывая только эту информацию?

...