#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;
}
}