• 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. }
  • 相关阅读:
    Repeater嵌套Repeater的结构
    解决还原数据库 出现单用户
    常见的一些C#开源框架或者开源项目
    vue 实现动态路由
    c#使用Split分割换行符
    SQL Server 时间戳与时间格式互相转换
    值与枚举的转化
    编程之美,让美国人科技高速发展,浅谈C语言带给美国的变化
    SQL CE数据库搭建和操作
    C# 与API
  • 原文地址:https://www.cnblogs.com/zbliao/p/13516140.html
Copyright © 2020-2023  润新知