内容纲要
注意,
C# RSA 只能导入导出 PKCS1 的公钥,不能处理 PKCS8 的。否则会报错。
C# RSA 可以导出导入 PCKS8 的私钥,可以按照 pem 格式处理,也可以按照文本格式处理,
示例如下:
using Newtonsoft.Json;
void Main()
{
var keySize = 2048;
var rsaCryptoServiceProvider = new RSACryptoServiceProvider(keySize);
// 打印私钥、公钥
Convert.ToBase64String(rsaCryptoServiceProvider.ExportPkcs8PrivateKey()).Dump();
Convert.ToBase64String(rsaCryptoServiceProvider.ExportRSAPublicKey()).Dump();
var parameters = rsaCryptoServiceProvider.ExportParameters(true);
// 加密后的字符串
var cipherText = Encrypt("hello world", parameters);
// 解密后的字符串
var plainText = Decrypt(cipherText, parameters);
Console.WriteLine(plainText);
}
// 加密
public string Encrypt(string data, RSAParameters key)
{
using (var rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(key);
var byteData = Encoding.UTF8.GetBytes(data);
var encryptData = rsa.Encrypt(byteData, false);
return Convert.ToBase64String(encryptData);
}
}
// 解密
public string Decrypt(string cipherText, RSAParameters key)
{
using (var rsa = new RSACryptoServiceProvider())
{
var cipherByteData = Convert.FromBase64String(cipherText);
rsa.ImportParameters(key);
var encryptData = rsa.Decrypt(cipherByteData, false);
return Encoding.UTF8.GetString(encryptData);
}
}
导出导入公钥:
/// <summary>
/// 导入公钥
/// </summary>
/// <param name="rsa"></param>
/// <param name="publicKey"></param>
/// <returns></returns>
private static RSACryptoServiceProvider ImportPublicKeyFromPEM(RSACryptoServiceProvider rsa, string publicKey)
{
publicKey = publicKey
.Replace("-----BEGIN RSA PUBLIC KEY-----", "")
.Replace("-----END RSA PUBLIC KEY-----", "")
.Replace("-----BEGIN PUBLIC KEY-----", "")
.Replace("-----END PUBLIC KEY-----", "")
.Replace("\r", "")
.Replace("\n", "");
rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out var bytesRead);
return rsa;
}
/// <summary>
/// 导出公钥
/// </summary>
/// <param name="rsa"></param>
/// <returns></returns>
public static string ExportPublicKeyToPEM(RSACryptoServiceProvider rsa)
{
return rsa.ExportRSAPublicKeyPem();
}
/// <summary>
/// 加密
/// </summary>
/// <param name="encryptedMessage"></param>
/// <param name="bytes"></param>
/// <returns></returns>
public static string Encrypt(byte[] encryptedMessage, out byte[] bytes)
{
// Decrypt the message using the public key
byte[] decryptedMessage = RsaPublic.Encrypt(encryptedMessage, false);
bytes = decryptedMessage;
string decryptedMessageString = Encoding.UTF8.GetString(decryptedMessage);
return decryptedMessageString;
}
public static string Encrypt(string encryptedMessage)
{
// Decrypt the message using the public key
byte[] decryptedMessage = RsaPublic.Encrypt(Encoding.UTF8.GetBytes(encryptedMessage), false);
string decryptedMessageString = Encoding.UTF8.GetString(decryptedMessage);
return decryptedMessageString;
}
/// <summary>
/// 解码
/// </summary>
/// <param name="encryptedMessage"></param>
/// <returns></returns>
public static string Decrypt(string encryptedMessage)
{
// Decrypt the message using the public key
byte[] decryptedMessage = RsaPublic.Decrypt(Encoding.ASCII.GetBytes(encryptedMessage), false);
string decryptedMessageString = Encoding.UTF8.GetString(decryptedMessage);
return decryptedMessageString;
}
/// <summary>
/// 解码
/// </summary>
/// <param name="encryptedMessage"></param>
/// <returns></returns>
public static string Decrypt(byte[] encryptedMessage)
{
// Decrypt the message using the public key
byte[] decryptedMessage = RsaPublic.Decrypt(encryptedMessage, false);
string decryptedMessageString = Encoding.UTF8.GetString(decryptedMessage);
return decryptedMessageString;
}
文章评论