背景介绍

之前老程序使用.net进行数据的RSA加解密,现在用JAVA重写,但是.net的公钥和私钥是xml格式,跟java的不一样,需要手动转换一下。目前网上的大部分都是java转.net。我这里来个.net转java。

一、.net公钥转java

1、公钥格式

PFJTQUtleVZhbHVlPjxNb2R1bHVzPi9lRk42TUFyVXE4QWhvYmpsamRjTWhjeEhTWjRnMXFZK3Fmeldud0o2aVhwTWZBVzNmaEJXK2krblRXTnZwckcvelZ5OFpQT2VTOStHWmlYQlVJODNpczBVZzB3eVJKT2E0TWU2d3hmR1pJWTE1WFpGUFdjcEtSaVZqeWxaZGJ0ZmNTY3ZQUnFCMTE5N2kvZkVwNjVrY1Fjc1AzT3U5b3B4ZHJmeEJOMEgwRT08L01vZHVsdXM+PEV4cG9uZW50PkFRQUI8L0V4cG9uZW50PjwvUlNBS2V5VmFsdWU+

2、Base64解码

可以看到是base64编码过的,解码后看看,是一段xml

<RSAKeyValue><Modulus>/eFN6MArUq8AhobjljdcMhcxHSZ4g1qY+qfzWnwJ6iXpMfAW3fhBW+i+nTWNvprG/zVy8ZPOeS9+GZiXBUI83is0Ug0wyRJOa4Me6wxfGZIY15XZFPWcpKRiVjylZdbtfcScvPRqB1197i/fEp65kcQcsP3Ou9opxdrfxBN0H0E=</Modulus><Exponent>AQAB</Exponent>
</RSAKeyValue>

3、转换

思路:

  1. 解码base64 公钥
  2. 读取xml节点中的ModulusExponent
  3. ModulusExponent进行base64解码
  4. 创建公钥需要的BigInterg格式的参数
  5. 生成公钥

这段代码中使用了 hutoolspring的工具包来解析json和xml,各位可以自行替换。

private  PublicKey getPublicKey(String xmlPublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {byte[] bytes = Base64.getDecoder().decode(xmlPublicKey);JSONObject jsonObject = XML.toJSONObject(new String(bytes, StandardCharsets.UTF_8));String Modulus = jsonObject.getJSONObject("RSAKeyValue").getStr("Modulus");String Exponent = jsonObject.getJSONObject("RSAKeyValue").getStr("Exponent");byte[] modulus = Base64Utils.decode(Modulus.getBytes());byte[] exponent = Base64Utils.decode(Exponent.getBytes());BigInteger b1 = new BigInteger(1, modulus);BigInteger b2 = new BigInteger(1, exponent);KeyFactory keyFactory = KeyFactory.getInstance("RSA");RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);return keyFactory.generatePublic(keySpec);}

二、.net私钥转java

1、私钥格式

PFJTQUtleVZhbHVlPjxNb2R1bHVzPi9lRk42TUFyVXE4QWhvYmpsamRjTWhjeEhTWjRnMXFZK3Fmeldud0o2aVhwTWZBVzNmaEJXK2krblRXTnZwckcvelZ5OFpQT2VTOStHWmlYQlVJODNpczBVZzB3eVJKT2E0TWU2d3hmR1pJWTE1WFpGUFdjcEtSaVZqeWxaZGJ0ZmNTY3ZQUnFCMTE5N2kvZkVwNjVrY1Fjc1AzT3U5b3B4ZHJmeEJOMEgwRT08L01vZHVsdXM+PEV4cG9uZW50PkFRQUI8L0V4cG9uZW50PjxQPi93YTQyRnEyWGpkMUE5K1paR1dHR29zclB5YmpPZk8rZkZ4UkxlcFl0cW1TLytEVnpHRGhMaG9lMG1hNnpFQ3FCaFQ0aUgyUHRRWmhiZWtCQlU2T2dRPT08L1A+PFE+L3RsMlFvNWd2ck1JcWhVYkV4QitNRFlFTmgxdzNrUWQzK0M1bmZTWjA4TDBqV3N5Z2N3SjdSU0hPY2ZFclM0bEF5UkwzR0RtbVNrK3hYNVdWRUt3d1E9PTwvUT48RFA+N0lqZWp3VHIyczBUQWltMGl2TERCQUdLZGdOcWc0aTRaMzMwYVdMUEwzUnVmRmViMVBrU1FnRkdEeDNyS2FEY1VkSEhoa2ozTGc2aDlTQkVxeGhtZ1E9PTwvRFA+PERRPnNUQ0ZWdFVqVXJPcjdJVnNJNTh0L1ZzeEptYmwyTVBIZWFjSHAxa3ZzdG96cWpmRUVCYkxOL2t6NCtxUFJsRjFEbkFvQm51aEdSQmlRbklLbDk4ZWdRPT08L0RRPjxJbnZlcnNlUT5TYWZ4eC9GTUVrQzZZTmg0SlNwaUpoSlhiQjB6ajhQSnRSTmNxWWIyNVNLcE1aZW5FSmcxSmNDK0xZbWlLQUFVTFFwK0xROURVcUhBenJMSGlPS3g4Zz09PC9JbnZlcnNlUT48RD42LytaUmFnRlhhb1NDZnV2NmI1eWRKbThiUVdLOTBlcmR5M1NlS1ZmTGdxcHVHTWZUcDFzWER5Qm5HL2c0SExPVXdSallnOXMycGY4VjF6UjNmQ1IxSFpLaE9YRkliY2plajB5TFdURk9xT0Q1MlRLQW5LTE1lWm16TGI3c3NoR0JScXNhaEV5TTJlc2ZUbTM5VUN3TzA0eEJJMHlwT09XMTVQU3pQY0s0QUU9PC9EPjwvUlNBS2V5VmFsdWU+

