You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中RSA密钥对生成陷入无限计算问题求助

Flutter RSA密钥对生成陷入无限计算的解决办法

核心原因

RSA密钥对生成属于CPU密集型操作,直接在Flutter主线程执行会阻塞UI线程,导致程序看起来像陷入无限计算;另外部分SecureRandom实现在移动设备上效率低下,也会拖慢密钥生成速度。

解决方案

1. 将密钥生成移至隔离线程(Isolate)

Flutter的Isolate可以在后台线程执行耗时操作,避免阻塞主线程。改造你的PointyCastle代码如下:

import 'dart:isolate';
import 'package:flutter/widgets.dart';
import 'package:pointycastle/pointycastle.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 启动隔离线程执行密钥生成
  final receivePort = ReceivePort();
  await Isolate.spawn(_generateKeyPairInIsolate, receivePort.sendPort);
  
  // 接收隔离线程返回的密钥对
  final pair = await receivePort.first as AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey>;
  
  print(pair.privateKey.toString());
  print("keys generated");
}

// 隔离线程中执行的密钥生成逻辑
void _generateKeyPairInIsolate(SendPort sendPort) {
  final pair = generateRSAkeyPair(exampleSecureRandom());
  sendPort.send(pair);
}

AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey> generateRSAkeyPair(
    SecureRandom secureRandom, {int bitLength = 2048}) {
  final keyGen = RSAKeyGenerator()
    ..init(ParametersWithRandom(
        RSAKeyGeneratorParameters(BigInt.parse('65537'), bitLength, 64),
        secureRandom));

  final pair = keyGen.generateKeyPair();
  final myPublic = pair.publicKey as RSAPublicKey;
  final myPrivate = pair.privateKey as RSAPrivateKey;

  return AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey>(myPublic, myPrivate);
}

SecureRandom exampleSecureRandom() {
  final secureRandom = FortunaRandom();
  final seedSource = Random.secure();
  final seeds = <int>[];
  for (int i = 0; i < 32; i++) {
    seeds.add(seedSource.nextInt(255));
  }
  secureRandom.seed(KeyParameter(Uint8List.fromList(seeds)));
  return secureRandom;
}

2. 替换高效的SecureRandom实现

如果使用FortunaRandom效率过低,可以尝试使用平台原生的安全随机数生成能力,或第三方库优化随机数生成速度,进而加快密钥对生成流程。

3. 临时降低密钥长度测试(仅用于调试)

在性能较低的设备上测试时,可临时将密钥长度改为1024位(生产环境必须使用2048位及以上保证安全性),验证是否能正常生成密钥,以此排除性能瓶颈问题:

// 调用生成方法时指定bitLength参数
final pair = generateRSAkeyPair(exampleSecureRandom(), bitLength: 1024);

针对rsa_encrypt库的改造

同样,对于rsa_encrypt库的代码,也需要将密钥生成逻辑移至Isolate:

import 'dart:isolate';
import 'package:flutter/widgets.dart';
import 'package:rsa_encrypt/rsa_encrypt.dart';
import 'package:pointycastle/api.dart' as crypto;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  final receivePort = ReceivePort();
  await Isolate.spawn(_getKeyPairInIsolate, receivePort.sendPort);
  
  final keyPair = await receivePort.first as crypto.AsymmetricKeyPair;
  print(keyPair);
}

void _getKeyPairInIsolate(SendPort sendPort) async {
  var helper = RsaKeyHelper();
  final keyPair = await helper.computeRSAKeyPair(helper.getSecureRandom());
  sendPort.send(keyPair);
}

内容的提问来源于stack exchange,提问作者Yousuf Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:47:27