50 lines
1.8 KiB
Dart
50 lines
1.8 KiB
Dart
import 'dart:convert';
|
||
import 'dart:typed_data';
|
||
import 'package:encrypt/encrypt.dart' as enc;
|
||
import 'package:archive/archive.dart';
|
||
|
||
class EncryptionUtil {
|
||
// 固定密钥(和后端保持一致)
|
||
static const String _keyStr = ",Lscj312.;[]sc`1dsajcjc;;wislacx";
|
||
static const String _ivStr = ",>ew:[7890;,wd[2";
|
||
|
||
// 对外简易方法(你 Service / Provider 里直接用)
|
||
static String encrypt(String data) => encryptAndCompress(data);
|
||
static String decrypt(String encryptedBase64) => decompressAndDecrypt(encryptedBase64);
|
||
|
||
/// 加密:字符串 → GZIP → AES → Base64
|
||
static String encryptAndCompress(String plainText) {
|
||
// 强制 32位 Key / 16位 IV(AES 标准)
|
||
final key = enc.Key.fromUtf8(_keyStr.padRight(32).substring(0, 32));
|
||
final iv = enc.IV.fromUtf8(_ivStr.padRight(16).substring(0, 16));
|
||
final encrypter = enc.Encrypter(enc.AES(key, mode: enc.AESMode.cbc));
|
||
|
||
// GZIP 压缩
|
||
final utf8Bytes = utf8.encode(plainText);
|
||
final compressed = GZipEncoder().encode(utf8Bytes)!;
|
||
|
||
// AES 加密
|
||
final encrypted = encrypter.encryptBytes(
|
||
Uint8List.fromList(compressed),
|
||
iv: iv,
|
||
);
|
||
|
||
return encrypted.base64;
|
||
}
|
||
|
||
/// 解密:Base64 → AES → GZIP → 字符串
|
||
static String decompressAndDecrypt(String encryptedBase64) {
|
||
final key = enc.Key.fromUtf8(_keyStr.padRight(32).substring(0, 32));
|
||
final iv = enc.IV.fromUtf8(_ivStr.padRight(16).substring(0, 16));
|
||
final encrypter = enc.Encrypter(enc.AES(key, mode: enc.AESMode.cbc));
|
||
|
||
// 解密
|
||
final encrypted = enc.Encrypted.fromBase64(encryptedBase64);
|
||
final decryptedBytes = encrypter.decryptBytes(encrypted, iv: iv);
|
||
|
||
// GZIP 解压
|
||
final decompressed = GZipDecoder().decodeBytes(decryptedBytes);
|
||
|
||
return utf8.decode(decompressed);
|
||
}
|
||
} |