25.1.flutter-RSA+AES加密

2023-02-16  本文已影响0人  ChaosHeart

1.生成随机数

///生成只含数字和字母的16位随机字符
String getRandomAesKey1(int length) {
  final _random = Random();
  const _availableChars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
  final randomString = List.generate(length, (index) => _availableChars[_random.nextInt(_availableChars.length)]).join();
  return randomString;
}

///生成含特殊字符的16位随机字符
String getRandomAesKey2(int length) {
  final _random = Random();
  final result = String.fromCharCodes(List.generate(length, (index) => _random.nextInt(33) + 89));
  return result;
}

2.RSA加解密

encrypt: ^4.0.0

创建.pem文件放在项目根目录下,存储公钥和私钥


123.png
1236.png

公钥(固定格式)

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2/vF49zKHdP0EY1B9Zim
5t4X1GsnP1TEYgYMnWXQNLluWV53iInEJBmw/xf++Ohbgp7WhAFcjlRJ6Bxnqj6n
CtAsXAjIXnv1UDCabw/pUb2Tm349I990wSGEeIbuSRPD/t1O4qOTgpvCWRDgVVfX
PILWBkshMhQA7xs0LeEXtimtCLnjUywlXw+Hthlx2Zi6Ba656HKro9EPZ2BRGGUd
mbPLWibeD7MF8ETz5R0w/N+3GyTnizPihsFU4sPOnWwhsR0FWz0i+uVeYrIkpyo6
hkXFQMLt4RzA9VVsd+nk5h/SQ/NQ38VrpUlLfcL4K/pzUXCrJ6X5KYOIfEcG16QG
sQIDAQAB
-----END PUBLIC KEY-----

私钥(固定格式)

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDb+8Xj3Mod0/QR
jUH1mKbm3hfUayc/VMRiBgydZdA0uW5ZXneIicQkGbD/F/746FuCntaEAVyOVEno
HGeqPqcK0CxcCMhee/VQMJpvD+lRvZObfj0j33TBIYR4hu5JE8P+3U7io5OCm8JZ
EOBVV9c8gtYGSyEyFADvGzQt4Re2Ka0IueNTLCVfD4e2GXHZmLoFrrnocquj0Q9n
YFEYZR2Zs8taJt4PswXwRPPlHTD837cbJOeLM+KGwVTiw86dbCGxHQVbPSL65V5i
siSnKjqGRcVAwu3hHMD1VWx36eTmH9JD81DfxWulSUt9wvgr+nNRcKsnpfkpg4h8
RwbXpAaxAgMBAAECggEAOXZP39CJnzcBVyBd7WhdmIrFEMCYtOtQjQZlfyvcMhmJ
4KBTev/5kzB+0nOTL7OKS9lv0XWFlswfrhjVX1wUSDfOjo/gvwWEM9kuTfqLCMYL
a5+TGu7A0b4Om2krjz0xgj6O35a47nH/V0KYRtK2L2FBxM0VM76T6+FgROe6SOOn
8BOvAiljHu+hzxOAx8T881daO2TpLXGcwSHcT8UfhIIiE7KBjqUmgDQwkBNcZvhd
uhNsSMBjNpf0sws6N2bJ3fK/Yo+23obW03yKqdWOXZ1/QD8PfdRn1gkNn1HwNKTU
JuC2K7gUNfHugYDywz2wL2YMiGwzBKOdVULMMPhzkQKBgQD3e2bOIcW5+OOeabIq
gGBzoOLaElUwJtFKZBNPG84t+mfYAzwHYkf416WXsR6ql0mLsmZaKBGYk+H5/Kco
1xxPfHlENHHZVfof1K1pQLxLoF9vW7rtMVT+CwdgbppBXoVDcqkri8h9aVPTPL/D
q6a9qFfcTO+wlfnCgaxXqlDAtQKBgQDjjhPx8sf55G7dZjl9wzfgGjsBRxOeecWr
dcfRy4S/WxTC0NwTNaPMyb534RbwHh/MDg9naoLg0kUZQ+AfzleUC5D/PI0G8fO7
qADXenb2ZwflBkyw5JmSsk2iJ8tREFgLfqAKrGDTSVc33q6mfm+fZHvZsGVUgxvr
riB1EZc3jQKBgFlUib9OIXkHheHgdRcyT55tLHVauLUwzcr0ZKPhfYLLKECoqjpg
F2qTLIqcvF0HTtzGAHv6ip9wgdkigZQUUXu/imY8J/wzNJ3Yvt+HJnCF6uzfR5Hm
hK9Oe9MrGTMPUzsNYFL/mdbq9f8BppaSlxVOdqhmfP5YpFa5R+Q87fkhAoGBAKnT
rGEC72o5qOAFXdzVKEtRaD4A3MyGVxcq1NFnUZA6mpj2pXiUrMW2vzbav3K/GL4C
tE5bOIgvhbBgbtFt/wCXTUSf3SSUyHGB5fbrCAPHSyYK+IuAYHkSJ0xg5KWATCVw
AGNW2QB3GOeygqfxbr8HkEMcGdPj8Z+IGeMlGLU1AoGBANpu3Sx5J6ELxpL3110I
6GfhmADZ/k8rTlkST+sfUJI1R3TcKqLBbyiNd1id1O1rKrnPfym41lNWz6MWRn6m
1GPrdTNZIfMJugEfJyaF2vojWyFXMEA/pvjfHeEjQLsoEoupKXLH/Tkm6zaNunJH
cX2rgz3C2PGugq1h2EZGBU5z
-----END PRIVATE KEY-----
/// RSA 加密
Future<String> rsaEncrypt(String data) async {
  final publicPem = await rootBundle.loadString('key/rsa_public.pem');
  dynamic publicKey = RSAKeyParser().parse(publicPem);
  final encrypt = Encrypter(RSA(publicKey: publicKey));
  return encrypt.encrypt(data).base16;
}

