美文网首页
flutter Dart AES 加密, 没有初始向量的情况

flutter Dart AES 加密, 没有初始向量的情况

作者: ZHDelete | 来源:发表于2023-08-20 16:15 被阅读0次

    转自:
    Dart AES CBC PKCS5Padding
    作者:aYan124
    链接:https://www.jianshu.com/p/688cfe3f07b0


    由于Android项目使用的加密方式参数为 AES/CBC/PKCS5Padding,所以在pub.com上一直没有找到相匹配的插件,今天看到一篇文章说,其实Java的PKCS5Padding就是PKCS7Padding,所以就抱着试一试的心态(坑啊。。)用了一下encrypt插件加密,果然跟Java的加密结果一致,特此记录一下。

    import 'package:encrypt/encrypt.dart' as encrypt;
    
    final plainText = 'asddf';//加密文案
    final key = encrypt.Key.fromUtf8('dsafsdafas');//加密key
    final iv = encrypt.IV.fromUtf8('fsdafasdf');//偏移量
    
    //设置cbc模式
    final encrypter = encrypt.Encrypter(encrypt.AES(key,mode: encrypt.AESMode.cbc));
    
    final encrypted = encrypter.encrypt(plainText, iv: iv);
    final decrypted = encrypter.decrypt(encrypted, iv: iv);
    
    print(decrypted); 
    print(encrypted.base64); 
    

    <meta charset="utf-8">

    因Key文件名冲突,所以设置别名encrypt

    参考文章:
    http://zhuqiaochu.truestudio.tech/dart-java-swift-aes-cbc-pkcs7padding/
    插件地址:
    https://pub.dev/packages/encrypt#-readme-tab-

    但是 对于没有初始向量(IV)的情况, 比如, 我的原始java代码加密,是如下的:

      private static final String ALGORITHMSTR_STRING = "AES/ECB/PKCS5Padding";
    
      private static byte[] aesToBytes(String content, String encryptKey) throws Exception {
            KeyGenerator aes = KeyGenerator.getInstance("AES");
            aes.init(128);
            Cipher cipher = Cipher.getInstance(ALGORITHMSTR_STRING);
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
            return cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
        }
    

    那么,用dart 实现的时候, 只需要给初始向量 长度为0即可.

    String aesEncode(String content, String aesKey) {
      //加密key
      final key = Encrypt.Key.fromUtf8(aesKey);
      //偏移量 - 注意这里
      final iv = Encrypt.IV.fromSecureRandom(0);
    
      //设置cbc模式
      final encrypter = Encrypt.Encrypter(
          Encrypt.AES(key, mode: Encrypt.AESMode.ecb, padding: 'PKCS7'));
      //加密
      final encrypted = encrypter.encrypt(content, iv: iv);
      return encrypted.base64;
    }
    

    此外, 还需要注意和解密一方,约定好加解密的模式是 cbc还是ecb

    好了, 以上就是flutter中进行AES加密的一些内容.

    相关文章

      网友评论

          本文标题:flutter Dart AES 加密, 没有初始向量的情况

          本文链接:https://www.haomeiwen.com/subject/uowsmdtx.html