如何获得特定范围内的随机 BigInt (Dart)

How do I get a random BigInt in a specific range (Dart)

如果之前有人问过这个问题,我很抱歉,但我找不到任何对我有帮助的解决方案。

基本上,我有一个巨大的数字 n,其中 n 是一个 4000 位数。显然,它不适合 Dart 中原始类型 int 允许的 64 位。

我需要找到一个随机数 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());
}

我知道这不是一个好的解决方案,但我现在只有这些了

package:pointycastle contains a utility file with a decodeBigInt function that converts a list of bytes into a 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 可用于强制执行否定或肯定结果。