Flutter教程一键登录RSA加密解密实现

在Flutter中实现一键登录功能时,如何正确集成RSA加密解密?目前参照教程调用加密接口后,客户端返回的数据始终解密失败,但相同加密逻辑在Android原生端测试正常。具体现象是:使用公钥加密的登录请求数据发送到服务端后,服务端返回的加密响应用私钥解密时抛出"Bad Padding Exception"。已确认密钥对匹配,且尝试了flutter_rsa和pointycastle两种库。是否需要特别处理Flutter的加密编码格式?求完整实现流程或排查思路。

3 回复

以下为Flutter实现一键登录时RSA加密解密的简单教程:

  1. 添加依赖:在pubspec.yaml中加入pointycastle库用于RSA加密。
dependencies:
  pointycastle: ^3.4.0
  1. 生成公私钥对:使用Java或后端生成RSA密钥对,并将公钥提供给前端。

  2. Flutter端实现

    • 初始化RSA:

      import 'package:pointycastle/export.dart';
      
      void generateKeyPair() {
          var keyGenerator = KeyGenerator('RSA').init(
              ParametersWithRandom(BaseParameters(2048), SecureRandom()));
          AsymmetricKeyPair<PrivateKey, PublicKey> pair = keyGenerator.generateKeyPair();
          // 获取公私钥
      }
      
    • 加密:

      String encrypt(String publicKey, String data) {
          var encryptor = PaddedBlockCipherImpl(PKCS1Encoding(), RSAEngine())
              ..init(true, PublicKeyParameter(RSAKeyParser().parse(publicKey)));
          List<int> encrypted = encryptor.process(Utf8Encoder().convert(data));
          return Base64Encoder().convert(encrypted);
      }
      
    • 解密(需在服务端完成)。

  3. 服务器验证并解密:服务端使用私钥解密数据,校验用户身份。

  4. 注意事项:确保密钥安全传输,避免泄露。建议结合HTTPS增强安全性。

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


以下为Flutter中实现一键登录时的RSA加密解密教程:

  1. 添加依赖:
dependencies:
  pointycastle: ^3.4.0
  convert: ^3.0.1
  1. 生成公钥和私钥: 使用Pointycastle库生成RSA密钥对。
import 'package:pointycastle/api.dart';
import 'package:pointycastle/key_generators/api.dart';

final keyGenerator = KeyGenerator('RSA').init(Params.empty());
final asymmetricKeyPair = keyGenerator.generateKeyPair();
final privateKey = asymmetricKeyPair.privateKey;
final publicKey = asymmetricKeyPair.publicKey;
  1. 加密数据: 将用户输入的数据用公钥加密。
import 'package:convert/convert.dart';

final input = utf8.encode("待加密的登录信息");
final encryptor = PaddedBlockCipherImpl(PKCS1Padding(), RSAEngine())
  ..init(true, PublicKeyParameter<AsymmetricKey>(publicKey));
final encrypted = encryptor.process(hex.decode(input));
  1. 解密数据: 后端收到加密数据后,使用私钥解密。
final decryptor = PaddedBlockCipherImpl(PKCS1Padding(), RSAEngine())
  ..init(false, PrivateKeyParameter<AsymmetricKey>(privateKey));
final decrypted = decryptor.process(encrypted);
final result = utf8.decode(decrypted);

这样就完成了Flutter中的RSA加密解密过程。注意:实际项目中需妥善保管私钥,并通过安全渠道传输公钥。

Flutter RSA加密解密实现教程

准备工作

首先需要在pubspec.yaml中添加加密库依赖:

dependencies:
  pointycastle: ^3.1.1
  encrypt: ^5.0.1

RSA密钥对生成

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

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

RSA加密实现

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

RSA解密实现

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 = 'Flutter一键登录测试数据';

  // 加密
  final encrypted = rsaEncrypt(originalText, publicKey);
  print('加密后: $encrypted');

  // 解密
  final decrypted = rsaDecrypt(encrypted, privateKey);
  print('解密后: $decrypted');
}

注意:实际应用中,通常服务器会提供公钥用于加密,私钥保存在服务器用于解密。本示例展示了完整的生成、加密、解密流程。

回到顶部