Извините, если этот вопрос задавали раньше, но я не могу найти решение, которое помогло бы мне.

По сути, у меня есть огромное число n, где n - это 4000-битное число. Очевидно, он не уместится в 64-битных, разрешенных примитивным типом int в Dart.

Мне нужно найти случайное число g такое, что 2 ≤ g ≤ (n - 1). Есть ли способ сгенерировать такое случайное число?

Мое текущее решение:

void _generatePrivateKey() {
  const numbers = '0123456789';
  final halfOfNLength = N.toString().length ~/ 2; // Where `N` is `BigInt`
  final length = _rand.nextInt(halfOfNLength) + halfOfNLength;
  final buffer = StringBuffer();
  for (var _ = 0; _ < length; _++) {
    buffer.write(numbers[_rand.nextInt(numbers.length)]);
  }
  _privateKey = BigInt.parse(buffer.toString());
}

Я знаю, что это не лучшее решение, но это все, что у меня есть на данный момент

0
Nabeel Parkar 9 Фев 2021 в 15:11

1 ответ

Лучший ответ

package:pointycastle содержит служебный файл с decodeBigInt функция, которая преобразует список байтов в BigInt.

Вот как вы можете использовать его для генерации 4000-битного значения:

import 'dart:math';
import 'dart:typed_data';

BigInt randomBigInt() {
  const size = 4000;
  final random = Random.secure();
  final builder = BytesBuilder();
  for (var i = 0; i < size; ++i) {
    builder.addByte(random.nextInt(256));
  }
  final bytes = builder.toBytes();
  return decodeBigInt(bytes);
}

В качестве альтернативы, decodeBigIntWithSign можно использовать для принудительного получения отрицательного или положительного результата.

1
hacker1024 11 Фев 2021 в 02:04