关于Flutter中RSA分段加密

1.首页需要公钥私钥

生成方法百度很多;

在flutter中,密钥文件直接存放在目录中是无法使用File读取到的,只能放在asset中才可以,所以需要在 pubspec.yaml中增加相关密钥文件才行,例如将密钥文件存放在与 pubspec.yaml 同级的目录 keys 下,则需要在 pubspec.yaml 中增加如下代码

assets:
  - keys/private_key.pem
  - keys/public_key.pem

2导入encrypt库

在pubspec.yaml文件中添加

encrypt: ^3.3.1

3.创建加密辅助类EncryptHelper.dart

import 'dart:convert';
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';
import 'dart:async';
import 'package:flutter/services.dart' show rootBundle;

final parser = RSAKeyParser();

abstract class EncryptHelper {

  static Future<String> decode(String decoded) async {
    String privateKeyString = await rootBundle.loadString('keys/private_key.pem');

    final privateKey = parser.parse(privateKeyString);

    final encrypter = Encrypter(RSA(privateKey: privateKey));
    return encrypter.decrypt(Encrypted.fromBase64(decoded));
  }

  // 长参数分段加密
  static Future<String>  encodeLong(Map para) async{
    // 设置加密对象
    String publicKeyString = await rootBundle.loadString('keys/public_key.pem');
    RSAPublicKey publicKey = parser.parse(publicKeyString);
    final encrypter = Encrypter(RSA(publicKey: publicKey));
    // map转成json字符串
    final jsonStr = jsonEncode(para);
    // 原始json转成字节数组
    List<int> sourceByts = utf8.encode(jsonStr);
    // 数据长度
    int inputLen = sourceByts.length;
    // 加密最大长度
    int maxLen = 117;
    // 存放加密后的字节数组
    List<int> totalByts = List();
    // 分段加密 步长为117
    for (var i = 0; i < inputLen; i += maxLen) {
      // 还剩多少字节长度
      int endLen = inputLen - i;
      List<int> item;
      if (endLen > maxLen) {
        item = sourceByts.sublist(i, i+maxLen);
      }else{
        item = sourceByts.sublist(i, i+endLen);
      }
      // 加密后的对象转换成字节数组再存放到容器
      totalByts.addAll(encrypter.encryptBytes(item).bytes);
    }
    // 加密后的字节数组转换成base64编码并返回
    String en = base64.encode(totalByts);
    return en;
  }

}

4.项目使用

// 参数加密
      var encodePara = await EncryptHelper.encodeLong(params);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章