【笔记】Dart的RSA加解密

前言

Dart的RSA加解密

通过PEM文件读取密钥

准备工作

  • PEM文件的RSA公钥
assets/key/public.pem
1
2
3
4
5
6
7
8
9
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2/vF49zKHdP0EY1B9Zim
5t4X1GsnP1TEYgYMnWXQNLluWV53iInEJBmw/xf++Ohbgp7WhAFcjlRJ6Bxnqj6n
CtAsXAjIXnv1UDCabw/pUb2Tm349I990wSGEeIbuSRPD/t1O4qOTgpvCWRDgVVfX
PILWBkshMhQA7xs0LeEXtimtCLnjUywlXw+Hthlx2Zi6Ba656HKro9EPZ2BRGGUd
mbPLWibeD7MF8ETz5R0w/N+3GyTnizPihsFU4sPOnWwhsR0FWz0i+uVeYrIkpyo6
hkXFQMLt4RzA9VVsd+nk5h/SQ/NQ38VrpUlLfcL4K/pzUXCrJ6X5KYOIfEcG16QG
sQIDAQAB
-----END PUBLIC KEY-----
  • PEM文件的RSA私钥
assets/key/private.pem
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDb+8Xj3Mod0/QR
jUH1mKbm3hfUayc/VMRiBgydZdA0uW5ZXneIicQkGbD/F/746FuCntaEAVyOVEno
HGeqPqcK0CxcCMhee/VQMJpvD+lRvZObfj0j33TBIYR4hu5JE8P+3U7io5OCm8JZ
EOBVV9c8gtYGSyEyFADvGzQt4Re2Ka0IueNTLCVfD4e2GXHZmLoFrrnocquj0Q9n
YFEYZR2Zs8taJt4PswXwRPPlHTD837cbJOeLM+KGwVTiw86dbCGxHQVbPSL65V5i
siSnKjqGRcVAwu3hHMD1VWx36eTmH9JD81DfxWulSUt9wvgr+nNRcKsnpfkpg4h8
RwbXpAaxAgMBAAECggEAOXZP39CJnzcBVyBd7WhdmIrFEMCYtOtQjQZlfyvcMhmJ
4KBTev/5kzB+0nOTL7OKS9lv0XWFlswfrhjVX1wUSDfOjo/gvwWEM9kuTfqLCMYL
a5+TGu7A0b4Om2krjz0xgj6O35a47nH/V0KYRtK2L2FBxM0VM76T6+FgROe6SOOn
8BOvAiljHu+hzxOAx8T881daO2TpLXGcwSHcT8UfhIIiE7KBjqUmgDQwkBNcZvhd
uhNsSMBjNpf0sws6N2bJ3fK/Yo+23obW03yKqdWOXZ1/QD8PfdRn1gkNn1HwNKTU
JuC2K7gUNfHugYDywz2wL2YMiGwzBKOdVULMMPhzkQKBgQD3e2bOIcW5+OOeabIq
gGBzoOLaElUwJtFKZBNPG84t+mfYAzwHYkf416WXsR6ql0mLsmZaKBGYk+H5/Kco
1xxPfHlENHHZVfof1K1pQLxLoF9vW7rtMVT+CwdgbppBXoVDcqkri8h9aVPTPL/D
q6a9qFfcTO+wlfnCgaxXqlDAtQKBgQDjjhPx8sf55G7dZjl9wzfgGjsBRxOeecWr
dcfRy4S/WxTC0NwTNaPMyb534RbwHh/MDg9naoLg0kUZQ+AfzleUC5D/PI0G8fO7
qADXenb2ZwflBkyw5JmSsk2iJ8tREFgLfqAKrGDTSVc33q6mfm+fZHvZsGVUgxvr
riB1EZc3jQKBgFlUib9OIXkHheHgdRcyT55tLHVauLUwzcr0ZKPhfYLLKECoqjpg
F2qTLIqcvF0HTtzGAHv6ip9wgdkigZQUUXu/imY8J/wzNJ3Yvt+HJnCF6uzfR5Hm
hK9Oe9MrGTMPUzsNYFL/mdbq9f8BppaSlxVOdqhmfP5YpFa5R+Q87fkhAoGBAKnT
rGEC72o5qOAFXdzVKEtRaD4A3MyGVxcq1NFnUZA6mpj2pXiUrMW2vzbav3K/GL4C
tE5bOIgvhbBgbtFt/wCXTUSf3SSUyHGB5fbrCAPHSyYK+IuAYHkSJ0xg5KWATCVw
AGNW2QB3GOeygqfxbr8HkEMcGdPj8Z+IGeMlGLU1AoGBANpu3Sx5J6ELxpL3110I
6GfhmADZ/k8rTlkST+sfUJI1R3TcKqLBbyiNd1id1O1rKrnPfym41lNWz6MWRn6m
1GPrdTNZIfMJugEfJyaF2vojWyFXMEA/pvjfHeEjQLsoEoupKXLH/Tkm6zaNunJH
cX2rgz3C2PGugq1h2EZGBU5z
-----END PRIVATE KEY-----

