import 'dart:convert'; import 'dart:typed_data'; import 'package:encrypt/encrypt.dart'; class CryptData { final Uint8List _byte; CryptData(Uint8List byte) : _byte = byte; CryptData.fromUtf8(String base64data) : _byte = base64Decode(base64data); CryptData.fromBase64(String base64data) : _byte = base64Decode(base64data); CryptData.fromHex(String hexData) : _byte = decodeHexString(hexData); Uint8List get byte => _byte; String get base64 => base64Encode(_byte); } class EncryptedAesCbc { final CryptData iv; final CryptData encrypted; EncryptedAesCbc({ required this.iv, required this.encrypted, }); EncryptedAesCbc.fromBase64({ required String base64iv, required String base64encrypted, }) : iv = CryptData.fromBase64(base64iv), encrypted = CryptData.fromBase64(base64encrypted); } EncryptedAesCbc encryptAesCbc(String plainText, CryptData password) { final iv = IV.fromLength(16); // AES-CBC 必需的16字节IV final key = Key(password.byte); final encrypter = Encrypter(AES(key, mode: AESMode.cbc)); final encrypted = encrypter.encrypt(plainText, iv: iv); return EncryptedAesCbc(iv: CryptData(iv.bytes), encrypted: CryptData(encrypted.bytes)); } String decryptAesCbc(EncryptedAesCbc encrypted, CryptData password) { final iv = IV(encrypted.iv.byte); final key = Key(password.byte); final encrypter = Encrypter(AES(key, mode: AESMode.cbc)); final decrypted = encrypter.decrypt(Encrypted(encrypted.encrypted.byte), iv: iv); return decrypted; }