如何在 Flutter 中使用填充“ISO10126”进行 AES 加密?
Posted
技术标签:
【中文标题】如何在 Flutter 中使用填充“ISO10126”进行 AES 加密?【英文标题】:How to use Padding 'ISO10126' for AES Encryption in Flutter? 【发布时间】: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 是一个选项。
【参考方案1】:
Flutter 不支持 AES 加密的填充“ISO10126”。相反,我找到了使用encrypt: ^4.1.0 可以获得预期结果的解决方案。我们还将两端的填充“ISO10126”更改为“PKCS7”。所以这里是最终的代码sn-p:
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;
【讨论】:
以上是关于如何在 Flutter 中使用填充“ISO10126”进行 AES 加密?的主要内容,如果未能解决你的问题,请参考以下文章
在flutter inappWebview中自动填充登录凭据
我们如何在下拉菜单中更改 Flutter DropdownMenuItem 的宽度/填充?
如何在 Flutter 中使用预填充的 sqlite 数据库我的应用程序
如何在flutter中从firebase数据填充listview