下载依赖

1
2
dart pub get encrypt
dart pub get pointycastle

引入依赖

1
2
3
4
import 'dart:io';

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

RSA加密为Encrypted对象

RAS公钥加密

publicKeySrc:公钥文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Future<T> parseKeyFromFile<T extends RSAAsymmetricKey>(String filename) async {
final file = File(filename);
final key = await file.readAsString();
final parser = RSAKeyParser();
return parser.parse(key) as T;
}

Future<Encrypted> encodeString(String publicKeySrc, String content) async {
// 从文件中读取公钥
final publicKey = await parseKeyFromFile<RSAPublicKey>(publicKeySrc);
// 通过公钥加密
final encrypter = Encrypter(RSA(publicKey: publicKey));
return encrypter.encrypt(content);
}

RSA私钥解密

privateKeySrc:私钥文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Future<T> parseKeyFromFile<T extends RSAAsymmetricKey>(String filename) async {
final file = File(filename);
final key = await file.readAsString();
final parser = RSAKeyParser();
return parser.parse(key) as T;
}

Future<String> decodeString(String privateKeySrc, Encrypted content) async {
// 从文件中读取私钥
final privateKey = await parseKeyFromFile<RSAPrivateKey>(privateKeySrc);
// 通过私钥解密
final encrypter = Encrypter(RSA(privateKey: privateKey));
return encrypter.decrypt(content);
}

RSA加密为Base64字符串

RAS公钥加密

publicKeySrc:公钥文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Future<T> parseKeyFromFile<T extends RSAAsymmetricKey>(String filename) async {
final file = File(filename);
final key = await file.readAsString();
final parser = RSAKeyParser();
return parser.parse(key) as T;
}

Future<Encrypted> encodeString(String publicKeySrc, String content) async {
// 从文件中读取公钥
final publicKey = await parseKeyFromFile<RSAPublicKey>(publicKeySrc);
// 通过公钥加密
final encrypter = Encrypter(RSA(publicKey: publicKey));
return encrypter.encrypt(content).base64;
}

RSA私钥解密

privateKeyString:私钥字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Future<T> parseKeyFromFile<T extends RSAAsymmetricKey>(String filename) async {
final file = File(filename);
final key = await file.readAsString();
final parser = RSAKeyParser();
return parser.parse(key) as T;
}

Future<String> decodeString(String privateKeySrc, Encrypted content) async {
// 从文件中读取私钥
final privateKey = await parseKeyFromFile<RSAPrivateKey>(privateKeySrc);
// 通过私钥解密
final encrypter = Encrypter(RSA(privateKey: privateKey));
encrypter.decrypt(Encrypted.fromBase64(content));
}

通过字符串读取密钥

准备工作

  • PEM格式字符串的RSA公钥
