Flutter - AES256加解密封装(CBC + PKCS7)

demo 地址: https://github.com/iotjin/jh_flutter_demo

aes加密使用的是 encrypt
md5使用的是 flustars
key的长度决定密文长度
除了aes另外还有base64和md5加密方法

JhEncryptUtils

/**
 *  jh_encrypt_utils.dart
 *
 *  Created by iotjin on 2020/08/18.
 *  description: base64 , aes加解密(CBC/PKCS7)
 */

import 'dart:convert';

import 'package:encrypt/encrypt.dart';
import 'package:flustars/flustars.dart';

var _KEY = "sdfg5468wwdfd542sd4asdf4sadfqd12"; 
var _IV = "0000000000000000";

//128的keysize=16,192keysize=24,256keysize=32

class JhEncryptUtils {
  //Base64编码
  static String encodeBase64(String data) {
    return base64Encode(utf8.encode(data));
  }

  //Base64解码
  static String decodeBase64(String data) {
    return String.fromCharCodes(base64Decode(data));
  }

  // md5 加密 32位小写
  static String encodeMd5(String plainText) {
    return EncryptUtil.encodeMd5(plainText);
  }

  //AES加密
  static aesEncrypt(plainText) {
    try {
      final key = Key.fromUtf8(_KEY);
      final iv = IV.fromUtf8(_IV);
      final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
      final encrypted = encrypter.encrypt(plainText, iv: iv);
      return encrypted.base64;
    } catch (err) {
      print("aes encode error:$err");
      return plainText;
    }
  }

  //AES解密
  static dynamic aesDecrypt(encrypted) {
    try {
      final key = Key.fromUtf8(_KEY);
      final iv = IV.fromUtf8(_IV);
      final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
      final decrypted = encrypter.decrypt64(encrypted, iv: iv);
      return decrypted;
    } catch (err) {
      print("aes decode error:$err");
      return encrypted;
    }
  }

调用

    var text = '123';
    print('明文:${text}');

    var base = JhEncryptUtils.encodeBase64(text);
    print('base64: ${base}');

    var enStr = JhEncryptUtils.aesEncrypt(text);
    print('AES 加密:${enStr}');
    var deStr = JhEncryptUtils.aesDecrypt(enStr);
    print('AES 解密:${deStr}');

    var md5 = JhEncryptUtils.encodeMd5(text);
    print('md5 :${md5}');

打印

flutter: 明文:123
flutter: base64: MTIz
flutter: AES 加密:jkrxORUNfAjv237qbO1o2A==
flutter: AES 解密:123
flutter: md5 :202cb962ac59075b964b07152d234b70
要实现 Flutter App 和 PHP 服务器之间的通信,可以使用 HTTP 协议和 POST 请求,然后在 PHP 服务器端使用 AES-256-CBC 加密算法对请求的数据进行加密,再将加密后的数据返回给 Flutter App。Flutter App 在收到数据后,再使用相同的 AES-256-CBC 加密算法对数据进行解密。 以下是一个示例代码,用于在 Flutter App 中发送加密后的数据到 PHP 服务器: ```dart import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:crypto/crypto.dart'; import 'package:pointycastle/block/aes.dart'; import 'package:pointycastle/block/modes/cbc.dart'; import 'package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart'; import 'dart:math'; import 'dart:typed_data'; Future<String> sendEncryptedData(String data) async { // Generate a random initialization vector final random = Random.secure(); final iv = Uint8List.fromList(List.generate(16, (_) => random.nextInt(256))); // Encrypt the data using AES-256-CBC final key = utf8.encode('your_secret_key_here'); final cipher = PaddedBlockCipherImpl( PKCS7Padding(), CBCBlockCipher(AESFastEngine()), ); cipher.init(true, PaddedBlockCipherParameters<CipherParameters, CipherParameters>( ParametersWithIV<KeyParameter>(KeyParameter(key), iv), null, )); final encryptedData = cipher.process(utf8.encode(data)); // Send the encrypted data and initialization vector to the PHP server final response = await http.post( Uri.parse('http://your_php_server_url_here'), body: { 'data': base64.encode(encryptedData), 'iv': base64.encode(iv), }, ); // Return the response from the PHP server return response.body; } ``` 在 PHP 服务器端,可以使用以下代码对请求的数据进行解密: ```php <?php // Get the encrypted data and initialization vector from the POST request $data = base64_decode($_POST['data']); $iv = base64_decode($_POST['iv']); // Decrypt the data using AES-256-CBC $key = 'your_secret_key_here'; $decryptedData = openssl_decrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); // Return the decrypted data to the Flutter App echo $decryptedData; ?> ``` 需要注意的是,为了确保数据的安全性,密钥应该保密,并且只有 Flutter App 和 PHP 服务器知道。另外,初始化向量应该是随机生成的,并且每次加密的时候都应该使用不同的初始化向量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值