aesUtils.dart 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import 'dart:convert';
  2. import 'dart:typed_data';
  3. import 'package:encrypt/encrypt.dart';
  4. class CryptData {
  5. final Uint8List _byte;
  6. CryptData(Uint8List byte) : _byte = byte;
  7. CryptData.fromUtf8(String base64data) : _byte = base64Decode(base64data);
  8. CryptData.fromBase64(String base64data) : _byte = base64Decode(base64data);
  9. CryptData.fromHex(String hexData) : _byte = decodeHexString(hexData);
  10. Uint8List get byte => _byte;
  11. String get base64 => base64Encode(_byte);
  12. }
  13. class EncryptedAesCbc {
  14. final CryptData iv;
  15. final CryptData encrypted;
  16. EncryptedAesCbc({
  17. required this.iv,
  18. required this.encrypted,
  19. });
  20. EncryptedAesCbc.fromBase64({
  21. required String base64iv,
  22. required String base64encrypted,
  23. }) : iv = CryptData.fromBase64(base64iv), encrypted = CryptData.fromBase64(base64encrypted);
  24. }
  25. EncryptedAesCbc encryptAesCbc(String plainText, CryptData password) {
  26. final iv = IV.fromLength(16); // AES-CBC 必需的16字节IV
  27. final key = Key(password.byte);
  28. final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
  29. final encrypted = encrypter.encrypt(plainText, iv: iv);
  30. return EncryptedAesCbc(iv: CryptData(iv.bytes), encrypted: CryptData(encrypted.bytes));
  31. }
  32. String decryptAesCbc(EncryptedAesCbc encrypted, CryptData password) {
  33. final iv = IV(encrypted.iv.byte);
  34. final key = Key(password.byte);
  35. final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
  36. final decrypted = encrypter.decrypt(Encrypted(encrypted.encrypted.byte), iv: iv);
  37. return decrypted;
  38. }