Flutter 数据加解密工具

310 阅读1分钟

基于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;
}