Входные данные должны быть кратны размеру блока шифрования в режиме AES CTR

Я получаю это исключение, когда использую пакет шифрования Dart для расшифровки чего-либо в режиме AES CTR:

E/flutter (19095): Invalid argument(s): Input data length must be a multiple of cipher's block size
E/flutter (19095): #0      PaddedBlockCipherImpl.process (package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart:55:9)
E/flutter (19095): #1      AES.decrypt (package:encrypt/src/algorithms/aes.dart:38:20)

Вот мой код:

final encrypter = encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.ctr));
final decrypted = encrypter.decrypt(encrypt.Encrypted.fromBase16(cipher), iv: iv);

cipher - это шестнадцатеричная строка длиной 10. Я думал, что режим AES CTR не требует каких-либо дополнений. Если это требует заполнения, с чем мне заполнять? Я попробовал это:

final decrypted = encrypter.decrypt(encrypt.Encrypted.fromBase16(cipher.padRight(16, null)), iv: iv);

Но я получаю следующее исключение:

E/flutter (19095): FormatException: Invalid radix-16 number (at character 1)
E/flutter (19095): nu
E/flutter (19095): ^

Использование '0' в качестве отступа приводит к первому исключению, которое я описал.

Всего 1 ответ


Это проблема в зашифрованном пакете Дарт. Он не может обрабатывать что-то, зашифрованное с использованием режима ATR CTR, если оно не кратно размеру блока. Этот пакет является оберткой для Pointy Castle , которую я смог успешно использовать для расшифровки строки, зашифрованной в режиме AES CTR. Вот код:

import 'package:encrypt/encrypt.dart' as encrypt;
import 'package:pointycastle/export.dart' as pc;

String decrypt(String cipher, Uint8List key, Uint8List iv) {
  final encryptedText = encrypt.Encrypted.fromBase16(cipher);
  final ctr = pc.CTRStreamCipher(pc.AESFastEngine())
    ..init(false, pc.ParametersWithIV(pc.KeyParameter(key.bytes), iv.bytes));
  Uint8List decrypted = ctr.process(encryptedText.bytes);

  print(String.fromCharCodes(decrypted));

  return String.fromCharCodes(decrypted);
}

cipher - это шестнадцатеричная строка. Пакет encrypt по-прежнему полезен, поскольку предоставляет утилиты для преобразования шестнадцатеричной строки в Uint8List.


Есть идеи?

10000