Flutter如何实现RSA加密

想在Flutter中实现RSA加密功能,请问具体该怎么操作?目前项目中需要对接一个第三方API,对方要求数据必须用RSA公钥加密后再传输。尝试过用flutter_rsa插件但遇到兼容性问题,在Android上正常但iOS报错。有没有跨平台兼容性好的实现方案?最好是能支持以下场景:1) 生成密钥对 2) 用公钥加密字符串 3) 用私钥解密数据。求推荐可靠的依赖库和具体代码示例,谢谢!

2 回复

Flutter中实现RSA加密可使用encrypt库。步骤如下:

  1. 引入encrypt: ^5.0.1依赖。
  2. 使用RSAKeyParser解析公钥/私钥。
  3. 调用RSA加密方法加密数据。
  4. 注意处理密钥格式(PKCS1或PKCS8)。

示例代码:

import 'package:encrypt/encrypt.dart';

final publicKey = RSAKeyParser().parse(publicKeyString);
final encrypter = Encrypter(RSA(publicKey: publicKey));
final encrypted = encrypter.encrypt(plainText);

更多关于Flutter如何实现RSA加密的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现RSA加密,可以使用pointycastleasn1lib库。以下是具体步骤和示例代码:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  pointycastle: ^3.6.2
  asn1lib: ^1.1.2

2. 实现RSA加密

import 'dart:convert';
import 'package:pointycastle/export.dart';
import 'package:asn1lib/asn1lib.dart';

// 生成RSA密钥对
AsymmetricKeyPair<PublicKey, PrivateKey> generateRSAkeyPair() {
  final keyGen = KeyGenerator('RSA');
  keyGen.init(ParametersWithRandom(
      RSAKeyGeneratorParameters(BigInt.parse('65537'), 2048, 64),
      SecureRandom()));
  return keyGen.generateKeyPair();
}

// RSA加密
String encryptWithPublicKey(String plaintext, RSAPublicKey publicKey) {
  final encryptor = OAEPEncoding(RSAEngine())
    ..init(true, PublicKeyParameter<RSAPublicKey>(publicKey));
  
  final encoded = utf8.encode(plaintext);
  final encrypted = encryptor.process(encoded);
  return base64.encode(encrypted);
}

// 从PEM格式解析公钥
RSAPublicKey parsePublicKeyFromPem(String pem) {
  final publicKeyDER = _decodePEM(pem);
  final asn1Parser = ASN1Parser(publicKeyDER);
  final topLevelSeq = asn1Parser.nextObject() as ASN1Sequence;
  final publicKeyBitString = topLevelSeq.elements[1] as ASN1BitString;
  
  final publicKeyAsn = ASN1Parser(publicKeyBitString.contentBytes());
  final publicKeySeq = publicKeyAsn.nextObject() as ASN1Sequence;
  
  final modulus = publicKeySeq.elements[0] as ASN1Integer;
  final exponent = publicKeySeq.elements[1] as ASN1Integer;
  
  return RSAPublicKey(modulus.valueAsBigInteger, exponent.valueAsBigInteger);
}

List<int> _decodePEM(String pem) {
  final startsWith = [
    '-----BEGIN PUBLIC KEY-----',
    '-----BEGIN RSA PUBLIC KEY-----'
  ];
  final endsWith = [
    '-----END PUBLIC KEY-----',
    '-----END RSA PUBLIC KEY-----'
  ];
  
  bool isOpenPem(String pem) {
    return startsWith.any((s) => pem.startsWith(s));
  }
  
  if (!isOpenPem(pem)) {
    return base64.decode(pem);
  }
  
  final lines = LineSplitter.split(pem).toList();
  final encoded = lines.sublist(1, lines.length - 1).join();
  return base64.decode(encoded);
}

// 使用示例
void main() {
  // 生成密钥对
  final keyPair = generateRSAkeyPair();
  final publicKey = keyPair.publicKey as RSAPublicKey;
  
  // 加密数据
  final plaintext = 'Hello RSA Encryption!';
  final encrypted = encryptWithPublicKey(plaintext, publicKey);
  print('加密结果: $encrypted');
}

主要步骤说明:

  1. 密钥生成:使用KeyGenerator生成RSA密钥对
  2. 加密处理:使用OAEP填充模式(推荐用于安全加密)
  3. 密钥解析:支持从PEM格式解析公钥
  4. 编码转换:处理Base64和UTF-8编码转换

注意事项:

  • 实际使用时建议将私钥妥善保管
  • 生产环境建议使用2048位或以上密钥长度
  • 可配合服务器端进行密钥交换和验证

如果需要解密功能,可以使用类似方法实现RSA解密,使用私钥进行解密操作。

回到顶部