pointycastle库下有一个分段加解密的例子,测试发现加密没有问题,解密缺有问题,后来根了下源码,发现作者实现的有些问题,索性自己来实现一个,部分代码参考网络。
代码如下:
import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';
import 'package:asn1lib/asn1lib.dart';
import 'package:pointycastle/export.dart';
class RSAUtils {
static RSAPublicKey publicKey;
static RSAPrivateKey privateKey;
static RSAUtils instance;
//单例模式
static RSAUtils getInstance(String publicKeyFile, String privateKeyFile) {
if (instance == null) {
instance = RSAUtils(publicKeyFile, privateKeyFile);
}
return instance;
}
//保证PEM证书只被解析一次
RSAUtils(String publicKeyFile, String privateKeyFile) {
if (publicKeyFile != null) {
publicKey = parse(publicKeyFile);
}
if (privateKeyFile != null) {
privateKey = parse(privateKeyFile);
}
}
//生成公匙 和 私匙,默认1024。
static List<String> generateKeys([int bits = 1024]) {
var rnd = getSecureRandom();
var rsapars = RSAKeyGeneratorParameters(BigInt.parse("65537"), bits, 64);
var params = ParametersWithRandom(rsapars, rnd);
var keyGenerator = KeyGenerator("RSA");
keyGenerator.init(params);
AsymmetricKeyPair<PublicKey, PrivateKey> keyPair =
keyGenerator.generateKeyPair();
RSAPrivateKey privateKey = keyPair.privateKey;
RSAPublicKey publicKey = keyPair.publicKey;
var pubKey = encodePublicKeyToPemPKCS1(publicKey);
var priKey = encodePrivateKeyToPemPKCS1(privateKey);
return [pubKey, priKey];
}
///RSA公钥加密
Uint8List encryptByPublicKey(Uint8List data) {
try {
var keyParameter = () => PublicKeyParameter<RSAPublicKey>(publicKey);
AsymmetricBlockCipher cipher = AsymmetricBlockCipher("RSA/PKCS1");
cipher.reset();
cipher.init(true, keyParameter());
int index = 0;
int strlength = data.length;
final keysize = publicKey.modulus.bitLength ~/ 8 - 11;
final blocksize = publicKey.modulus.bitLength ~/ 8;
final numBlocks =
(strlength ~/ keysize) + ((strlength % keysize != 0) ? 1 : 0);
Uint8List list = Uint8List(blocksize * numBlocks);
int