首页 > 解决方案 > 如何获得特定范围内的随机 BigInt (Dart)

问题描述

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

基本上,我有一个巨大的数字n,其中n有一个 4000 位数。int显然,它不适合Dart中原始类型所允许的 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());
}

我知道这不是一个好的解决方案,但这就是我现在所拥有的

标签: flutterdartencryptioncryptographylargenumber

解决方案


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可用于强制执行否定或肯定结果。


推荐阅读