«Движок AES не инициализирован» с помощью pointycastle SecureRandom()

#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