把Java生成的RSA公钥、私钥转换成.NET使用的XML格式
测试代码:
PrivateKey privateKey=RSAUtils.getRSAPrivateKeyBybase64(savePrivateKey);
PublicKey publicKey=RSAUtils.getRSAPublidKeyBybase64(savePublicKey);
String publicKeyXml = getRSAPublicKeyAsNetFormat(publicKey.getEncoded());
String privateKeyXml = getRSAPrivateKeyAsNetFormat(privateKey.getEncoded());
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivkey) {
try {
StringBuffer buff = new StringBuffer(1024);
PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec(
encodedPrivkey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
.generatePrivate(pvkKeySpec);
buff.append("<RSAKeyValue>");
buff.append("<Modulus>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getModulus().toByteArray()))
+ "</Modulus>");
buff.append("<Exponent>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getPublicExponent()
.toByteArray())) + "</Exponent>");
buff.append("<P>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeP().toByteArray()))
+ "</P>");
buff.append("<Q>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeQ().toByteArray()))
+ "</Q>");
buff.append("<DP>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeExponentP()
.toByteArray())) + "</DP>");
buff.append("<DQ>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeExponentQ()
.toByteArray())) + "</DQ>");
buff.append("<InverseQ>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getCrtCoefficient()
.toByteArray())) + "</InverseQ>");
buff.append("<D>"
+ CodeUtils.base64Encode(removeMSZero(pvkKey.getPrivateExponent()
.toByteArray())) + "</D>");
buff.append("</RSAKeyValue>");
return buff.toString().replaceAll("[ \t\n\r]", "");
} catch (Exception e) {
System.err.println(e);
return null;
}
}
private static String getRSAPublicKeyAsNetFormat(byte[] encodedPublicKey) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey pukKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(encodedPublicKey));
StringBuffer buff = new StringBuffer(1024);
buff.append("<RSAKeyValue>");
buff.append("<Modulus>"
+ CodeUtils.base64Encode(removeMSZero(pukKey.getModulus().toByteArray()))
+ "</Modulus>");
buff.append("<Exponent>"
+ CodeUtils.base64Encode(removeMSZero(pukKey.getPublicExponent().toByteArray())) + "</Exponent>");
buff.append("</RSAKeyValue>");
11
return buff.toString().replaceAll("[ \t\n\r]", "");
} catch (Exception e) {
System.err.println(e);
return null;
}
}
private static byte[] removeMSZero(byte[] data) {
byte[] data1;
int len = data.length;
if (data[] == ) {
data1 = new byte[data.length - ];
System.arraycopy(data, , data1, , len - );
} else
data1 = data;
return data1;
}
RSAUtils.java
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package com.union.pufa; import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAKeyGenParameterSpec;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang.StringUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public abstract class RSAUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(RSAUtils.class);
private static final String ALGORITHOM = "RSA";
private static final Provider DEFAULT_PROVIDER = new BouncyCastleProvider();
private static final String SIGNATURE_MD5WITHRSA = "MD5withRSA";
private static final String SIGNATURE_SHA1WITHRSA = "SHA1withRSA";
private static final String SIGNATURE_ALGORITHM_DEFAULT = "NONEwithRSA";
private static final String CIPHER_TRANSFORMATION_DEFAULT = "RSA/ECB/PKCS1Padding";
private static final String HASHID_SHA1 = "01";
private static final String HASHID_MD5 = "02";
private static KeyPairGenerator keyPairGen = null;
private static KeyFactory keyFactory = null; static {
try {
keyPairGen = KeyPairGenerator.getInstance("RSA", DEFAULT_PROVIDER);
keyFactory = KeyFactory.getInstance("RSA", DEFAULT_PROVIDER);
} catch (NoSuchAlgorithmException var1) {
LOGGER.error(var1.getMessage());
} } private RSAUtils() {
} public static synchronized KeyPair generateRSAKeyPair(int keysize, BigInteger publicExponent) {
try {
keyPairGen.initialize(new RSAKeyGenParameterSpec(keysize, publicExponent), new SecureRandom());
return keyPairGen.generateKeyPair();
} catch (Exception var3) {
LOGGER.error("生成模长 =" + keysize + ",指数=" + publicExponent + "的RSA密钥对失败", var3);
return null;
}
} public static PrivateKey getRSAPrivateKey(String hexModulus, String hexPrivateExponent) {
if(!StringUtils.isBlank(hexModulus) && !StringUtils.isBlank(hexPrivateExponent)) {
BigInteger mbig = new BigInteger(hexModulus, 16);
BigInteger ebig = new BigInteger(hexPrivateExponent, 16);
RSAPrivateKeySpec prispec = new RSAPrivateKeySpec(mbig, ebig); try {
return keyFactory.generatePrivate(prispec);
} catch (InvalidKeySpecException var6) {
LOGGER.error("hexModulus or hexPrivateExponent value is invalid. return null(RSAPrivateKey).");
return null;
}
} else {
if(LOGGER.isDebugEnabled()) {
LOGGER.debug("hexModulus and hexPrivateExponent cannot be empty. RSAPrivateKey value is null to return.");
} return null;
}
} public static PublicKey getRSAPublidKey(String hexModulus, String hexPublicExponent) {
if(!StringUtils.isBlank(hexModulus) && !StringUtils.isBlank(hexPublicExponent)) {
BigInteger mbig = new BigInteger(hexModulus, 16);
BigInteger ebig = new BigInteger(hexPublicExponent, 16);
RSAPublicKeySpec pubspec = new RSAPublicKeySpec(mbig, ebig); try {
return keyFactory.generatePublic(pubspec);
} catch (InvalidKeySpecException var6) {
LOGGER.error("hexModulus or hexPublicExponent value is invalid. return null(RSAPublicKey).");
return null;
}
} else {
if(LOGGER.isDebugEnabled()) {
LOGGER.debug("hexModulus and hexPublicExponent cannot be empty. return null(RSAPublicKey).");
} return null;
}
} public static String getBase64CodeKey(Key key) {
return CodeUtils.base64Encode(key.getEncoded());
} public static String getNakedPublicKey(RSAPublicKey key) {
return key.getModulus().toString(16).toUpperCase();
} private static byte[] getAsn1Len(int len) {
int ret = false;
byte[] buff = new byte[10];
byte[] asn1Len = (byte[])null;
if(len > '\uffff') {
return null;
} else {
byte ret;
if(len > 255) {
buff[0] = -126;
buff[1] = (byte)((len & '\uff00') >> 8);
buff[2] = (byte)(len & 255);
ret = 3;
} else if((len & 128) != 0) {
buff[0] = -127;
buff[1] = (byte)len;
ret = 2;
} else {
buff[0] = (byte)len;
ret = 1;
} asn1Len = new byte[ret];
System.arraycopy(buff, 0, asn1Len, 0, ret);
return asn1Len;
}
} public static byte[] getDerPK(byte[] pkModule, byte[] exp) {
byte[] buff = new byte[4096];
byte[] tbuff = new byte[4096];
byte[] tmp = (byte[])null;
byte[] derPK = (byte[])null;
int offset = false;
int len = false;
int lenOfPkModule = pkModule.length;
int lenOfExp = exp.length;
if(pkModule != null && exp != null) {
int offset = 0;
tbuff[offset] = 2;
int offset = offset + 1;
tmp = getAsn1Len(lenOfPkModule + 1);
System.arraycopy(tmp, 0, tbuff, offset, tmp.length);
offset += tmp.length;
tbuff[offset] = 0;
++offset;
System.arraycopy(pkModule, 0, tbuff, offset, lenOfPkModule);
offset += lenOfPkModule;
tbuff[offset] = 2;
++offset;
tmp = getAsn1Len(lenOfExp);
System.arraycopy(tmp, 0, tbuff, offset, tmp.length);
offset += tmp.length;
System.arraycopy(exp, 0, tbuff, offset, lenOfExp);
offset += lenOfExp;
int len = offset;
offset = 0;
buff[offset] = 48;
offset = offset + 1;
tmp = getAsn1Len(len);
System.arraycopy(tmp, 0, buff, offset, tmp.length);
offset += tmp.length;
System.arraycopy(tbuff, 0, buff, offset, len);
offset += len;
derPK = new byte[offset];
System.arraycopy(buff, 0, derPK, 0, offset);
return derPK;
} else {
return null;
}
} public static String getDerPKWithAscHex(String pkModule, String exp) {
return pkModule != null && exp != null?CodeUtils.byte2hex(getDerPK(CodeUtils.hex2byte(pkModule), CodeUtils.hex2byte(exp))):null;
} public static PublicKey getPKfromDerPK(String racalPK) {
byte[] racalPKStr = (byte[])null;
if(racalPK == null) {
return null;
} else {
racalPKStr = CodeUtils.hex2byte(racalPK);
int offset = 0;
if(racalPKStr[offset] != 48) {
return null;
} else {
int offset = offset + 1;
int i;
int lenOfNextPart;
int bitsOfLenFlag;
if((racalPKStr[offset] & 255) <= 128) {
lenOfNextPart = racalPKStr[offset] & 255;
++offset;
} else {
bitsOfLenFlag = (racalPKStr[offset] & 255) - 128;
++offset;
i = 0; for(lenOfNextPart = 0; i < bitsOfLenFlag; ++offset) {
lenOfNextPart += racalPKStr[offset] & 255;
++i;
}
} if((racalPKStr[offset] & 255) != 2) {
return null;
} else {
++offset;
--lenOfNextPart;
int lenOfPK = false;
int lenOfPK;
if((racalPKStr[offset] & 255) <= 128) {
lenOfPK = racalPKStr[offset] & 255;
++offset;
} else {
bitsOfLenFlag = (racalPKStr[offset] & 255) - 128;
++offset;
i = 0; for(lenOfPK = 0; i < bitsOfLenFlag; ++offset) {
lenOfPK += racalPKStr[offset] & 255;
++i;
}
} while(lenOfPK % 8 != 0) {
if((racalPKStr[offset] & 255) != 0) {
return null;
} ++offset;
--lenOfPK;
} byte[] LPk = new byte[lenOfPK];
System.arraycopy(racalPKStr, offset, LPk, 0, lenOfPK);
String pk = CodeUtils.byte2hex(LPk);
offset += lenOfPK;
int lenOfEval = false;
if(racalPKStr[offset] != 2) {
return null;
} else {
++offset;
int lenOfEval = racalPKStr[offset];
++offset;
byte[] LPkEval = new byte[lenOfEval];
System.arraycopy(racalPKStr, offset, LPkEval, 0, lenOfEval);
return getRSAPublidKey(pk, CodeUtils.byte2hex(LPkEval));
}
}
}
}
} public static RSAPublicKey getRSAPublidKeyBybase64(String base64s) {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(CodeUtils.base64Decode(base64s));
RSAPublicKey publicKey = null; try {
publicKey = (RSAPublicKey)keyFactory.generatePublic(keySpec);
} catch (InvalidKeySpecException var4) {
LOGGER.error("base64编码=" + base64s + "转RSA公钥失败", var4);
} return publicKey;
} public static RSAPrivateKey getRSAPrivateKeyBybase64(String base64s) {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(CodeUtils.base64Decode(base64s));
RSAPrivateKey privateKey = null; try {
privateKey = (RSAPrivateKey)keyFactory.generatePrivate(keySpec);
} catch (InvalidKeySpecException var4) {
LOGGER.error("base64编码=" + base64s + "转RSA私钥失败", var4);
} return privateKey;
} public static byte[] encrypt(Key key, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", DEFAULT_PROVIDER);
cipher.init(1, key);
return cipher.doFinal(data);
} public static byte[] decrypt(Key key, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", DEFAULT_PROVIDER);
cipher.init(2, key);
return cipher.doFinal(data);
} public static String encryptString(Key key, String plaintext) {
if(key != null && plaintext != null) {
byte[] data = plaintext.getBytes(); try {
byte[] en_data = encrypt(key, data);
return new String(Hex.encodeHex(en_data));
} catch (Exception var4) {
LOGGER.error(var4.getCause().getMessage());
return null;
}
} else {
return null;
}
} public static String encryptStr4essc(Key key, String plaintext, String accNo, String encType) {
if(key != null && plaintext != null) {
if("1".equals(encType)) {
plaintext = CodeUtils.paddingRightStr(plaintext, 'F', 16);
} else if("0".equals(encType)) {
plaintext = CodeUtils.asc2ascInt2hexasc(CodeUtils.paddingRightStr(plaintext, 'F', 16));
} byte[] data = CodeUtils.hex2byte(plaintext); try {
byte[] en_data = encrypt(key, data);
return (new String(Hex.encodeHex(en_data))).toUpperCase();
} catch (Exception var6) {
LOGGER.error(var6.getCause().getMessage());
return null;
}
} else {
return null;
}
} public static String decryptString(Key key, String encrypttext) {
if(key != null && !StringUtils.isBlank(encrypttext)) {
try {
byte[] en_data = Hex.decodeHex(encrypttext.toCharArray());
byte[] data = decrypt(key, en_data);
return new String(data);
} catch (Exception var4) {
LOGGER.error(String.format("\"%s\" Decryption failed. Cause: %s", new Object[]{encrypttext, var4.getCause().getMessage()}));
return null;
}
} else {
return null;
}
} public static String sign(RSAPrivateKey privatekey, String dataFillMode, String hashID, String data) throws Exception {
Signature signature = Signature.getInstance("NONEwithRSA");
if("01".equals(hashID)) {
data = CodeUtils.sha1String(data).toUpperCase();
} else if("02".equals(hashID)) {
data = CodeUtils.md5String(data).toUpperCase();
} signature.initSign(privatekey);
signature.update(data.getBytes());
return CodeUtils.byte2hex(signature.sign()).toUpperCase();
} public static boolean verifySign(PublicKey publicKey, String dataFillMode, String hashID, String data, String sign) throws Exception {
Signature signature = Signature.getInstance("NONEwithRSA");
if("01".equals(hashID)) {
data = CodeUtils.sha1String(data).toUpperCase();
} else if("02".equals(hashID)) {
data = CodeUtils.md5String(data).toUpperCase();
} signature.initVerify(publicKey);
signature.update(data.getBytes());
return signature.verify(CodeUtils.hex2byte(sign.toUpperCase()));
}
}
把Java生成的RSA公钥、私钥转换成.NET使用的XML格式的更多相关文章
- C# 通过java生成的RSA公钥加密和解密
最近工作需要将对方公司生成的RSA加密公钥进行明文加密和解密,发现了几点贴出来做个笔记. RSA单次加密是有长度限制!微软封装的加密方法如果出现长度超出指定范围的话报错是直接报“该项不适于在指定状态下 ...
- 一个java的DES加解密类转换成C#
原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ...
- java字符串转义,把<>转换成<>等字符【原】
java字符串转义,把<>转换成<>等字符 使用的是commons-lang3-3.4 中的StringEscapeUtils类 package test; import ja ...
- java 写入int型时会自动转换成字符
java 写入int型时会自动转换成字符
- 纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat) 转载自:http://blog.cafeboy.org/2011/02/25/qqwry-to-ipwry/ ht ...
- 带毫秒的字符转换成时间(DateTime)格式的通用方法
C#自身有更好的方式,Net任意String格式转换为DateTime类型 ====================================================== 原文 ==== ...
- PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例(非对称加密)
php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 先了解一下关于 ...
- Java中使用OpenSSL生成的RSA公私钥进行数据加解密
当前使用的是Linux系统,已经按装使用OpenSSL软件包, 一.使用OpenSSL来生成私钥和公钥 1.执行命令openssl version -a 验证机器上已经安装openssl 1 open ...
- Java中使用OpenSSL生成的RSA公私钥
RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的 ...
随机推荐
- 深入理解CSS定位中的堆叠z-index
× 目录 [1]定义 [2]堆叠规则 [3]堆叠上下文[4]兼容 前面的话 对于所有定位,最后都不免遇到两个元素试图放在同一位置上的情况.显然,其中一个必须盖住另一个.但,如何控制哪个元素放在上层,这 ...
- 基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap开发框架进行经验的总结出来和大家分享下,同时也记录自己对Bootstrap开发的学习研究的点点滴 ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Android如何避免切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题
1.最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有SurfaceView.结果,每次打开程序第一次进入到该Acti ...
- Java - IDE
JDK安装及环境变量配置 下载安装对应版本的JDK 控制面板--->系统--->属性--->高级系统设置--->环境变量 新建系统变量JAVA_HOME 变量名:JAVA_HO ...
- 【知识积累】JavaMail实现发邮件功能
一.前言 今天闲来没事,想着通过程序来给别人发邮件.于是,上网搜了一下,相应的资料也很多,刚开始完成了邮件的简单发送,后来想如何能发送附件,继续寻找 答案,但是遇到了一个问题是当我使用txt类型作为附 ...
- 使用AndroidStudio报错:INSTALL_FAILED_UPDATE_INCOMPATIBLE
安装Android Studio后,用真机调试运行项目时出现:INSTALL_FAILED_UPDATE_INCOMPATIBLE这个错误 原因: 1. 可能是设备内存不足: 2. APP已经存在: ...
- java加密解密的学习
注:此文章只是对如何学习java加密解密技术做一个讲解.并不涉及具体的知识介绍,如果有需要请留言,有时间我补冲长.个人觉着学习一个学习方法比学习一个知识点更有价值的多. 首先,对于加密解密知识体系没有 ...
- Windows Azure Traffic Manager (5) Traffic Manager Overview
<Windows Azure Platform 系列文章目录> 笔者默默地看了一下之前写的Traffic Manager内容,已经差不多是3年前的文章了.现在Azure Traffic M ...
- 14个HTML5实现的效果合集
HTML5可不是什么虚幻的概念,与其高谈阔论的讨论HTML5未来的趋势和价值,不如一起研究一下现在的HTML5可以做出哪些成果,可以让我们做出出色的产品. Form Follows Function就 ...