關於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);

 

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