如何在 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

如何使用flutter Dropdown小部件从Django REST API端点填充数据

如何将符合 Material Design 标准的填充应用到我的 Flutter Scaffold?