C# RSA算法的加密和解密
在进行网络交互的工程中,通常要使用到界面算法,尤其是和服务器进行关键数据的交互过程中。
近来在做一个项目使用到了加密和解密,因为要和第三方平台进行对接。对方拥有私钥,将公钥传给到了我们。我们作为客户端要和第三方系统进行对接。
交互流程如下:
1:对方拥有私钥,我们有公钥。
2:对方发给我们的数据,使用RSA私钥机密,我们拿到数据都使用对方提供的公钥进行解密。
3:我们发给对方的数据,使用对方提供给我们的公钥进行加密,对方使用他们自己拥有的私钥进行解密。
4: 我们使用C#语言进行开发。对方使用java进行开发
C#语言对RSA算法进行加密和解密的时候需要用到公钥的key,这里我们定义为pub_key。C#提供的接口中,pub_key需要使用xml的方式提供。
因此我们需要一个方法,将pub_key转换成为xml格式。
RSA公钥转换成为xml格式
/// <summary>
/// RSA公钥转换成为xml格式
/// </summary>
/// <param name="pubKey"></param>
public static string RSAPublicKey(string pubKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(pubKey));
string xmlStr = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
return xmlStr;
}
以上方法提供将公钥字符串 转换为RSA公钥的xml格式
public static string RSA_PUB_KEY = “xxxxxxBAQEFAAOCAQ8AMIIBCgKCAQEAqIxxxxxxxxxxxxxxxxxxxx7lyRoYdp1Q4dA3pq7+0V1dg2O4zh6aR65NOx3CfWIiUWIuJu8xQS9BvnmIQW7u21ndVkYelzZCARbs8sWPg1yyyyyyyyyyyyyyyyyeaeJ7mY7d7HkuiGr5AMsWbrojuxxxxxxxxxxxxxxxxxW0WBPknpAVSLWSHUD1BQFQLTdUhoPcR2zMzLAVKy7f8aeVrN0SqM/gNcdngDaj+4BdT9K2*mEljZXxW9CbudLZC3cH3xxAEWpKEi1c/B4r8g4wIcoEEjbcC3LXp8Go+wIDAQAB”;
RSA的加密
/// <summary>
/// 加密
/// </summary>
/// <param name="pubKey"></param>
/// <param name="source"></param>
/// <returns></returns>
public static string encrypt(string pubXmlKey, string source)
{
string encryptedContent = string.Empty;
try
{
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(pubXmlKey);
//byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(source), false);
byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(source), RSAEncryptionPadding.Pkcs1);
encryptedContent = Convert.ToBase64String(encryptedData);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return encryptedContent;
}
C#RSA解密
public static string dencrypt(string pubXmlKey, string source)
{
string dencryptedContent = string.Empty;
try
{
RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
publicRsa.FromXmlString(pubXmlKey);
RSAParameters rp = publicRsa.ExportParameters(false);
//转换密钥
AsymmetricKeyParameter pbk = DotNetUtilities.GetRsaPublicKey(rp);
IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
//第一个参数为true表示加密,为false表示解密;第二个参数表示密钥
c.Init(false, pbk);
byte[] DataToDecrypt = Convert.FromBase64String(source);
byte[] cache;
int time = 0;//次数
int inputLen = DataToDecrypt.Length;
int offSet = 0;
MemoryStream outStream = new MemoryStream();
while (inputLen - offSet > 0)
{
if (inputLen - offSet > 256)
{
cache = c.DoFinal(DataToDecrypt, offSet, 256);
}
else
{
cache = c.DoFinal(DataToDecrypt, offSet, inputLen - offSet);
}
//写入
outStream.Write(cache, 0, cache.Length);
time++;
offSet = time * 256;
}
byte[] resData = outStream.ToArray();
string strDec = Encoding.UTF8.GetString(resData);
return strDec;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return dencryptedContent;
}
RSA算法的加密和解密介绍完成。
其实对于整个通信过程是结合了AES算法和RSA两种解密算法进行的。 AES算法可参考上篇本博客其他文章 AES加密算法C#实现
结合这两种算法。数据的交互就比较安全了。相对来说破解的难度增大了。相当来说:数据交互就更加安全了。