问题描述
如果之前有人问过这个问题,我很抱歉,但我找不到任何对我有帮助的解决方案。
基本上,我有一个巨大的数字 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
包含一个带有 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
可用于强制执行否定或肯定结果。