C# Java间进行RSA加密解密交互(二)

接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题。

在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与项目中要求的有所出入。在项目中,客户端(Java)的加密是通过这么一个方法实现的:

 

[java] view plain copy
  1. /** 
  2.  * RSA加密 
  3.  * @param text--待加密的明文 
  4.  * @param key--公钥,由服务器端提供的经base64编码的字符串 
  5.  * @return 
  6.  */  
  7. public static String RSAEncryptoWithPublicKey(String text, String key) {  
  8.     String result = null;  
  9.     try {  
  10.         byte[] publicKeyByte = base64Decrypto(key);  
  11.   
  12.         X509EncodedKeySpec x509 = new X509EncodedKeySpec(publicKeyByte);  
  13.         KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
  14.         PublicKey publicKey = keyFactory.generatePublic(x509);  
  15.   
  16.         Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());  
  17.         cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
  18.   
  19.         result = base64Encrypto(cipher.doFinal(text.getBytes()));  
  20.     } catch (Exception e) {  
  21.         e.printStackTrace();  
  22.         return null;  
  23.     }  
  24.     return result;  
  25. }  


在上一篇中的实现,需要客户端先做一次解析工作,而已经开发好的客户端是没有这一层的,所以得想个办法,在服务器端(C#)完成这项工作。但是经过多次尝试,依然未果。于是换一种方式,密钥对不由C#提供,而转而有Java提供,生成客户端需要的公钥形式,并解析公钥私钥,组装C# 的XML格式的密钥对字符串。

 

下面贴一下RSA密钥对生成代码(参考RSA的密钥把JAVA格式转换成C#的格式)

 

[java] view plain copy
  1. import java.io.UnsupportedEncodingException;  
  2. import java.lang.reflect.Method;  
  3. import java.security.KeyFactory;  
  4. import java.security.KeyPair;  
  5. import java.security.KeyPairGenerator;  
  6. import java.security.NoSuchAlgorithmException;  
  7. import java.security.PublicKey;  
  8. import java.security.interfaces.RSAPrivateCrtKey;  
  9. import java.security.interfaces.RSAPrivateKey;  
  10. import java.security.interfaces.RSAPublicKey;  
  11. import java.security.spec.PKCS8EncodedKeySpec;  
  12. import java.security.spec.X509EncodedKeySpec;  
  13. import java.util.HashMap;  
  14.   
  15. /** 
  16.  * @author Administrator 
  17.  *  
  18.  */  
  19. public class RSAJavaToCSharp {  
  20.     public static void main(String[] args) throws Exception {  
  21.         HashMap<String, Object> map = getKeys();  
  22.         RSAPublicKey publicKey = (RSAPublicKey) map.get("PUBLIC");  
  23.         RSAPrivateKey privateKey = (RSAPrivateKey) map.get("PRIVATE");  
  24.           
  25.         String publicKeyString = getRSAPublicKeyAsNetFormat(publicKey.getEncoded());  
  26.         String privateKeyString = getRSAPrivateKeyAsNetFormat(privateKey.getEncoded());  
  27.           
  28.         System.out.println(encodeBase64(publicKey.getEncoded()));//此处为客户端加密时需要的公钥字符串  
  29.         System.out.println(encodePublicKeyToXml(publicKey));  
  30.         System.out.println(publicKeyString);  
  31.         System.out.println(privateKeyString);  
  32.     }  
  33.   
  34.     /**获取密钥对 
  35.      * @return 
  36.      * @throws NoSuchAlgorithmException 
  37.      */  
  38.     public static HashMap<String, Object> getKeys()  
  39.             throws NoSuchAlgorithmException {  
  40.         HashMap<String, Object> map = new HashMap<String, Object>();  
  41.         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  
  42.         keyPairGen.initialize(1024);  
  43.         KeyPair keyPair = keyPairGen.generateKeyPair();  
  44.         RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  
  45.         RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  
  46.         map.put("PUBLIC", publicKey);  
  47.         map.put("PRIVATE", privateKey);  
  48.         return map;  
  49.     }  
  50.   
  51.     /** 
  52.      * 私钥转换成C#格式 
  53.      * @param encodedPrivkey 
  54.      * @return 
  55.      */  
  56.     private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivateKey) {  
  57.         try {  
  58.             StringBuffer buff = new StringBuffer(1024);  
  59.   
  60.             PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec(  
  61.                     encodedPrivateKey);  
  62.             KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
  63.             RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory  
  64.                     .generatePrivate(pvkKeySpec);  
  65.   
  66.             buff.append("<RSAKeyValue>");  
  67.             buff.append("<Modulus>"  
  68.                     + encodeBase64(removeMSZero(pvkKey.getModulus()  
  69.                             .toByteArray())) + "</Modulus>");  
  70.   
  71.             buff.append("<Exponent>"  
  72.                     + encodeBase64(removeMSZero(pvkKey.getPublicExponent()  
  73.                             .toByteArray())) + "</Exponent>");  
  74.   
  75.             buff.append("<P>"  
  76.                     + encodeBase64(removeMSZero(pvkKey.getPrimeP()  
  77.                             .toByteArray())) + "</P>");  
  78.   
  79.             buff.append("<Q>"  
  80.                     + encodeBase64(removeMSZero(pvkKey.getPrimeQ()  
  81.                             .toByteArray())) + "</Q>");  
  82.   
  83.             buff.append("<DP>"  
  84.                     + encodeBase64(removeMSZero(pvkKey.getPrimeExponentP()  
  85.                             .toByteArray())) + "</DP>");  
  86.   
  87.             buff.append("<DQ>"  
  88.                     + encodeBase64(removeMSZero(pvkKey.getPrimeExponentQ()  
  89.                             .toByteArray())) + "</DQ>");  
  90.   
  91.             buff.append("<InverseQ>"  
  92.                     + encodeBase64(removeMSZero(pvkKey.getCrtCoefficient()  
  93.                             .toByteArray())) + "</InverseQ>");  
  94.   
  95.             buff.append("<D>"  
  96.                     + encodeBase64(removeMSZero(pvkKey.getPrivateExponent()  
  97.                             .toByteArray())) + "</D>");  
  98.             buff.append("</RSAKeyValue>");  
  99.   
  100.             return buff.toString();  
  101.         } catch (Exception e) {  
  102.             System.err.println(e);  
  103.             return null;  
  104.         }  
  105.     }  
  106.   
  107.     /** 
  108.      * 公钥转成C#格式 
  109.      * @param encodedPrivkey 
  110.      * @return 
  111.      */  
  112.     private static String getRSAPublicKeyAsNetFormat(byte[] encodedPublicKey) {  
  113.         try {  
  114.             StringBuffer buff = new StringBuffer(1024);  
  115.               
  116.             //Only RSAPublicKeySpec and X509EncodedKeySpec supported for RSA public keys  
  117.             KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
  118.             RSAPublicKey pukKey = (RSAPublicKey) keyFactory  
  119.                     .generatePublic(new X509EncodedKeySpec(encodedPublicKey));  
  120.   
  121.             buff.append("<RSAKeyValue>");  
  122.             buff.append("<Modulus>"  
  123.                     + encodeBase64(removeMSZero(pukKey.getModulus()  
  124.                             .toByteArray())) + "</Modulus>");  
  125.             buff.append("<Exponent>"  
  126.                     + encodeBase64(removeMSZero(pukKey.getPublicExponent()  
  127.                             .toByteArray())) + "</Exponent>");  
  128.             buff.append("</RSAKeyValue>");  
  129.             return buff.toString();  
  130.         } catch (Exception e) {  
  131.             System.err.println(e);  
  132.             return null;  
  133.         }  
  134.     }  
  135.   
  136.     /** 
  137.      * 公钥转换成C#格式 
  138.      * @param key 
  139.      * @return 
  140.      * @throws Exception 
  141.      */  
  142.     public static String encodePublicKeyToXml(PublicKey key) throws Exception {  
  143.         if (!RSAPublicKey.class.isInstance(key)) {  
  144.             return null;  
  145.         }  
  146.         RSAPublicKey pubKey = (RSAPublicKey) key;  
  147.         StringBuilder sb = new StringBuilder();  
  148.   
  149.         sb.append("<RSAKeyValue>");  
  150.         sb.append("<Modulus>")  
  151.                 .append(encodeBase64(removeMSZero(pubKey.getModulus()  
  152.                         .toByteArray()))).append("</Modulus>");  
  153.         sb.append("<Exponent>")  
  154.                 .append(encodeBase64(removeMSZero(pubKey.getPublicExponent()  
  155.                         .toByteArray()))).append("</Exponent>");  
  156.         sb.append("</RSAKeyValue>");  
  157.         return sb.toString();  
  158.     }  
  159.   
  160.     /** 
  161.      * @param data 
  162.      * @return 
  163.      */  
  164.     private static byte[] removeMSZero(byte[] data) {  
  165.         byte[] data1;  
  166.         int len = data.length;  
  167.         if (data[0] == 0) {  
  168.             data1 = new byte[data.length - 1];  
  169.             System.arraycopy(data, 1, data1, 0, len - 1);  
  170.         } else  
  171.             data1 = data;  
  172.   
  173.         return data1;  
  174.     }  
  175.   
  176.     /** 
  177.      * base64编码 
  178.      * @param input 
  179.      * @return 
  180.      * @throws Exception 
  181.      */  
  182.     public static String encodeBase64(byte[] input) throws Exception {  
  183.         Class clazz = Class  
  184.                 .forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");  
  185.         Method mainMethod = clazz.getMethod("encode", byte[].class);  
  186.         mainMethod.setAccessible(true);  
  187.         Object retObj = mainMethod.invoke(null, new Object[] { input });  
  188.         return (String) retObj;  
  189.     }  
  190.   
  191.     /** 
  192.      * base64解码  
  193.      * @param input 
  194.      * @return 
  195.      * @throws Exception 
  196.      */  
  197.     public static byte[] decodeBase64(String input) throws Exception {  
  198.         Class clazz = Class  
  199.                 .forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");  
  200.         Method mainMethod = clazz.getMethod("decode", String.class);  
  201.         mainMethod.setAccessible(true);  
  202.         Object retObj = mainMethod.invoke(null, input);  
  203.         return (byte[]) retObj;  
  204.     }  
  205.   
  206.     public static String byteToString(byte[] b)  
  207.             throws UnsupportedEncodingException {  
  208.         return new String(b, "utf-8");  
  209.     }  
  210. }  

 

为了方便在服务器端使用,初始想法是想将java文件封装为.dll文件,共C#调用,测试后,发现这样做行不通,bug提示类找不到,这是因为java代码中还导入了其他jar包的缘故。

于是,退而求其次,将上述java文件Export为可执行的jar文件,并将生成的密钥对写入相应文件中。再由C#读取,提供给客户端。

---------------------------------------------------------------------------------------------

C# Java间进行RSA加密解密交互

C# Java间进行RSA加密解密交互(三)

转载于:https://www.cnblogs.com/amylis_chen/p/8604970.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUG日志-2022.7.12——关于VSCode感叹号无法生成HTML骨架问题

解决办法&#xff1a;放弃使用多年的!&#xff0c;而采用html:5的形式。 原因&#xff1a;好像是因为VScode已经更新了 好多扩展也失效了。

hadoop 入门实例【转】

原文链接&#xff1a;http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 1、数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据…

AWS安装CDH5.3-CentOS6.4中关键操作步骤

1、在AWS masternode 上下载cloudera-manager-installer.bin安装包 [rootip-172-21-42-114 ~]# wget http://archive.cloudera.com/cm5/installer/latest/coludera-manager-installer.bin 此时会提示&#xff1a;-bash: wget: command not find 所以要现安装wget命令 [rootip-1…

You have an error in your SQL syntax; check the manual that corresponds to...

问题缘由&#xff1a; 使用datagrip插入数据时发生报错 使用插入语句为&#xff1a; insert into ev_name (‘username’,‘password’) values (‘admin’,‘123456’); 错误提示&#xff1a; You have an error in your SQL syntax; check the manual that corresponds to …

Linux命令之文件相关

cd 绝对路径相对路径 --转到对应目录 touch-a --更新访问时间 touch -m --更新修改时间&#xff08;ls -l只能显示修改时间&#xff09; touch -t 【【cc】yy】mmddhhmm【ss】 --修改文件时间为任意时间0-68为20**&#xff0c;69-99为19**&#xff0c; touch 不存在的文件 --新…

省赛第一次选拔赛

就是第11届浙江省省赛的套题&#xff0c;总共11题&#xff0c;A了3题&#xff0c;排第25&#xff0c;中途就走了&#xff0c;其实那道同模取余题我是可以做出的&#xff0c;找规律我也想到了&#xff0c;但tmd我只打了30个的表&#xff0c;规律是第48个后出现&#xff0c;点背啊…

getaddrinfo ENOTFOUND 127.0.0.1:3306

错误缘由&#xff1a; 在写nodejs项目时&#xff0c;连接数据库发现找不到数据库。 解决&#xff1a; 发现数据库连接池没有设置端口号&#xff0c;需设置端口号3306。 解决效果&#xff1a; 成功解决

357. Count Numbers with Unique Digits

357. Count Numbers with Unique Digits Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Example:Given n 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,3…

Foundation框架: 5.常用结构体知识补充

前面我们已经把常用的四个结构体学完了, 知道怎么去创建怎么去使用了, 但还有一些小细节没有补充完, 下面让我们一起来看看吧: 例子: #import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {// 用来比较两个点是否相同(x, y)BOOL p CGPointEqualT…

一幅长文细学node.js——一幅长文系列

文章目录1 Node.js概述1.1 初识Node.js1.2 Node.js简介1.3 Node.js安装1.4 使用Node.js运行JS代码2 fs文件系统模块2.1 读取文件2.2 写入文件2.3 路径问题3 Path路径模块3.1 Path模块概述3.2 路径拼接3.3 获取路径的文件名4 Http模块4.1 Http概述4.2 服务器相关的概念4.3 创建W…

怎么在图片上面加个div层,让它浮于图片上方

怎么在图片上面加个div层,让它浮于图片上方 1、首先当然是要插入一张图片啦&#xff0c;代码如下&#xff1a;<a href"#" target"_blank"><img src"images/13.png" width"240" heigth"240"></a>图片路径自…

java 级联删除文件夹下的所有文件

public void deletefile(String delpath) throws Exception {try {File file new File(delpath);// 当且仅当此抽象路径名表示的文件存在且 是一个目录时&#xff0c;返回 trueif (!file.isDirectory()) {file.delete();} else if (file.isDirectory()) {String[] filelist f…

一幅长文细学GaussDB(一)——数据库介绍

文章目录1 数据库介绍1.1 数据库技术1.2 数据库技术发展史数据库技术产生和发展数据库三个阶段比较数据库系统优势层次模型网状模型关系模型关系数据库产品历史结构化查询语言SQL面向对象数据模型&#xff08;OO模型&#xff09;数据管理技术的新挑战NoSQL技术特点和类型主要No…

spring中注解的通俗解释

我们在没有用注解写spring配置文件的时候,会在spring配置文件中定义Dao层的bean,这样我们在service层中,写setDao方法,就可以直接通过接口调用Dao层,用了注解写法后,在配置文件中不用再写Dao层的bean,只需要在Dao实现类中加入Repositorypublic Class TestDaoImpl(){}在service层…

Unity 通过Unity Admob Plugin插件集成admob教程

原创&#xff1a;officemaster.cn下载Unity Admob Demo&#xff0c;插件里面包含Admob_Unity_Demo.unitypackage 插件文件AdmobPluginRes 是Admob 的ios sdk和插件使用样例代码打开样例代码可以看到代码里面如何使用Unity Admob插件把Admob Unity插件添加进unity工程1. 打开Un…

WKWebview与js交互

应用场景&#xff1a; 项目中在原有h5界面中嵌入js代码&#xff0c;在指定位置加入第三方分享 此部分为js点击分享绑定部分代码&#xff0c;这里的事件名需要h5和前端协商好一致。 window.webkit.messageHandlers.<事件名>.postMessage(需要传递的数据) iOS端 首先需要遵…

一幅长文细学华为MRS大数据开发(一)——大数据时代的挑战和机遇

文章目录1 大数据时代的挑战和机遇1.1 大数据基础概念大数据时代的发展大数据定义大数据的4V大数据处理和传统数据处理的差异并行计算相关知识1.2 大数据应用领域大数据金融应用大数据教育应用大数据公共安全应用大数据交通规划应用1.3 大数据计算计算任务的分类大数据应用的主…

书签

Bookmarks Bookmarks 书签栏 DClude 5 App开发Native.js入门指南 - DCloud 问答HTML5中国产业联盟文档 - DCloud 问答文档 - DCloud 问答DCloud HBuilder-做最好的HTML5开发工具 webWorker html5---webworker多线程 - stefanlee - 博客园HTML5 postMessage 和 onmessage API 详…

自动化 测试框架部署(python3+selenium2)

安装Python 从https://www.python.org/downloads/下载最新版本的Python3&#xff0c;请注意&#xff0c;是3&#xff1b;需要将Python的安装目录和安装目录下的Scripts文件夹添加到系统的PATH中&#xff0c;请注意安装过程中的相关选项&#xff1b;安装过程&#xff0c;不再赘述…