1
2
3
4
5
6
7
8
9
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2/vF49zKHdP0EY1B9Zim
5t4X1GsnP1TEYgYMnWXQNLluWV53iInEJBmw/xf++Ohbgp7WhAFcjlRJ6Bxnqj6n
CtAsXAjIXnv1UDCabw/pUb2Tm349I990wSGEeIbuSRPD/t1O4qOTgpvCWRDgVVfX
PILWBkshMhQA7xs0LeEXtimtCLnjUywlXw+Hthlx2Zi6Ba656HKro9EPZ2BRGGUd
mbPLWibeD7MF8ETz5R0w/N+3GyTnizPihsFU4sPOnWwhsR0FWz0i+uVeYrIkpyo6
hkXFQMLt4RzA9VVsd+nk5h/SQ/NQ38VrpUlLfcL4K/pzUXCrJ6X5KYOIfEcG16QG
sQIDAQAB
-----END PUBLIC KEY-----
  • PEM格式字符串的RSA私钥
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDb+8Xj3Mod0/QR
jUH1mKbm3hfUayc/VMRiBgydZdA0uW5ZXneIicQkGbD/F/746FuCntaEAVyOVEno
HGeqPqcK0CxcCMhee/VQMJpvD+lRvZObfj0j33TBIYR4hu5JE8P+3U7io5OCm8JZ
EOBVV9c8gtYGSyEyFADvGzQt4Re2Ka0IueNTLCVfD4e2GXHZmLoFrrnocquj0Q9n
YFEYZR2Zs8taJt4PswXwRPPlHTD837cbJOeLM+KGwVTiw86dbCGxHQVbPSL65V5i
siSnKjqGRcVAwu3hHMD1VWx36eTmH9JD81DfxWulSUt9wvgr+nNRcKsnpfkpg4h8
RwbXpAaxAgMBAAECggEAOXZP39CJnzcBVyBd7WhdmIrFEMCYtOtQjQZlfyvcMhmJ
4KBTev/5kzB+0nOTL7OKS9lv0XWFlswfrhjVX1wUSDfOjo/gvwWEM9kuTfqLCMYL
a5+TGu7A0b4Om2krjz0xgj6O35a47nH/V0KYRtK2L2FBxM0VM76T6+FgROe6SOOn
8BOvAiljHu+hzxOAx8T881daO2TpLXGcwSHcT8UfhIIiE7KBjqUmgDQwkBNcZvhd
uhNsSMBjNpf0sws6N2bJ3fK/Yo+23obW03yKqdWOXZ1/QD8PfdRn1gkNn1HwNKTU
JuC2K7gUNfHugYDywz2wL2YMiGwzBKOdVULMMPhzkQKBgQD3e2bOIcW5+OOeabIq
gGBzoOLaElUwJtFKZBNPG84t+mfYAzwHYkf416WXsR6ql0mLsmZaKBGYk+H5/Kco
1xxPfHlENHHZVfof1K1pQLxLoF9vW7rtMVT+CwdgbppBXoVDcqkri8h9aVPTPL/D
q6a9qFfcTO+wlfnCgaxXqlDAtQKBgQDjjhPx8sf55G7dZjl9wzfgGjsBRxOeecWr
dcfRy4S/WxTC0NwTNaPMyb534RbwHh/MDg9naoLg0kUZQ+AfzleUC5D/PI0G8fO7
qADXenb2ZwflBkyw5JmSsk2iJ8tREFgLfqAKrGDTSVc33q6mfm+fZHvZsGVUgxvr
riB1EZc3jQKBgFlUib9OIXkHheHgdRcyT55tLHVauLUwzcr0ZKPhfYLLKECoqjpg
F2qTLIqcvF0HTtzGAHv6ip9wgdkigZQUUXu/imY8J/wzNJ3Yvt+HJnCF6uzfR5Hm
hK9Oe9MrGTMPUzsNYFL/mdbq9f8BppaSlxVOdqhmfP5YpFa5R+Q87fkhAoGBAKnT
rGEC72o5qOAFXdzVKEtRaD4A3MyGVxcq1NFnUZA6mpj2pXiUrMW2vzbav3K/GL4C
tE5bOIgvhbBgbtFt/wCXTUSf3SSUyHGB5fbrCAPHSyYK+IuAYHkSJ0xg5KWATCVw
AGNW2QB3GOeygqfxbr8HkEMcGdPj8Z+IGeMlGLU1AoGBANpu3Sx5J6ELxpL3110I
6GfhmADZ/k8rTlkST+sfUJI1R3TcKqLBbyiNd1id1O1rKrnPfym41lNWz6MWRn6m
1GPrdTNZIfMJugEfJyaF2vojWyFXMEA/pvjfHeEjQLsoEoupKXLH/Tkm6zaNunJH
cX2rgz3C2PGugq1h2EZGBU5z
-----END PRIVATE KEY-----

下载依赖

1
2
dart pub get encrypt
dart pub get pointycastle

引入依赖

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

RSA加密为Encrypted对象

RAS公钥加密

publicKeyString:公钥字符串

1
2
3
4
5
6
7
8
Encrypted encodeString(String publicKeyString, String content) {
// 将公钥字符串转换为公钥对象
final publicKey = RSAKeyParser().parse(publicKeyString);
publicKey as RSAPublicKey;
// 通过公钥加密
final encrypter = Encrypter(RSA(publicKey: publicKey));
return encrypter.encrypt(content);
}

RSA私钥解密

privateKeyString:私钥字符串

1
2
3
4
5
6
7
8
String decodeString(String privateKeyString, Encrypted content) {
// 将私钥字符串转换为密钥对象
final privateKey = RSAKeyParser().parse(privateKeyString);
privateKey as RSAPrivateKey;
// 通过私钥解密
final encrypter = Encrypter(RSA(privateKey: privateKey));
return encrypter.decrypt(content);
}

RSA加密为Base64字符串

RAS公钥加密

publicKeyString:公钥字符串

1
2
3
4
5
6
7
8
String encodeString(String publicKeyString, String content) {
// 将公钥字符串转换为公钥对象
final publicKey = RSAKeyParser().parse(publicKeyString);
publicKey as RSAPublicKey;
// 通过公钥加密
final encrypter = Encrypter(RSA(publicKey: publicKey));
return encrypter.encrypt(content).base64;
}

RSA私钥解密

privateKeyString:私钥字符串

1
2
3
4
5
6
7
8
String decodeString(String privateKeyString, Encrypted content) {
// 将私钥字符串转换为密钥对象
final privateKey = RSAKeyParser().parse(privateKeyString);
privateKey as RSAPrivateKey;
// 通过私钥解密
final encrypter = Encrypter(RSA(privateKey: privateKey));
return encrypter.decrypt(Encrypted.fromBase64(content));
}

完成

参考文献

pub.dev
pub.dev
亿速云——iii