#dart #encryption #pointycastle
#dart #шифрование #pointycastle
Вопрос:
Я хочу сгенерировать случайный BigInt с битами динамической длины. Я использую пакет pointycastle для получения SecureRandom BigInt.
import 'package:pointycastle/pointycastle.dart';
void main(List<String> arguments) {
print(gen(500));
}
BigInt gen(int Bits) {
var n = BigInt.from(1);
var ran = SecureRandom('Fortuna');
n = ran.nextBigInteger(Bits);
return n;
}
Эта строка генерирует исключение:
n = ran.nextBigInteger(Bits);
StateError (Bad state: AES engine not initialised)
Это полная ошибка в консоли:
Unhandled exception:
Bad state: AES engine not initialised
#0 AESFastEngine.processBlock
package:pointycastle/block/aes_fast.dart:109
#1 BlockCtrRandom.nextUint8
package:pointycastle/random/block_ctr_random.dart:55
#2 SecureRandomBase._randomBits
package:pointycastle/…/impl/secure_random_base.dart:55
#3 SecureRandomBase.nextBigInteger
package:pointycastle/…/impl/secure_random_base.dart:33
#4 AutoSeedBlockCtrRandom.nextBigInteger.<anonymous closure>
package:pointycastle/random/auto_seed_block_ctr_random.dart:69
#5 AutoSeedBlockCtrRandom._autoReseedIfNeededAfter
package:pointycastle/random/auto_seed_block_ctr_random.dart:81
#6 AutoSeedBlockCtrRandom.nextBigInteger
package:pointycastle/random/auto_seed_block_ctr_random.dart:68
#7 FortunaRandom.nextBigInteger
package:pointycastle/random/fortuna_random.dart:46
#8 gen
binencrypt.dart:10
#9 main
binencrypt.dart:4
#10 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
#11 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
Кажется, я не могу найти решение для этого сообщения об ошибке где-либо еще. Я надеюсь, что вы, ребята, сможете мне помочь. 😀
Ответ №1:
Неясно, но если я посмотрю на примеры из проекта, кажется, что вам нужно вызвать seed
метод. Для меня работает следующее:
import 'dart:math';
import 'dart:typed_data';
import 'package:pointycastle/pointycastle.dart';
void main(List<String> arguments) {
print(gen(500));
}
BigInt gen(int bits) {
final _sGen = Random.secure();
var n = BigInt.from(1);
var ran = SecureRandom('Fortuna');
ran.seed(KeyParameter(
Uint8List.fromList(List.generate(32, (_) => _sGen.nextInt(255)))));
n = ran.nextBigInteger(bits);
return n;
}
Пример, на который я был вдохновлен: https://github.com/PointyCastle/pointycastle/blob/master/tutorials/examples/import-demo/import-demo-1.dart
Комментарии:
1. Спасибо, это была проблема. Хорошего дня! 😀
Ответ №2:
Добро пожаловать в Stackoverflow.
При использовании любой части Pointycastle вам необходимо создать экземпляр объектов реализации.
В вашем коде вы используете
var ran = SecureRandom('Fortuna');
в котором используется класс SecureRandom.
Просто добавьте
final rnd = new SecureRandom("AES/CTR/PRNG");
и, пожалуйста, смотрите пример PointCastle SecureRandom для дальнейших вопросов:
https://github.com/PointyCastle/pointycastle/blob/master/test/random/block_ctr_random_test.dart
Комментарии:
1. Я просто заменил свою строку кода на вашу, но выдается то же исключение. Также VSCode говорит, что ключевое слово «new» не требуется. И спасибо за быстрый ответ: D