如何将Java实现的RSA-OAEP-SHA256加密代码迁移至Flutter Dart端
方案结论
现有Dart生态完全可以实现和你给出的Java加密逻辑完全对齐的跨平台RSA-OAEP加密,纯Dart实现的pointycastle库支持该算法配置,你之前应该是参数配置没有完全匹配Java端的规则。
依赖引入
在pubspec.yaml中添加以下依赖:
- pointycastle: ^3.7.3
- convert: ^3.1.1
完整Dart实现代码
import 'dart:convert'; import 'dart:typed_data'; import 'package:pointycastle/pointycastle.dart'; import 'package:pointycastle/asymmetric/api.dart'; String rsaOaepEncrypt(String rawData, String encodedPublicKey) { // 对应Java:Base64.decode(encodedPublicKey, Base64.URL_SAFE) Uint8List publicKeyBytes = base64Url.decode(encodedPublicKey); // 对应Java:解析X509格式公钥 KeyFactory keyFactory = KeyFactory('RSA'); X509EncodedKeySpec publicKeySpec = X509EncodedKeySpec(publicKeyBytes); RSAPublicKey publicKey = keyFactory.generatePublic(publicKeySpec) as RSAPublicKey; // 对应Java:初始化OAEP加密参数,完全匹配Java配置 OAEPEncoding cipher = OAEPEncoding( RSAEngine(), Digest('SHA-256'), Digest('SHA-256'), Uint8List(0), ); // 对应Java:cipher.init(1, keyPublic, paramSpec),true表示加密模式 cipher.init( true, PublicKeyParameter<RSAPublicKey>(publicKey), ); // 对应Java:cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)) Uint8List dataBytes = utf8.encode(rawData); Uint8List encryptedBytes = cipher.process(dataBytes); // 对应Java:Base64.encodeToString(abData, Base64.URL_SAFE + Base64.NO_WRAP + Base64.NO_PADDING) String encryptedBase64 = base64Url.encode(encryptedBytes); // 移除末尾的Base64填充符号=,匹配NO_PADDING规则 encryptedBase64 = encryptedBase64.replaceAll(RegExp(r'='), ''); return encryptedBase64; }
注意事项
- 如果你的公钥字符串带PEM格式的头尾标记(比如
-----BEGIN PUBLIC KEY-----、-----END PUBLIC KEY-----)和换行,需要先把这些标记和换行删除之后再传入解码 - 该实现为纯Dart代码,无需调用原生平台API,可同时运行在Android、iOS、Web全平台
- 所有参数配置和Java端100%对齐,加密结果和Java端输出完全一致
内容的提问来源于stack exchange,提问作者Adam Levy
相关产品推荐
相关产品推荐

