Как использовать заполнение ‘ISO10126’ для шифрования AES в Flutter?

#android #flutter #encryption #aes #padding

#Android #flutter #шифрование #aes #заполнение

Вопрос:

Я использую encrypt: ^4.1.0 flutter library для шифрования AES.

Вот мой код:

 import 'package:encrypt/encrypt.dart';

class AesEncryption {
  encryption() {
  final plainText =
        '{"Username":"01717222787",RefId":"5c6de3e4-ea65-49be-bdc5-7eba0128fefc"}';
    final key = Key.fromUtf8('32 length code ...');
    final iv = IV.fromUtf8('16 lenght code...');

    final encrypter = Encrypter(AES(key, mode: AESMode.cbc));

    final encrypted = encrypter.encrypt(plainText, iv: iv);
    final decrypted = encrypter.decrypt(encrypted, iv: iv);

    print(decrypted);
    print(encrypted.base64);
  }
}
  

Библиотека Flutter сообщила, что заполнение No / Zero поддерживается, но encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: null)) не работает.

Я хочу использовать encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: 'ISO10126')) то, что уже используется в моем серверном коде. Я нашел padding:'ISO7816-4' это, но зашифрованные данные отличаются от server.

Есть ли какой-либо способ использовать padding: 'ISO10126' для шифрования AES в AES.CBC режиме?

Комментарии:

1. encrypt — это, по сути, оболочка вокруг части функциональности PointyCastle, которая, похоже, не обеспечивает ISO 10126 (кстати, изъят, 2007) (см. Раздел Дополнения ). Если вы не нашли библиотеку, поддерживающую это заполнение, и она вам нужна по соображениям совместимости, вы можете реализовать ее самостоятельно (что не очень сложно, см. Здесь ). Для этого вам придется отключить неявное заполнение с padding: null помощью .

2. @Topaco спасибо за ваш ответ. Я уже пробовал PointyCastel и padding ISO7816-4 . Но проблема в том, что на стороне сервера ISO10126 реализовано. Таким образом, зашифрованное и расшифрованное значение не совпадает.

3. Да, PointyCastle (и основанный на нем пакет шифрования ), похоже, не поддерживают ISO 10126 (см. Ссылки в моем первом комментарии). Итак, я предлагаю (если вы не можете найти какую-либо другую библиотеку, поддерживающую ISO 10126) отключить неявное заполнение и реализовать ISO 10126 самостоятельно.

4. Возможно, вариант Steel Crypt .

Ответ №1:

Flutter не поддерживает заполнение ‘ISO10126’ для шифрования AES. Вместо этого я нашел решение, в котором мы можем получить ожидаемый результат, используя encrypt: ^ 4.1.0. Мы также меняем заполнение ‘ISO10126’ на ‘PKCS7’ в обоих концах. Итак, вот окончательный фрагмент кода:

 import 'package:encrypt/encrypt.dart'; 

class AesEncryption {   
     
String encryption(String plainText) {
     
     final key = Key.fromBase64(ENCRYPTION_KEY);
     final iv = IV.fromBase64(ENCRYPTION_IV);

     final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: 'PKCS7'));
     final encrypted = encrypter.encrypt(plainText, iv: iv);

 return encrypted.base64;   
}

String decryption(String plainText) {

   final key = Key.fromBase64(ENCRYPTION_KEY);
   final iv = IV.fromBase64(ENCRYPTION_IV);

   final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: 'PKCS7'));
   final decrypted = encrypter.decrypt(Encrypted.from64(plainText), iv: iv);

  return decrypted;   
 } 
}