美文网首页
25.1.flutter-RSA+AES加密

25.1.flutter-RSA+AES加密

作者: ChaosHeart | 来源:发表于2023-02-16 10:01 被阅读0次

    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

    相关文章

      网友评论

          本文标题:25.1.flutter-RSA+AES加密

          本文链接:https://www.haomeiwen.com/subject/yykpkdtx.html