Java RSA公钥、私钥与C#RSA公钥、私钥转换

news/2024/7/2 20:22:41

最近公司项目需要对接第四方支付接口,但是对方的demo是Java的,给的算法是Java版本的公钥和私钥,如果要做RSA加密就需要将Java的公钥和私钥转换成dotnet版本的公钥和私钥,具体的算法如下:

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

 

转载于:https://www.cnblogs.com/tianyang1027/p/10344955.html


http://www.niftyadmin.cn/n/4556419.html

相关文章

fiddler软件测试——Fiddler抓取https设置详解(图文)

强烈推荐&#xff08;原创亲测&#xff09;&#xff01;&#xff01;&#xff01;Fiddler抓取https设置详解&#xff08;图文&#xff09;转 本文主要说明了自己在设置fiddler抓取https过程中所遇到的问题及解决步骤&#xff0c;特别是fiddler在设置证书的环节遇到的各种奇葩问…

大学C语言怎么学啊

||| 关键是基础知识 我就是信息管理专业的大学生 这样就能学好了 多实践 学习理论知识的过程中多自己编程 指针等 顺序结构 比如循环结构 谅解c语言的编程思想和编写程序的各种方式 只能通过学习理论知识 c语言也一样 用得挺上手的. 而且在后面的学习中也经常用到C语言问题解决…

一种循环C字符数组的骚操作

#include <stdio.h> #include <stdlib.h> int main() {char wenwa[] "程劲小盆友在做什么";int _len 0;while (wenwa[_len]){printf("%c", wenwa[_len]);_len;}printf("\n");system("pause");return EXIT_SUCCESS; } 看…

C盘空间已被占用了70% 请问如何恢复到占用率为30%

答案补充 恩 建议卡巴查毒&#xff08;其他杀毒软件也可以&#xff09;后 用优化大师或者其他整理磁盘 如果不是 明天开机就好了&#xff08;或许后天&#xff09; 一会关机了 如果是 是不是安装了什么软件后就那样了 关闭系统自带还原 如果上过不安全的网站 具体什么原因我也不…

Flink 1.15 集群部署

集群配置 1 集群规划 节点服务器hadoop1hadoop2hadoop3角色JobManagerTaskManagerTaskManager 2 解压包 tar -zxvf flink-1.15.0-bin-scala_2.12.tgz cd /usr/local/flink-1.15.03 修改workers 和 masters vim masters hadoop1:8081vim workers hadoop2 hadoop34 修改配置文…

Codeforces 1104 D(数论+二分+交互)

传送门 题意&#xff1a; 让你在606060步之内猜出一个模数aaa。每次你可以输入两个数xxx和yyy。如果xmod&ThinSpace;&ThinSpace;a≥ymod&ThinSpace;&ThinSpace;ax \mod a \ge y \mod axmoda≥ymoda&#xff0c;则交互器输出"XXX"&#xff0c;否则输出…

c++高手来啊

示范程序如下&#xff1a;#include<iostream.h>#include<conio.h>#define N xvoid main(void){ char str[20]; char ch; int i0; cout<<"请输入密码:"; cout.flush(); chgetch(); while(ch getch()函数在库函数conio.h中定义 题目要求超级玩家在输…

esp8266必备知识

gpio定义 RX和TX为D9和D10 转载于:https://www.cnblogs.com/shubin/p/10349389.html