C#下解析、生成JAVA的RSA密钥、公钥 C#下解析、生成JAVA的RSA密钥、公钥

需要用到的dll在nuget上的地址是:https://www.nuget.org/packages/BouncyCastle/,相关转换代码如下:

  1. using Org.BouncyCastle.Asn1.Pkcs;
  2. using Org.BouncyCastle.Asn1.X509;
  3. using Org.BouncyCastle.Crypto.Parameters;
  4. using Org.BouncyCastle.Math;
  5. using Org.BouncyCastle.Pkcs;
  6. using Org.BouncyCastle.Security;
  7. using Org.BouncyCastle.X509;
  8. using System;
  9. using System.Xml;
  10. /// <summary>
  11. /// RSA密钥格式转换
  12. /// </summary>
  13. public static class RSAConverter
  14. {
  15. /// <summary>
  16. /// RSA私钥格式转换,java->.net
  17. /// </summary>
  18. /// <param name="privateKey">java生成的RSA私钥</param>
  19. /// <returns></returns>
  20. public static string RSAPrivateKeyJava2DotNet(this string privateKey)
  21. {
  22. RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
  23. return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
  24. Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
  25. Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
  26. Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
  27. Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
  28. Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
  29. Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
  30. Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
  31. Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
  32. }
  33. /// <summary>
  34. /// RSA私钥格式转换,.net->java
  35. /// </summary>
  36. /// <param name="privateKey">.net生成的私钥</param>
  37. /// <returns></returns>
  38. public static string RSAPrivateKeyDotNet2Java(this string privateKey)
  39. {
  40. XmlDocument doc = new XmlDocument();
  41. doc.LoadXml(privateKey);
  42. BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
  43. BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
  44. BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
  45. BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
  46. BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
  47. BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
  48. BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
  49. BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));
  50. RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);
  51. PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
  52. byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
  53. return Convert.ToBase64String(serializedPrivateBytes);
  54. }
  55. /// <summary>
  56. /// RSA公钥格式转换,java->.net
  57. /// </summary>
  58. /// <param name="publicKey">java生成的公钥</param>
  59. /// <returns></returns>
  60. public static string RSAPublicKeyJava2DotNet(this string publicKey)
  61. {
  62. RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
  63. return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
  64. Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
  65. Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
  66. }
  67. /// <summary>
  68. /// RSA公钥格式转换,.net->java
  69. /// </summary>
  70. /// <param name="publicKey">.net生成的公钥</param>
  71. /// <returns></returns>
  72. public static string RSAPublicKeyDotNet2Java(this string publicKey)
  73. {
  74. XmlDocument doc = new XmlDocument(); doc.LoadXml(publicKey);
  75. BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
  76. BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
  77. RsaKeyParameters pub = new RsaKeyParameters(false, m, p);
  78. SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
  79. byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
  80. return Convert.ToBase64String(serializedPublicBytes);
  81. }
  82. }