有时候我们需要传输密码,并且每次传输的内容不一样,我们可以使用AES对称加密。一个密钥为对称令牌,再加一个随机数为向量值,这样子每次生成的密文都不一样了。
添加依赖
dependencies:
encrypt: ^5.0.1
Pub get
下载依赖
封装工具类
aes_cipher.dart
import 'package:encrypt/encrypt.dart';
import 'dart:convert';
class AESCipher {
final Encrypter _encrypter;
final IV _iv;
AESCipher(String keyStr, String ivStr)
: assert(keyStr.length == 16 || keyStr.length == 24 || keyStr.length == 32,
'Key must be 16, 24, or 32 characters'),
assert(ivStr.length == 16, 'IV must be 16 characters'),
_encrypter = Encrypter(AES(
Key.fromUtf8(keyStr),
mode: AESMode.cbc,
padding: 'PKCS7',
)),
_iv = IV.fromUtf8(ivStr);
/// 加密返回 Base64 编码字符串
String encrypt(String plainText) {
final encrypted = _encrypter.encrypt(plainText, iv: _iv);
return encrypted.base64;
}
/// 解密 Base64 编码字符串
String decrypt(String base64CipherText) {
final encrypted = Encrypted.fromBase64(base64CipherText);
return _encrypter.decrypt(encrypted, iv: _iv);
}
}
调用示例
String secretKey = "xxxxx";
String nonce = TextUtils.randomString();
AESCipher aesCipher = AESCipher(secretKey, nonce);
String pwd64 = aesCipher.encrypt(password);
debugPrint("加密后的密码 $pwd64");
解密同理。