【问题标题】:How to use Padding 'ISO10126' for AES Encryption in Flutter?如何在 Flutter 中使用填充“ISO10126”进行 AES 加密?
【发布时间】: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


【解决方案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;   
 } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2017-08-29
    • 2011-10-16
    • 2012-04-10
    • 2015-09-16
    • 2018-02-15
    相关资源
    最近更新 更多