<RSAKeyValue><Modulus>D4ZblrI8NsZgnZOQbHJuEv7Lg0pCOuhwmGIS10rwlJ9Z/hGbes=</Modulus><Exponent>ABCD</Exponent><P>86TWhp553PrrlQ/xdOpGDbGy8/h3/5vg+P==</P><Q>D33zQmGtBnoO8OaQhCwbwqai1w==</Q><DP>i0RwPcLPh+WQKt5L75SR1PQ==</DP><DQ>3vayrPOJ1WMFxPzCpqMaUDWwWsBJ/c0PRwRhvrSw4/TR+6BlEkU/5b17/==</DQ><InverseQ>CbuGb8ZNvjCkSHqvSTJvFpFfqxxQjH09ABxBZx3K7SNvw3+6+LfKeRzoz7==</InverseQ><D>p6etDZ1ghROHdHWAauTUe6zn/RQzm7HE5aCWVOgMqcg9VkFMMZ3H+R1rec=</D></RSAKeyValue>
上面你可以看到我的Public Key.xml文件的示例格式,我需要将它转换成pem格式进行rsa加密,主要需要加密用户名和密码.
import 'dart:convert';
import 'dart:typed_data';
import 'package:pointycastle/export.dart';
import 'package:xml/xml.dart' as xml;
void encryptRSa() {
String publicKeyXML = '''
<RSAKeyValue><Modulus>D4ZblrI8NsZgnZOQbHJuEv7Lg0pCOuhwmGIS10rwlJ9Z/hGbes=</Modulus><Exponent>ABCD</Exponent><P>86TWhp553PrrlQ/xdOpGDbGy8/h3/5vg+P==</P><Q>D33zQmGtBnoO8OaQhCwbwqai1w==</Q><DP>i0RwPcLPh+WQKt5L75SR1PQ==</DP><DQ>3vayrPOJ1WMFxPzCpqMaUDWwWsBJ/c0PRwRhvrSw4/TR+6BlEkU/5b17/==</DQ><InverseQ>CbuGb8ZNvjCkSHqvSTJvFpFfqxxQjH09ABxBZx3K7SNvw3+6+LfKeRzoz7==</InverseQ><D>p6etDZ1ghROHdHWAauTUe6zn/RQzm7HE5aCWVOgMqcg9VkFMMZ3H+R1rec=</D></RSAKeyValue>
''';
var document = xml.XmlDocument.parse(publicKeyXML);
var modulusBase64 = document.findAllElements('Modulus').single.text;
var exponentBase64 = document.findAllElements('Exponent').single.text;
var modulusBytes = Uint8List.fromList(base64.decode(modulusBase64));
var exponentBytes = Uint8List.fromList(base64.decode(exponentBase64));
var modulus = decodeBigIntFromBytes(modulusBytes);
var exponent = decodeBigIntFromBytes(exponentBytes);
var publicKey = RSAPublicKey(modulus, exponent);
var encryptor = OAEPEncoding(RSAEngine())
..init(true, PublicKeyParameter<RSAPublicKey>(publicKey));
String message = 'Hello, World!';
var encrypted = encryptor.process(Uint8List.fromList(utf8.encode(message)));
print('EncryptedOne: ${base64.encode(encrypted)}');
}
BigInt decodeBigIntFromBytes(Uint8List bytes) {
return BigInt.parse(base64.encode(bytes), radix: 16);
}
我正在使用PointCastle&;XML库进行加密,当我运行这段代码时,我得到了这个问题 FormatException:无法分析BigInt
public static string EncryptUserNamePassword(string value, string publicKey)
{
if (!(String.IsNullOrEmpty(value)))
{
using (var rsa = new RSACryptoServiceProvider())
{
try
{
rsa.FromXmlString(publicKey);
byte[] dataToEncrypt = Encoding.ASCII.GetBytes(value);
byte[] encryptedByteArray = rsa.Encrypt(dataToEncrypt, true).ToArray();
return Convert.ToBase64String(encryptedByteArray);
}
catch (Exception ex) { }
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
return "";
}
public static string Decrypt(string value, string _privateKey, IConfiguration configuration)
{
if (!(String.IsNullOrEmpty(value)))
{
var keyFilePath = configuration.GetSection("KeyPath").GetValue<string>(_privateKey);
var privateKey = File.ReadAllText(keyFilePath);
using (var rsa = new RSACryptoServiceProvider())
{
try
{
rsa.FromXmlString(privateKey);
var dataByte = Convert.FromBase64String(value.Replace(" ", ""));
var decryptedByte = rsa.Decrypt(dataByte, true);
var decryptedData = Encoding.UTF8.GetString(decryptedByte);
return decryptedData;
}
catch (Exception ex) { }
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
return "";
}
上面附上了服务器端使用的加解密代码,它是一个C#代码.