在项目中经常会使用到一些加密场合,涉及的加密算法常有RSA算法,base32算法,恰好最近有用到RSA加密解密算法,以此篇文章记录一下。
RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。
.net实现RSA加密解密算法需要引用System.Security.Cryptography程序集。
所有的加密解密操作均使用加密服务提供程序 (CSP) 提供的 System.Security.Cryptography.RSA 算法的实现。
实现加密解密需要执行不对称加密和解密的RSACryptoServiceProvider类的实例
/// <summary>
/// 构造函数,初始化不对称加密和解密的RSACryptoServiceProvider类的实例
/// </summary>
public RSACrypt()
{
if (!string.IsNullOrEmpty(privateKey))
{
_privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(privateKey);
}
if (!string.IsNullOrEmpty(publicKey))
{
_publicKeyRsaProvider = CreateRsaProviderFromPublicKey(publicKey);
}
}
其中CreateRsaProviderFromPrivateKey和CreateRsaProviderFromPublicKey方法均需要自己实现,因为RSACryptoServiceProvider提供的加密解密方法,均需把公钥和私钥转换成2进制数据。
初始化RSACryptoServiceProvider的实例后,我们便可以实现加密和解密操作了。
/// <summary>
/// 解密
/// </summary>
/// <param name="cipherText"></param>
/// <returns></returns>
public string Decrypt(string cipherText)
{
if (_privateKeyRsaProvider == null)
{
throw new Exception("_privateKeyRsaProvider is null");
}
return Encoding.UTF8.GetString(_privateKeyRsaProvider.Decrypt(System.Convert.FromBase64String(cipherText), false));
}
/// <summary>
/// 加密
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public string Encrypt(string text)
{
if (_publicKeyRsaProvider == null)
{
throw new Exception("_publicKeyRsaProvider is null");
}
return Convert.ToBase64String(_publicKeyRsaProvider.Encrypt(Encoding.UTF8.GetBytes(text), false));
}
实现效果如下: