You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
app/lib/utils/sc_encrypt_util.dart

159 lines
6.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* ====================================================
* package :
* author : Created by nansi.
* time : 2019-08-22 13:34
* remark :
* ====================================================
*/
import 'package:encrypt/encrypt.dart';
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:pointycastle/asymmetric/api.dart';
import 'package:recook/utils/print_util.dart';
class SCEncryptUtil {
static final String _serverRSAPublicKey = '''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzNWyjYe3qt4YRTDwANxD
PNLAJ9TZBuHsSqSjJM5B35fABwN3gwm5Q/SCz/6kgKTqeSgCVPFYhO/zOD6G8K7E
JLgx95ZIeAB9EkW+xrhFDDthUZAkA03zHJO6SkFKOciLFVi94BdCdGlNFlnaBBqA
+8XvCpD1V8DFc/9cpb5icZvngu8vEkwkbYceCXKUMNxoXY/E2cFe8f2tVFR5pRkQ
gRLbM70jt4yBGOD8pbuk6fcnD7ghGWgzMq/845N3wISSTp/gAQg8403Fk+8AoL+F
KgxUkjUOpPI2XrcpQm0EphuAX4J0Xvo3Hu6TEPZYyqULEXGT2Jukmh0NSkNO0F39
xwIDAQAB
-----END PUBLIC KEY-----
''';
static final String _appRSAPrivateKey = '''-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwJwF6sTXsaenWVz75n991FaIYO06ArFMDRl4g3SgzegHIP3c
3o9QJ+msH90Resowk1On6E1zrVoey55sIiEMnMqxlBrLkYhMZy0hK7eDL53qZ80C
hAxANtmTWV0gPOgaaPb0xrAdDfVgVZepyBTdP8D5t7t6+0BbpHUJeqVyYfZgmLzt
FM2QFDRJ9cWcTJOGe7WVQ483i2J67VYR5hgKMdBWGYJ++6UXzA4EcwkJ/p+yngcl
p5NXZT+Spv7cni/VffmAcp1K+6P4IbRWLpoXQyWc5e9+09q1Djf9Updz2DpJ88fh
RaICRxTteZmoCpqHS2Hr1oKVRe46QlEBEwK3CwIDAQABAoIBABY668Po7Cwo+Xuq
67fyxwcW5a6qMqPU6r4oTmx9rYGWYhxAsJlPWSUCJ0eWMEpHw8t9QEfjiJJdcGh3
5Gsb/WSrUEuTvCMT5B2Ua9ur1oxMYZ2RX9T1xQOPoR4TTYE6GLI8rouwD+pog7Hd
S084eUC+eRPno44UI3+bsnhhWA5OOhXr5JCIr0orYHoAGZTwu/zTRhnNkoCedCS2
4WPhI2meTeP3O7wYNLhkQ94kdupDXnEOIa1XXAxB6gMeDAEq9XIcokARA48Dc1b3
il59W+y4qqbUk5jOXTOim8uxRXIaXl8l5a5oHRYc89PdhJOyifF5KNXFForxUf+u
06K1wiECgYEA5e4M+vgFRd9GITiB1KRAYNfxa1EPjJ7WxLMxi1DUhzJ+HssCJZmc
Gr2LgmDG9iIGcfxqSrcfQcUkfnSfIkqq+Mp7fO89AhzbJL0ix5OJMAb2yQpfncBO
qkupiPMabjagW30MLBmRHKWLmR6srT1OLJreXkT6XsGFoCbd4rnGvdUCgYEA1nK1
jCiEm1ZHSKRV70nAovJyKTvie7z+5I35iiUVxyJ2G5zY5YWkPVdPU44eKqX2xl7a
FstTI/0LTFgBzh43EQ5lXNbLPvyZ58DMiWSEkeBgZa1J8SO53gR99SzSIuTj955B
KZZG7hWfMfEDtU/VKn6W+CW0veTwFWcZHXv6sV8CgYAcoc0p/3KgpdIU1vWL5jxC
EwH0LC70gt8ZtXrI73LXtxjverY0unEu/0V9IdIE2m3VCequjSkuRn9p49nhKk0q
GATSpPQC7Fb5tze6hIvD2Eoo9Mq9WTIykKN281bqPJExc1vtre1dFNxSX/h+xjCS
62IfeRV4cT7Tl6Nv1VSDVQKBgQDBtlzIftFKgGVj+Q6nWLfqeZcmKDIuFEsrqhP/
9f/2IesOhmBm9JGn13aQw4/8dm60Qno+nOw9Vhcen2ECD8kuXxKxClYOT5+2+THJ
6kLWgxiQwDhK2zrKksQ09IfdfWVwCERUjKsF5gIn2s6+uZ6VBETbYzQhVOyKaNcH
CzcpgQKBgCtcw+QtR+YKGBC62AabzOz+KZ+uUYH60R1Q3nbbYx4KuBVbTZPp5/yP
NDL7HaaKOvh1rUrnKh0q0yU6OJuVOw6c9Av6zph9hmfyAiovSEvyEIK6o6w34az/
+4zt/BhRXo24dgnaYZ8a3EEpS0KnlIrgexAWhvTuMAXSeXJXy9B6
-----END RSA PRIVATE KEY-----
''';
test() async {
// int timestamp = DateTime.now().second;
//
// var content = new Utf8Encoder().convert(timestamp.toString());
// String MD5Str = md5.convert(content).toString().toUpperCase();
//
//// // 时间戳的MD5
//// final key = Key.Key.fromUtf8(digest.toString().toUpperCase());
//
// Map data = {"userId": 111, "timestamp": timestamp};
// final paramsJson = json.encode(data);
// final iv = IV.fromLength(32);
// final aesKey = Key.fromUtf8(MD5Str);
// // 使用aes-ecb-256PKCS7Padding 加密参数
// final encrypter = Encrypter(AES(aesKey, mode: AESMode.ecb));
// final paramsEncrypted = encrypter.encrypt(paramsJson, iv: iv);
//
//// final publicKey = await parseKeyFromFile<RSAPublicKey>('test/public.pem');
// // RSA 加密key
// String publicKeyString = await rootBundle.loadString('assets/keys/rsa_public_key.pem');
// RSAPublicKey publicKey = parser.parse(publicKeyString);
// final rsaEncrypter = Key.Encrypter(Key.RSA(publicKey: publicKey));
// final rsaEncrypted = rsaEncrypter.encrypt(MD5Str);
//
// print("rsaPublic ---------- $publicKeyString");
//// final decrypted = encrypter.decrypt(encrypted, iv: iv);
//
// print("md5key ------ $MD5Str");
//// print(decrypted); // Lorem ipsum dolor sit amet, consectetur adipiscing elit
// print("RSA 加密 MD5 rsaStr ------ ${rsaEncrypted.base64}"); // R4PxiU
// print("参数 encrypted ------ ${paramsEncrypted.base64}"); // R4PxiU
//
// Map param = {"body": paramsEncrypted.base64, "key": rsaEncrypted.base64};
//
// print("finalParams ---- ${json.encode(param)}");
// return;
}
static String md5Encrypt(String string, {bool log = false}) {
var content = new Utf8Encoder().convert(string);
String md5Str = md5.convert(content).toString().toUpperCase();
if (log) {
DPrint.printf("AES 加密 ---- $md5Str}");
}
return md5Str;
}
static Future<String> aesEncrypt(
{String key, String encryptString, bool log = false}) async {
final iv = IV.fromLength(32);
final aesKey = Key.fromUtf8(key);
// 使用aes-ecb-256PKCS7Padding 加密参数
final encrypter = Encrypter(AES(aesKey, mode: AESMode.ecb));
final paramsEncrypted = encrypter.encrypt(encryptString, iv: iv);
if (log) {
DPrint.printf("AES 加密 ---- ${paramsEncrypted.base64}");
}
return paramsEncrypted.base64;
}
static Future<String> aesDecrypt(
{String key, String decryptString, bool log = false}) async {
final iv = IV.fromLength(32);
final aesKey = Key.fromUtf8(key);
// 使用aes-ecb-256PKCS7Padding 加密参数
final encrypter = Encrypter(AES(aesKey, mode: AESMode.ecb));
final decrypted =
encrypter.decrypt(Encrypted.fromBase64(decryptString), iv: iv);
if (log) {
DPrint.printf("AES 解密 ---- $decrypted");
}
return decrypted;
}
static Future<String> rsaEncrypt(
{String encryptString, bool log = false}) async {
final parser = RSAKeyParser();
String publicKeyString = _serverRSAPublicKey;
RSAPublicKey publicKey = parser.parse(publicKeyString);
final rsaEncrypter = Encrypter(RSA(publicKey: publicKey));
final rsaEncrypted = rsaEncrypter.encrypt(encryptString);
if (log) {
// DPrint.printf("RSA 公钥 ---- $publicKeyString");
DPrint.printf("RSA 加密 ---- ${rsaEncrypted.base64}");
}
return rsaEncrypted.base64;
}
static Future<String> rsaDecrypt(
{String decryptString, bool log = false}) async {
final parser = RSAKeyParser();
String privateKeyString = _appRSAPrivateKey;
RSAPrivateKey private = parser.parse(privateKeyString);
final rsaDecrypter = Encrypter(RSA(privateKey: private));
final rsaEncrypted =
rsaDecrypter.decrypt(Encrypted.fromBase64(decryptString));
if (log) {
// DPrint.printf("RSA 私钥 ---- $privateKeyString");
DPrint.printf("RSA 解密 ---- $rsaEncrypted");
}
return rsaEncrypted;
}
}