【笔记】Dart实现RSA加解密

前言

Dart实现RSA加解密

通过PEM文件读取密钥

准备工作

  • 生成RSA公私钥.pem文件
1
2
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out assets/key/private.pem
openssl pkey -in private.pem -pubout -out assets/key/public.pem

下载依赖

1
2
dart pub get encrypt
dart pub get pointycastle

RSA加密为Encrypted对象

RAS公钥加密

publicKeySrc:公钥文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import 'dart:io';

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

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
15
16
17
18
19
import 'dart:io';

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

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
15
16
17
18
19
import 'dart:io';

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

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
15
16
17
18
19
import 'dart:io';

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

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));
}

通过字符串读取密钥

准备工作

  • 生成RSA公私钥字符串
1
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 | tee >(openssl pkey -pubout >&2)

下载依赖

1
2
dart pub get encrypt
dart pub get pointycastle

RSA加密为Encrypted对象

RAS公钥加密

publicKeyString:公钥字符串

1
2
3
4
5
6
7
8
9
10
11
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';

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
9
10
11
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';

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
9
10
11
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';

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
9
10
11
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';

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