C# RSA算法的加密和解密

在进行网络交互的工程中,通常要使用到界面算法,尤其是和服务器进行关键数据的交互过程中。
近来在做一个项目使用到了加密和解密,因为要和第三方平台进行对接。对方拥有私钥,将公钥传给到了我们。我们作为客户端要和第三方系统进行对接。
交互流程如下:
1:对方拥有私钥,我们有公钥。
2:对方发给我们的数据,使用RSA私钥机密,我们拿到数据都使用对方提供的公钥进行解密。
3:我们发给对方的数据,使用对方提供给我们的公钥进行加密,对方使用他们自己拥有的私钥进行解密。
4: 我们使用C#语言进行开发。对方使用java进行开发

C#语言对RSA算法进行加密和解密的时候需要用到公钥的key,这里我们定义为pub_key。C#提供的接口中,pub_key需要使用xml的方式提供。
因此我们需要一个方法,将pub_key转换成为xml格式。

RSA公钥转换成为xml格式

  1. /// <summary>
  2. /// RSA公钥转换成为xml格式
  3. /// </summary>
  4. /// <param name="pubKey"></param>
  5. public static string RSAPublicKey(string pubKey)
  6. {
  7. RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(pubKey));
  8. string xmlStr = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
  9. Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
  10. Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
  11. return xmlStr;
  12. }

以上方法提供将公钥字符串 转换为RSA公钥的xml格式
public static string RSA_PUB_KEY = “xxxxxxBAQEFAAOCAQ8AMIIBCgKCAQEAqIxxxxxxxxxxxxxxxxxxxx7lyRoYdp1Q4dA3pq7+0V1dg2O4zh6aR65NOx3CfWIiUWIuJu8xQS9BvnmIQW7u21ndVkYelzZCARbs8sWPg1yyyyyyyyyyyyyyyyyeaeJ7mY7d7HkuiGr5AMsWbrojuxxxxxxxxxxxxxxxxxW0WBPknpAVSLWSHUD1BQFQLTdUhoPcR2zMzLAVKy7f8aeVrN0SqM/gNcdngDaj+4BdT9K2*mEljZXxW9CbudLZC3cH3xxAEWpKEi1c/B4r8g4wIcoEEjbcC3LXp8Go+wIDAQAB”;

RSA的加密

  1. /// <summary>
  2. /// 加密
  3. /// </summary>
  4. /// <param name="pubKey"></param>
  5. /// <param name="source"></param>
  6. /// <returns></returns>
  7. public static string encrypt(string pubXmlKey, string source)
  8. {
  9. string encryptedContent = string.Empty;
  10. try
  11. {
  12. using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
  13. {
  14. rsa.FromXmlString(pubXmlKey);
  15. //byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(source), false);
  16. byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(source), RSAEncryptionPadding.Pkcs1);
  17. encryptedContent = Convert.ToBase64String(encryptedData);
  18. }
  19. }
  20. catch (Exception ex)
  21. {
  22. Console.WriteLine(ex.ToString());
  23. }
  24. return encryptedContent;
  25. }

C#RSA解密

  1. public static string dencrypt(string pubXmlKey, string source)
  2. {
  3. string dencryptedContent = string.Empty;
  4. try
  5. {
  6. RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider();
  7. publicRsa.FromXmlString(pubXmlKey);
  8. RSAParameters rp = publicRsa.ExportParameters(false);
  9. //转换密钥
  10. AsymmetricKeyParameter pbk = DotNetUtilities.GetRsaPublicKey(rp);
  11. IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");
  12. //第一个参数为true表示加密,为false表示解密;第二个参数表示密钥
  13. c.Init(false, pbk);
  14. byte[] DataToDecrypt = Convert.FromBase64String(source);
  15. byte[] cache;
  16. int time = 0;//次数
  17. int inputLen = DataToDecrypt.Length;
  18. int offSet = 0;
  19. MemoryStream outStream = new MemoryStream();
  20. while (inputLen - offSet > 0)
  21. {
  22. if (inputLen - offSet > 256)
  23. {
  24. cache = c.DoFinal(DataToDecrypt, offSet, 256);
  25. }
  26. else
  27. {
  28. cache = c.DoFinal(DataToDecrypt, offSet, inputLen - offSet);
  29. }
  30. //写入
  31. outStream.Write(cache, 0, cache.Length);
  32. time++;
  33. offSet = time * 256;
  34. }
  35. byte[] resData = outStream.ToArray();
  36. string strDec = Encoding.UTF8.GetString(resData);
  37. return strDec;
  38. }
  39. catch (Exception ex)
  40. {
  41. Console.WriteLine(ex.Message);
  42. }
  43. return dencryptedContent;
  44. }

RSA算法的加密和解密介绍完成。

其实对于整个通信过程是结合了AES算法和RSA两种解密算法进行的。 AES算法可参考上篇本博客其他文章 AES加密算法C#实现

结合这两种算法。数据的交互就比较安全了。相对来说破解的难度增大了。相当来说:数据交互就更加安全了。

2024-01-17 20:51:35  user 阅读(114) 评论(0) 标签:C#,RSA加密,解密,公钥和私钥 分类:C#