2、Base64解码

可以看到是base64编码过的,解码后看看,是一段xml。参数比较多

<RSAKeyValue><Modulus>/eFN6MArUq8AhobjljdcMhcxHSZ4g1qY+qfzWnwJ6iXpMfAW3fhBW+i+nTWNvprG/zVy8ZPOeS9+GZiXBUI83is0Ug0wyRJOa4Me6wxfGZIY15XZFPWcpKRiVjylZdbtfcScvPRqB1197i/fEp65kcQcsP3Ou9opxdrfxBN0H0E=</Modulus><Exponent>AQAB</Exponent><P>/wa42Fq2Xjd1A9+ZZGWGGosrPybjOfO+fFxRLepYtqmS/+DVzGDhLhoe0ma6zECqBhT4iH2PtQZhbekBBU6OgQ==</P><Q>/tl2Qo5gvrMIqhUbExB+MDYENh1w3kQd3+C5nfSZ08L0jWsygcwJ7RSHOcfErS4lAyRL3GDmmSk+xX5WVEKwwQ==</Q><DP>7IjejwTr2s0TAim0ivLDBAGKdgNqg4i4Z330aWLPL3RufFeb1PkSQgFGDx3rKaDcUdHHhkj3Lg6h9SBEqxhmgQ==</DP><DQ>sTCFVtUjUrOr7IVsI58t/VsxJmbl2MPHeacHp1kvstozqjfEEBbLN/kz4+qPRlF1DnAoBnuhGRBiQnIKl98egQ==</DQ><InverseQ>Safxx/FMEkC6YNh4JSpiJhJXbB0zj8PJtRNcqYb25SKpMZenEJg1JcC+LYmiKAAULQp+LQ9DUqHAzrLHiOKx8g==</InverseQ><D>6/+ZRagFXaoSCfuv6b5ydJm8bQWK90erdy3SeKVfLgqpuGMfTp1sXDyBnG/g4HLOUwRjYg9s2pf8V1zR3fCR1HZKhOXFIbcjej0yLWTFOqOD52TKAnKLMeZmzLb7sshGBRqsahEyM2esfTm39UCwO04xBI0ypOOW15PSzPcK4AE=</D>
</RSAKeyValue>

3、转换

大体思路同上,看代码就行了。还是用到了 hutoolspring的工具包来解析json和xml,各位可以自行替换。

private PrivateKey getPrivateKey(String xmlPrivateKey) throws Exception {byte[] bytes = Base64.getDecoder().decode(xmlPrivateKey);JSONObject jsonObject = XML.toJSONObject(new String(bytes, StandardCharsets.UTF_8));JSONObject rsaKeyValue = jsonObject.getJSONObject("RSAKeyValue");BigInteger modulus = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("Modulus").getBytes()));BigInteger exponent = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("Exponent").getBytes()));BigInteger d = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("D").getBytes()));BigInteger p = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("P").getBytes()));BigInteger q = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("Q").getBytes()));BigInteger dp = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("DP").getBytes()));BigInteger dq = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("DQ").getBytes()));BigInteger inverseQ = new BigInteger(1, Base64Utils.decode(rsaKeyValue.getStr("InverseQ").getBytes()));RSAPrivateCrtKeySpec privateKeySpec = new RSAPrivateCrtKeySpec(modulus, exponent, d, p, q, dp, dq, inverseQ);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);return privateKey;}

