基于Dart自带的dart:crypto库和dart_des库实现
import 'dart:convert';
import 'dart:typed_data';
import 'dart:math';
import 'package:dart_des/dart_des.dart';
class CacheEncryptionDecryptionUtils {
CacheEncryptionDecryptionUtils._();
static final CacheEncryptionDecryptionUtils _instance = CacheEncryptionDecryptionUtils._();
factory CacheEncryptionDecryptionUtils() {
return _instance;
}
// 用于生成随机密钥
static String generateRandomKey() {
final random = Random();
List<int> keyBytes = List.generate(32, (index) => random.nextInt(256));
return base64.encode(Uint8List.fromList(keyBytes));
}
// 将Map转换为JSON字符串
static String _mapToJson(Map<String, dynamic> map) {
return json.encode(map);
}
// 将JSON字符串转换为Map
static Map<String, dynamic> _jsonToMap(String jsonString) {
return json.decode(jsonString);
}
// 加密Map,key表示生成的生成随机密钥
static String encryptMap(String key, Map<String, dynamic> data) {
final keyBytes = base64.decode(key);
final jsonString = _mapToJson(data);
final jsonBytes = utf8.encode(jsonString);
final encryptedBytes = List<int>.generate(
jsonBytes.length,
(i) => jsonBytes[i] ^ keyBytes[i % keyBytes.length],
);
return base64.encode(Uint8List.fromList(encryptedBytes));
}
// 解密Map,key表示生成的生成随机密钥
static Map<String, dynamic> decryptMap(String key, String encryptedData) {
final keyBytes = base64.decode(key);
final encryptedBytes = base64.decode(encryptedData);
final decryptedBytes = List<int>.generate(encryptedBytes.length, (i) => encryptedBytes[i] ^ keyBytes[i % keyBytes.length]);
final decryptedJsonString = utf8.decode(decryptedBytes);
return _jsonToMap(decryptedJsonString);
}
// 加密String,key表示生成的生成随机密钥
String encryptString(String key, String encryptString) {
final keyBytes = base64.decode(key);
final passwordBytes = utf8.encode(encryptString);
final encryptedBytes = List<int>.generate(passwordBytes.length, (i) => passwordBytes[i] ^ keyBytes[i % keyBytes.length]);
return base64.encode(Uint8List.fromList(encryptedBytes));
}
// 解密String,key表示生成的生成随机密钥
static String decryptString(String key, String decryptString) {
final keyBytes = base64.decode(key);
final encryptedBytes = base64.decode(decryptString);
final decryptedBytes = List<int>.generate(encryptedBytes.length, (i) => encryptedBytes[i] ^ keyBytes[i % keyBytes.length]);
return utf8.decode(decryptedBytes);
}
}
// 3DES解密
static String decrypt3DES(String content, String key) {
print("decrypt3DES content:$content key:$key");
String res = '';
try {
if (key.length > 24) {
key = key.substring(0, 24);
}
DES3 des3CBC = DES3(key: key.codeUnits, mode: DESMode.ECB, paddingType: DESPaddingType.PKCS5);
List<int> decrypted = des3CBC.decrypt(base64Decode(content));
res = utf8.decode(decrypted);
print("decrypt3DES res:$res");
} catch (e) {
print("decrypt3DES e:$e");
}
return res;
}
// 3DES加密
static String encrypt3DES(String content, String key) {
String res = '';
try {
if (key.length > 24) {
key = key.substring(0, 24);
}
DES3 des3CBC = DES3(key: key.codeUnits, mode: DESMode.ECB, paddingType: DESPaddingType.PKCS5);
List<int> encrypted = des3CBC.encrypt(content.codeUnits);
res = base64.encode(encrypted);
} catch (e) {
print("encrypt3DES e:$e");
}
return res;
}