RSA是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。
RSA 加密和解密,第一步需要想创建公钥和私钥
private static int rsakeysize = 2048;
public static string publickeyname = "rsa.pub";
public static string privatekeyname = "rsa.private";
/// <summary>
///在给定路径中生成XML格式的私钥和公钥。
/// </summary>
public static void RswCreateKeys(string path)
{
using (var rsa = new RSACryptoServiceProvider(rsakeysize))
{
try
{
// 获取私钥和公钥。
var publicKey = rsa.ToXmlString(false);
var privateKey = rsa.ToXmlString(true);
string pathfile = Path.GetDirectoryName(path);
if (!Directory.Exists(pathfile)) { Directory.CreateDirectory(pathfile); }
// 保存到磁盘
File.WriteAllText(Path.Combine(path, publickeyname), publicKey);
File.WriteAllText(Path.Combine(path, privatekeyname), privateKey);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
使用生成的公钥来进行加密
/// <summary>
/// 用给定路径的RSA公钥文件加密纯文本。
/// </summary>
/// <param name="str">要加密的文本</param>
/// <param name="publickkey">用于加密的公钥路径.</param>
/// <returns>表示加密数据的64位编码字符串.</returns>
public static string RsaEncrypt(string str, string publickkey)
{
using (var rsa = new RSACryptoServiceProvider(rsakeysize))
{
try
{
//加载公钥
var publicxmlkey = File.ReadAllText(publickkey);
rsa.FromXmlString(publicxmlkey);
var bytesToEncrypt = System.Text.Encoding.Unicode.GetBytes(str);
var bytesEncrypted = rsa.Encrypt(bytesToEncrypt, false);
return Convert.ToBase64String(bytesEncrypted);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
使用生成的私钥来进行解密
/// <summary>
/// Decrypts encrypted text given a RSA private key file path.给定路径的RSA私钥文件解密 加密文本
/// </summary>
/// <param name="str">加密的密文</param>
/// <param name="privatekey">用于加密的私钥路径.</param>
/// <returns>未加密数据的字符串</returns>
public static string RsaDecrypt(string str, string privatekey)
{
using (var rsa = new RSACryptoServiceProvider(rsakeysize))
{
try
{
var privateXmlKey = File.ReadAllText(privatekey);
rsa.FromXmlString(privateXmlKey);
var bytesEncrypted = Convert.FromBase64String(str);
var bytesPlainText = rsa.Decrypt(bytesEncrypted, false);
return System.Text.Encoding.Unicode.GetString(bytesPlainText);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
}
在很多项目中,通常由我们生成公钥给对方,让对方调用我们的接口时,先将数据加密,然后我们用私钥进行解密,确保数据传输的安全.