由于项目的原因,原来的项目使用.net 进行开发,现在需要转成java, 所以原来的加解密就成了一个棘手的问题。由于数据使用RSA签名加密,又因为.net 和 Java 加解密算法上的差异,并不能使用同一个私钥来对原始数据进行解密。所以考虑的方向就是签名密钥之间互相转换。

有幸的是,网络上也有很多遇到此问题的朋友,网上也有类似的很多解决方法。但是寻找最终的解决方案还是花了很长时间。再加上自己对程序上的修改,得出了比较适合自己转换的一个解决方案吧。

转换需要使用BouncyCastle.Crypto.dll

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

写于2016-07-19

RSA 加解密转换的更多相关文章

  1. Rsa加解密Java、C#、php通用代码 密钥转换工具

    之前发了一篇"TripleDes的加解密Java.C#.php通用代码",后面又有项目用到了Rsa加解密,还是在不同系统之间进行交互,Rsa在不同语言的密钥格式不一样,所以过程中主 ...

  2. 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence

    遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...

  3. RSA 加解密 秘钥对说明

    rsa非对称加密, 加解密需要不同的秘钥,称作一对. rsa加解密分两种,第一:公钥加密私钥解密.第二:私钥加密公钥解密. 需要注意的是,公加私解得到的密文是变化的,而私加公解的得到的密文是固定的. ...

  4. PHP RSA加解密示例(转)

    1.生成密钥和公钥 开始前需要准备openssl环境 linux 需要安装openssl工具包,传送门http://www.openssl.org/source/ window 下需要安装openss ...

  5. 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

    [转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...

  6. RSA加解密&RSA加验签详解

    RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一.RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已 ...

  7. 前后端java+vue 实现rsa 加解密与摘要签名算法

    RSA 加密.解密.签名.验签.摘要,前后端java+vue联调测试通过 直接上代码 // 注意:加密密文与签名都是唯一的,不会变化.// 注意:vue 端密钥都要带pem格式.java 不要带pem ...

  8. 【go语言】RSA加解密

    关于go语言的RSA加解密的介绍,这里有一篇文章,已经介绍的很完整了. 对应的go语言的加解密代码,参考git. 因为原文跨语言是跟php,我这里要跟c语言进行交互,所以,这里贴上c语言的例子. 参考 ...

  9. java RSA加解密以及用途

    在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每 ...

随机推荐

  1. jdk的安装及配置

    前几天重新了下系统,所以JDK也要重新安装,顺带温故了安装及配置的过程,记录下来.(安装的版本是JDK1.7.0) 后面基本都是点下一步(i第一步选:开发工具),路径我改为E:/java/jdk 1. ...

  2. 使用jasmine来对js进行单元测试

    互联网的快速发展,给web开发人员带来了前所未有的挑战.对于前端开发,前端开发er所需要编写的js早已不是那些寥寥几行的视觉效果代码.代码量的大增,多人协同,人员素质悬殊不齐,这都需要一个标准,来对代 ...

  3. JQuery中的html(),text(),val()区别

    jQuery中.html()用为读取和修改元素的HTML标签,.text()用来读取或修改元素的纯文本内容,.val()用来读取或修改表单元素的value值. 1.HTML html():取得第一个匹 ...

  4. 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.ServiceModel.Activation.HttpModule”。

    ********************************* 思路壹(也是网络上铺天盖地的通俗解决方案) 原因: 这是因为先安装了 .NET Framework , 随后启用了 .NET Fra ...

  5. web开发前端学习

    bootstrap:  http://www.bootcss.com/ bootstrap:   http://bootsnipp.com/snippets/featured/single-colum ...

  6. golang的json操作

    package main import ( "encoding/json" "fmt" "os" ) type ConfigStruct s ...

  7. superF12

    superF12是开发内嵌ie内核的桌面客户端时的一个调试工具

  8. 牡丹江.2014k(构造)

    K - Known Notation Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Su ...

  9. 虚拟机安装Ubuntu三种网络模式

    VMWare提供三种工作模式桥接(bridge).NAT(网络地址转换)和host-only(主机模式). NAT(网络地址转换) 在NAT模式下,虚拟系统需要借助NAT(网络地址转换)功能,通过宿主 ...

  10. Ubuntu下安装php7后无法启动Apache

    报错提示:Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You nee ...