Flutter RSA加密解密算法的实现

在Flutter中实现RSA加密解密时遇到了几个问题:

  1. 使用pointycastleencrypt包进行RSA操作时,如何正确生成公钥和私钥?能否提供完整的密钥生成代码示例?
  2. 从PEM格式字符串加载密钥时总是失败,如何正确处理PKCS#1或PKCS#8格式的PEM文件?
  3. 加密后的数据在跨平台(如Android/iOS后端)解密时出现乱码,是否需要手动处理填充方式?具体应该用OAEP还是PKCS1
  4. 有没有性能优化的建议?大文件分段加密的最佳实践是什么?
3 回复

作为屌丝程序员,我来分享下Flutter中RSA加密解密的基本实现。首先需要引入pointycastleencrypt两个库。

  1. 生成公钥私钥对:使用Pointycastle库生成RSA密钥对。
import 'package:pointycastle/api.dart';
import 'package:pointycastle/key_generators/api.dart';
import 'package:pointycastle/random/secure_random.dart';
import 'package:pointycastle/securesRandoms/fortuna_secure_random.dart';

void generateKeys() {
  var secureRandom = FortunaRandom();
  var random = [1, 2, 3, 4]; // 初始化随机数
  secureRandom.seed(KeyParameter(random));
  
  var keyGenerator = KeyGenerator('RSA').init(
    ParametersWithRandom(PrivateKeyParameters(0, 0), secureRandom)
  );
  AsymmetricKeyPair keyPair = keyGenerator.generateKeyPair();
  String publicKeyPEM = keyPair.publicKey.toString();
  String privateKeyPEM = keyPair.privateKey.toString();
}
  1. 加密:使用encrypt库进行RSA加密。
import 'package:encrypt/encrypt.dart' as encrypt;

String rsaEncrypt(String plainText, String publicKeyPEM) {
  final publicKey = encrypt.RSAKeyParser().parse(publicKeyPEM);
  final encrypter = encrypt.Encrypter(encrypt.RSA(publicKey: publicKey));
  final encrypted = encrypter.encrypt(plainText);
  return encrypted.base64;
}
  1. 解密:使用私钥解密。
String rsaDecrypt(String encryptedText, String privateKeyPEM) {
  final privateKey = encrypt.RSAKeyParser().parse(privateKeyPEM);
  final encrypter = encrypt.Encrypter(encrypt.RSA(privateKey: privateKey));
  final decrypted = encrypter.decryptBase64(encryptedText);
  return decrypted;
}

以上就是在Flutter中实现RSA加密解密的基本方法,记得处理好密钥的存储和传输安全问题哦!

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


作为一个屌丝程序员,我来简单介绍下Flutter中RSA加密解密的实现。首先确保安装了pointycastle库用于底层加密运算。初始化公钥和私钥时,可以使用RSAKeyGenerator()生成。加密时将数据转换为BigInt,通过PKCS1Encoding包装后使用公钥加密;解密则用私钥操作。示例代码如下:

import 'package:pointycastle/api.dart';
import 'package:pointycastle/key_generators/rsa_key_generator.dart';
import 'package:pointycastle/pointycastle.dart';

// 生成RSA密钥对
var params = ParametersWithRandom(RSAKeyGeneratorParameter(2048), Random());
var keyGenerator = RSAKeyGenerator()..init(params);
var keyPair = keyGenerator.generateKeyPair();

// 加密
var encryptor = PKCS1Encoder().init(PublicKeyParameter(keyPair.publicKey));
var encrypted = encryptor.process('Hello'.codeUnits);

// 解密
var decryptor = PKCS1Encoder().init(PrivateKeyParameter(keyPair.privateKey));
var decrypted = decryptor.process(encrypted);
print(String.fromCharCodes(decrypted)); // 输出 Hello

以上代码展示了RSA的基本加密解密流程,适合小量数据加密。注意RSA不适合加密大文本,可结合AES使用。

Flutter 中的 RSA 加密解密实现

在 Flutter 中实现 RSA 加密解密可以使用 pointycastleencrypt 这两个常用加解密库。以下是使用 encrypt 包的实现方式:

1. 添加依赖

首先在 pubspec.yaml 中添加依赖:

dependencies:
  encrypt: ^5.0.0

然后运行 flutter pub get

2. RSA 加密解密实现

import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';

// 生成RSA密钥对
AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey> generateRSAKeyPair() {
  final keyGen = RSAKeyGenerator();
  final random = FortunaRandom();
  final params = RSAKeyGeneratorParameters(
    BigInt.parse('65537'),
    2048,
    64,
  );
  keyGen.init(ParametersWithRandom(params, random));
  return keyGen.generateKeyPair();
}

// 加密
String rsaEncrypt(String plainText, RSAPublicKey publicKey) {
  final encrypter = Encrypter(RSA(publicKey: publicKey));
  return encrypter.encrypt(plainText).base64;
}

// 解密
String rsaDecrypt(String encryptedText, RSAPrivateKey privateKey) {
  final encrypter = Encrypter(RSA(privateKey: privateKey));
  return encrypter.decrypt(Encrypted.fromBase64(encryptedText));
}

// 使用示例
void main() {
  final keyPair = generateRSAKeyPair();
  
  final publicKey = keyPair.publicKey;
  final privateKey = keyPair.privateKey;
  
  const originalText = 'Hello, RSA!';
  
  final encrypted = rsaEncrypt(originalText, publicKey);
  print('Encrypted: $encrypted');
  
  final decrypted = rsaDecrypt(encrypted, privateKey);
  print('Decrypted: $decrypted');
}

其他注意事项

  1. 密钥存储:在实际应用中,私钥需要安全存储,可以使用 Flutter 的 flutter_secure_storage 包。

  2. 密钥长度:示例中使用的是 2048 位密钥,这是目前推荐的安全长度。

  3. 性能:RSA 运算较慢,不适合加密大块数据,通常用于加密对称密钥。

  4. 平台差异:Android 和 iOS 平台可能有不同的加密实现细节,需要注意测试。

回到顶部