RSA加解密,.net公钥/私钥兼容java相关推荐

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

    RSA有两个密钥,一个是公开的,称为公开密钥:一个是私密的,称为私密密钥. 特点: 公开密钥是对大众公开的,私密密钥是服务器私有的,两者不能互推得出. 用公开密钥对数据进行加密,私密密钥可解密:私密密 ...

  2. RSA加解密用途简介及java示例

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

  3. openresty 与 java RSA加解密

    上一篇搞定了openresty与java之间的aes加解密.这一篇就来说说openresty与java之间RSA的加解密.在测试的过程中.发现了与aes同样的问题.就是openresty支持的填充模式 ...

  4. Java中的RSA加解密工具类:RSAUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt;import com.mirana.frame.utils.log.LogUtils; ...

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

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

  6. rsa加解密(兼容微信小程序环境)

    1.安装 npm i wxmp-rsa -S 2.创建一个js文件作为之后可复用的工具库,内容如下: import { JSEncrypt } from 'wxmp-rsa' // 定义公钥 这里要改 ...

  7. 使用Crypto++5.5.2完成RSA加解密,真正的把公钥放在字符串内,而不是放在文件内

    本文摘自 小楼一夜听春雨得博客: http://hi.baidu.com/magic475/blog/item/e8b82139020ae622b8998f96.html 使用Crypto++5.5. ...

  8. rsa加解密 --- jsencrypt.min.js --- 支持长字符串分段加解密

    前端 + rsa加解密 + jsencrypt.min.js–(新增超长字符分段加解密) 分享2种,分段 和 不分段 加解密 --话不多说,直接上代码!~ 最终效果: 首先引入2个js <scr ...

  9. openssl在多平台和多语言之间进行RSA加解密注意事项

    首先说一下平台和语言: 系统平台为CentOS6.3,RSA加解密时使用NOPADDING进行填充 1)使用C/C++调用系统自带的openssl 2)Android4.2模拟器,第三方openssl ...

最新文章

  1. python笔记-排序函数
  2. 02.elasticsearch bucket aggregation查询
  3. 原生Js_实现广告弹窗
  4. android studio smssdk,SMSSDK for Android 配置
  5. 杭州湾跨海大桥视频上云,夯实智慧高速“云基建
  6. javascript获取asp.net服务器端控件的值
  7. C#用GDI画任意形状的form
  8. 大型网站的系统架构(摘)
  9. 现在动画制作用什么软件?
  10. 新闻平台聚合之新浪新闻爬虫发布
  11. 长期大量收售通信 联通 移动 电信 工程各种型号光缆
  12. win7 mysql 管理员权限,win7管理员权限问题 TrustInstaller 获取权限
  13. 鲜为人知 的 人名典故
  14. eclipes工具介绍及下载安装汉化
  15. VS2015 C++/CLR
  16. android 盒子刷 下载,一加5刷机盒子app下载_一加5刷机盒子安卓最新版v7.5下载 - Win7旗舰版...
  17. 解决:GET http://localhost:**/static/js/jquery.min.js net::ERR_ABORTED 404
  18. 叙述两个计算机应用,计算机应用基础模拟试卷2
  19. [高项]职能型组织VS矩阵型组织
  20. ArcGIS Image Server简介以及OL2中的加载

热门文章

  1. 因为没有逻辑没有怀疑致使中国成了无学的民族(三)
  2. 如何快速拍照识别文字?有这个方法不用担心不够快了
  3. 华为OD机试 - 最多几个直角三角形(Java JS Python)
  4. 一步一步学谷歌性能测试(chrome) 性能测试教程
  5. 独家解密英特尔处理器制造全流程
  6. c语言中加减和移位,c中的移位运算
  7. 输入半径求圆的面积周长
  8. DiscuzQ论坛的安装教程终极版
  9. vue动态判断input readonly属性
  10. 【蓝桥杯】第10届Scratch国赛第6题程序2 -- 捉迷藏