【发布时间】:2021-02-15 17:54:36
【问题描述】:
我正在使用 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 库表示支持无/零填充,但 encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: null)) 不起作用。
我想使用我的服务器代码中已经使用的encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: 'ISO10126'))。我找到了padding:'ISO7816-4'这个,但是加密的数据和服务器不一样。
有没有办法在AES.CBC 模式下使用padding: 'ISO10126' 进行AES 加密?
【问题讨论】:
-
encrypt 本质上是对 PointyCastle 功能的一部分的包装,该功能似乎不提供 ISO 10126(顺便说一句,2007 年撤回)(参见 Paddings 部分)。如果您没有找到支持此填充的库并且出于兼容性原因需要它,您可以自己实现它(这不是很困难,请参阅here)。为此,您必须使用
padding: null禁用隐式填充。 -
@Topaco 感谢您的回答。我已经尝试过PointyCastel 和填充
ISO7816-4。但问题是,在服务器端实现了ISO10126。所以加密和解密的值不匹配。 -
是的,PointyCastle(以及基于它的 encrypt 包)似乎不支持 ISO 10126(请参阅我的第一条评论中的链接)。所以我的建议是(如果你找不到任何其他支持 ISO 10126 的库)禁用隐式填充并自己实现 ISO 10126。
-
可能Steel Crypt 是一个选项。
标签: android flutter encryption aes padding