/// RSA 解密
Future<String> rsaDecrypt(String data) async {
  final privatePem = await rootBundle.loadString('key/rsa_private.pem');
  dynamic privateKey = RSAKeyParser().parse(privatePem);
  final encrypt = Encrypter(RSA(privateKey: privateKey));
  return encrypt.decrypt(Encrypted.fromBase16(data));
}

3.AES加解密

encrypt: ^4.0.0
/// AES 加密
String aesEncrypt(String data, String aesKey) {
  try {
    final key = ce.Key.fromUtf8(aesKey);
    final encrypt = ce.Encrypter(ce.AES(key, mode: ce.AESMode.ecb));
    final encrypted = encrypt.encrypt(data, iv: ce.IV.fromLength(64));
    return encrypted.base64;
  } catch (err) {
    print("aes encode error:$err");
    return data;
  }
}

/// AES 解密
dynamic aesDecrypt(dynamic data, String aesKey) {
  try {
    final newData = Encrypted.fromBase64(data);
    final key = ce.Key.fromUtf8(aesKey);
    final encrypt = ce.Encrypter(ce.AES(key, mode: ce.AESMode.ecb));
    final encrypted = encrypt.decrypt(newData, iv: ce.IV.fromLength(64));
    return encrypted;
  } catch (err) {
    print("aes decode error:$err");
    return data;
  }
}

4.RSA+AES -> 加密应用

    //随机数
    var randomKey = getRandomAesKey1(16);
    logs("随机数: $randomKey");
    //rsa加
    var aesKey = await rsaEncrypt(randomKey);
    logs("rsa加: $aesKey");
    //rsa解
    var rsaKey = await rsaDecrypt(aesKey);
    logs("rsa解: $rsaKey");

    //json加
    var jsonData = jsonEncode(map);
    logs("json加: $jsonData");
    //aes加
    var content = aesEncrypt(jsonData, randomKey);
    logs("aes加: $content");

    //生成新数据
    Map<String, dynamic> newMap = {};
    newMap.putIfAbsent("aesKey", () => aesKey); //rsa+16
    newMap.putIfAbsent("content", () => content); //jsonData-> aes+16 -> aesData
    var newJsonData = jsonEncode(newMap);
    logs("生成新数据$newJsonData");

5.RSA+AES -> 解密应用

      //data
      var data = response.data as Map<String, dynamic>;
      logs("data2: $data");
      //aes解
      var aesData = aesDecrypt(data["data"] ?? "", randomKey);
      logs("aes解2: $aesData");
      //json解
      var newJsonData = jsonDecode(aesData);
      logs("json解2: $newJsonData");
      //替换
      data["data"] = newJsonData;
      logs("替换2: ${data["data"]}");

5.通过modules和exponent来生成公钥.

pointycastle: ^1.0.2
  getPublicKey(String modules, String exponent) {
    var modulusInt = BigInt.parse(modules, radix: 16);
    var exponentInt = BigInt.parse(exponent, radix: 16);
    return RSAPublicKey(modulusInt, exponentInt);
  }

  rsaEncrypt(String text, String modules) {
    var publicKey = getPublicKey(modules, Config.exponent);
    final encrypter = Encrypter(RSA(publicKey: publicKey));
    final res = encrypter.encrypt(text).base64;
    return res;
  }

参考:
https://blog.51cto.com/jianguo/5115638?b=totalstatistic
https://blog.csdn.net/bachelores/article/details/126899469
https://cloud.tencent.com/developer/article/1563771?from=15425&areaSource=102001.1&traceId=t-In9Q1JR9tPxlPa_VCyq

上一篇下一篇

猜你喜欢

热点阅读