ras私钥c#转java_RSA的密钥把JAVA格式转换成C#的格式

RSA算法在C#与JAVA之前的交互

在JAVA生成一对RSA私钥和公钥的时候,是以下的形式给到C#去调用:

stringpublickey = @"MIGfMA0GCSqGSIb4DQEBAQUAA4GNADCBiQKBgQC/M9kJVwi+sO672NBm5fAEbUEl2PqRFuYZVB5ZrKah7eJPP0pKBe/eoA6pOMsjnKFoZGVizz7oCt+TJ+1fpuScn7vAtIFSjn1jgPANE+IcVdk4QKDFKu0LQdiurPQKLpq8Q3wJDAW7FxB2MHw/4ca/9w0N5VL0hQegZ4YhxDss6QIDAQABprivateKey";

stringprivatekey = @"MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAL8z2QlXCL6w7rvY0Gbl8ARtQSXY+pEW5hlUHlmspqHt4k8/SkoF796gDqk4yyOcoWhkZWLPPugK35Mn7V+m5Jyfu8C0gVKOfWOA8A0T4hxV2ThAoMUq7QtB2K6s9AoumrxDfAkMBbsXEHYwfD/hxr/3DQ3lUvSFB6BnhiHEOyzpAgMBAAECgYEAol/9qRjorEjF9XEjSr9rHddKxEGIST8RGeF+BNnCiTHkRziQdlykYIO876jzmsKhsG3STB+EZLsXM3ls9RZefcsPF5mLOCSOCow3DikfCtAy4hntsU9JwpuYE0V4A+Sgfd24fatqbu+JxE2nvpSbAPczDOgBFPNfYBkhMiuZ/iECQQDzUeq7lFcIE4uWhRGveVFjNAGuSsW+q9GOwO7tS5YwuAIQ2M+XgYGRFo8xMC6V/9SfqJtmSU1zk72pMlYufIqHAkEAySqkcKbWuobq5I9KSQISq2qCuGKtj/iUFho4PCD1YxhnQ7gcHA4OpS1dRFjtXJYQPTX9be+mmypsCFIyofE5DwJBAPGZ20wahTh9v9Lbmq3z9n5ce3bGxAcJsHDg3d09eooxi8uSnL5BV5frII+k2f0TI9rMnlE4Y/FpN5+zXaOXAi0CQQCs3Aqfjo23jJWtPv/LSo+2YnjfblPMAgNmFrO532xc8axSgZMN/HpTL28UewHD7GMZ5hnWbPcSIFrir5c4luq7AkEAi90WdnZVPxtSTqkkLYbnh4Ro2WhdwRjkfyBxBZZx8hfaM6MfLPi3A0rw9DPOSB4M/BMchtEh3bXuI7bue2tG+A==";

但是,在C#的,私钥和公钥的格式不是这样的,那应该怎么把JAVA转换成C#需要的格式呢?

C#中需要的密钥是如下格式:

stringprivatekey = @"vzPZCVcIvrDuu0jQZuXwBG1BJdj6kRbmGVQeWaymoe3iTz9KSgXv3qAOqTjLI5yhaGRlYs8+6ArfkyftX6bknJ+7wLSBUo59Y4DwDRPiHFXZOECgxSrtC0HYrqz0Ci6avEN8CQwFuxcQdjB8P+HGv/cNDeVS9IUHoGeGIcQ7LOk=AQAB";

string privatekey = @"vzPZCVcIvrDuu1jQZuXwBG1BJdj6kRbmGVQeWaymoe3iTz9KSgXv3qAOqTjLI5yhaGRlYs8+6ArfkyftX6bknJ+7wLSBUo59Y4DwDRPiHFXZOECgxSrtC0HYrqz0Ci6avEN8CQwFuxcQdjB8P+HGv/cNDeVS9IUHoGeGIcQ7LOk=AQAB

81Hqu5RXCBOLloURr3lRYzQBrkrFvqvRjsDu7UuWMLgCENjPl4GBkRaPMTAulf/Un6ibZklNc5O9qTJWLnyKhw==

ySqkcKbWuobq5I9KSQISq2qCuGKtj/iUFho4PCD1YxhnQ7gcHA4OpS1dRFjtXJYQPTX9be+mmypsCFIyofE5Dw==8ZnbTBqFOH2/0tuarfP2flx7dsbEBwmwcODd3T16ijGLy5KcvkFXl+sgj6TZ/RMj2syeUThj8Wk3n7Ndo5cCLQ==rNwKn46Nt4yVrT7/y0qPtmJ4325TzAIDZhazud9sXPGsUoGTDfx6Uy9vFHsBw+xjGeYZ1mz3EiBa4q+XOJbquw==i90WdnZVPxtSTqkkLYbnh4Ro2WhdwRjkfyBxBZZx8hfaM6MfLPi3A0rw9DPOSB4M/BMchtEh3bXuI7bue2tG+A==ol/9qRjorEjF9XEjSr9rHddKxEGIST8RGeF+BNnCiTHkRziQdlykYIO876jzmsKhsG3STB+EZLsXM3ls9RZefcsPF5mLOCSOCow3DikfCtAy4hntsU9JwpuYE0V4A+Sgfd24fatqbu+JxE2nvpSbAPczDOgBFPNfYBkhMiuZ/iE=";

由于密钥是用在正式使用中,所以以上给的只是一个形式。

既然这对密钥是从JAVA来的,那么,就必须到JAVA中去处理成C#的格式。

就算不会JAVA的新手都可以转换的,只需要把以下的代码添加进eclipse中就可以了,具体的怎么建java工程就自己去查一下。

把上面一对密钥转成C#中格式的密钥在JAVA中的转换代码如下:

package com;

import java.security.KeyFactory;

import java.security.PublicKey;

import java.security.interfaces.RSAPrivateCrtKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.PKCS8EncodedKeySpec;

import java.security.spec.X509EncodedKeySpec;

//import org.castor.util.Base64Decoder;

//import org.castor.util.Base64Encoder;

public class test {

public static void main(String[] args)

{

String tes="MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAL8z2QlXCL6w7rvY0Gbl8ARtQSXY+pEW5hlUHlmspqHt4k8/SkoF796gDqk4yyOcoWhkZWLPPugK35Mn7V+m5Jyfu8C0gVKOfWOA8A0T4hxV2ThAoMUq7QtB2K6s9AoumrxDfAkMBbsXEHYwfD/hxr/3DQ3lUvSFB6BnhiHEOyzpAgMBAAECgYEAol/9qRjorEjF9XEjSr9rHddKxEGIST8RGeF+BNnCiTHkRziQdlykYIO876jzmsKhsG3STB+EZLsXM3ls9RZefcsPF5mLOCSOCow3DikfCtAy4hntsU9JwpuYE0V4A+Sgfd24fatqbu+JxE2nvpSbAPczDOgBFPNfYBkhMiuZ/iECQQDzUeq7lFcIE4uWhRGveVFjNAGuSsW+q9GOwO7tS5YwuAIQ2M+XgYGRFo8xMC6V/9SfqJtmSU1zk72pMlYufIqHAkEAySqkcKbWuobq5I9KSQISq2qCuGKtj/iUFho4PCD1YxhnQ7gcHA4OpS1dRFjtXJYQPTX9be+mmypsCFIyofE5DwJBAPGZ20wahTh9v9Lbmq3z9n5ce3bGxAcJsHDg3d09eooxi8uSnL5BV5frII+k2f0TI9rMnlE4Y/FpN5+zXaOXAi0CQQCs3Aqfjo23jJWtPv/LSo+2YnjfblPMAgNmFrO532xc8axSgZMN/HpTL28UewHD7GMZ5hnWbPcSIFrir5c4luq7AkEAi90WdnZVPxtSTqkkLYbnh4Ro2WhdwRjkfyBxBZZx8hfaM6MfLPi3A0rw9DPOSB4M/BMchtEh3bXuI7bue2tG+A==";

byte[] temp=b64decode(tes);

String ver=getRSAPrivateKeyAsNetFormat(temp);//转换私钥

String tes1="MIGfMA0GCSqGSIb4DQEBAQUAA4GNADCBiQKBgQC/M9kJVwi+sO672NBm5fAEbUEl2PqRFuYZVB5ZrKah7eJPP0pKBe/eoA6pOMsjnKFoZGVizz7oCt+TJ+1fpuScn7vAtIFSjn1jgPANE+IcVdk4QKDFKu0LQdiurPQKLpq8Q3wJDAW7FxB2MHw/4ca/9w0N5VL0hQegZ4YhxDss6QIDAQAB";

byte[] temp1=b64decode(tes1);

String ver1=getRSAPublicKeyAsNetFormat(temp1);//转换公钥

//String temp2= encodePublicKeyToXml(temp1);

}

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("");

buff.append(""

+ b64encode(removeMSZero(pvkKey.getModulus().toByteArray()))

+ "");

buff.append(""

+ b64encode(removeMSZero(pvkKey.getPublicExponent()

.toByteArray())) + "");

buff.append("

"

+ b64encode(removeMSZero(pvkKey.getPrimeP().toByteArray()))

+ "

");

buff.append(""

+ b64encode(removeMSZero(pvkKey.getPrimeQ().toByteArray()))

+ "");

buff.append(""

+ b64encode(removeMSZero(pvkKey.getPrimeExponentP()

.toByteArray())) + "");

buff.append(""

+ b64encode(removeMSZero(pvkKey.getPrimeExponentQ()

.toByteArray())) + "");

buff.append(""

+ b64encode(removeMSZero(pvkKey.getCrtCoefficient()

.toByteArray())) + "");

buff.append(""

+ b64encode(removeMSZero(pvkKey.getPrivateExponent()

.toByteArray())) + "");

buff.append("");

return buff.toString().replaceAll("[ \t\n\r]", "");

} catch (Exception e) {

System.err.println(e);

return null;

}

}

private static String getRSAPublicKeyAsNetFormat(byte[] encodedPrivkey) {

try {

StringBuffer buff = new StringBuffer(1024);

PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec(encodedPrivkey);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

RSAPublicKey pukKey=(RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(encodedPrivkey));

// RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(pvkKeySpec);

//PublicKey publicKey =KeyFactory.getInstance("RSA").generatePublic(pvkKeySpec);

buff.append("");

buff.append(""

+ b64encode(removeMSZero(pukKey.getModulus().toByteArray()))

+ "");

buff.append(""

+ b64encode(removeMSZero(pukKey.getPublicExponent()

.toByteArray())) + "");

buff.append("");

return buff.toString().replaceAll("[ \t\n\r]", "");

} catch (Exception e) {

System.err.println(e);

return null;

}

}

public static String encodePublicKeyToXml(PublicKey key) {

if (!RSAPublicKey.class.isInstance(key)) {

return null;

}

RSAPublicKey pubKey = (RSAPublicKey) key;

StringBuilder sb = new StringBuilder();

sb.append("");

sb.append("")

.append(Base64.encode(pubKey.getModulus().toByteArray()))

.append("");

sb.append("")

.append(Base64.encode(pubKey.getPublicExponent()

.toByteArray())).append("");

sb.append("");

return sb.toString();

}

private static byte[] removeMSZero(byte[] data) {

byte[] data1;

int len = data.length;

if (data[0] == 0) {

data1 = new byte[data.length - 1];

System.arraycopy(data, 1, data1, 0, len - 1);

} else

data1 = data;

return data1;

}

private static String b64encode(byte[] data) {

String b64str = new String(Base64.encode(data));

return b64str;

}

private static byte[] b64decode(String data) {

byte[] decodeData = Base64.decode(data);

return decodeData;

}

}

到此,JAVA的密钥对,就可以转换成C#中的格式的密钥对了!

至于C#转成JAVA的格式,在下一章再写!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 私钥换为 Java 私钥的过程如下: 1. 首先,将 C# 私钥导出为 XML 格式。 2. 使用 Java密钥库管理工具(如 Keytool)创建一个新的 Java 密钥库文件。 3. 从 XML 文件中提取私钥和公钥,然后将它们换为 Java 中的 PrivateKey 和 PublicKey 对象。可以使用 Java 的 Bouncy Castle 库来完这一步骤。 4. 将 PrivateKey 和 PublicKey 对象存储到 Java 密钥库文件中。 5. 将 Java 密钥库文件导出为 JKS 格式。 下面是 C# 密钥换为 Java 密钥库的示例代码: ```csharp // 导出 C# 私钥为 XML 格式 CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "MyKeyContainer"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams); string privateKeyXml = rsa.ToXmlString(true); // 将 XML 格式私钥换为 Java 私钥对象 var doc = new XmlDocument(); doc.LoadXml(privateKeyXml); var rsaParams = new RSAParameters(); rsaParams.Modulus = Convert.FromBase64String(doc.GetElementsByTagName("Modulus")[0].InnerText); rsaParams.Exponent = Convert.FromBase64String(doc.GetElementsByTagName("Exponent")[0].InnerText); rsaParams.P = Convert.FromBase64String(doc.GetElementsByTagName("P")[0].InnerText); rsaParams.Q = Convert.FromBase64String(doc.GetElementsByTagName("Q")[0].InnerText); rsaParams.DP = Convert.FromBase64String(doc.GetElementsByTagName("DP")[0].InnerText); rsaParams.DQ = Convert.FromBase64String(doc.GetElementsByTagName("DQ")[0].InnerText); rsaParams.InverseQ = Convert.FromBase64String(doc.GetElementsByTagName("InverseQ")[0].InnerText); rsaParams.D = Convert.FromBase64String(doc.GetElementsByTagName("D")[0].InnerText); RSACryptoServiceProvider rsaJava = new RSACryptoServiceProvider(); rsaJava.ImportParameters(rsaParams); // 将 Java 私钥存储到密钥库中 var keyStore = KeyStore.GetInstance(KeyStore.DefaultType); keyStore.Load(null, null); keyStore.SetKeyEntry("mykey", rsaJava, null, null); var outputStream = new FileOutputStream("mykeystore.jks"); keyStore.Store(outputStream, "mypassword".ToCharArray()); outputStream.Close(); ``` 使用 Bouncy Castle 库将 XML 格式C# 公钥换为 Java 公钥对象的示例代码如下: ```java // 将 C# 公钥换为 Java 公钥对象 var doc = new XmlDocument(); doc.LoadXml(publicKeyXml); var rsaParams = new RSAParameters(); rsaParams.Modulus = Convert.FromBase64String(doc.GetElementsByTagName("Modulus")[0].InnerText); rsaParams.Exponent = Convert.FromBase64String(doc.GetElementsByTagName("Exponent")[0].InnerText); RSACryptoServiceProvider rsaJava = new RSACryptoServiceProvider(); rsaJava.ImportParameters(rsaParams); var publicKey = rsaJava.ExportParameters(false); // 将 Java 公钥存储到密钥库中 var keyStore = KeyStore.GetInstance(KeyStore.DefaultType); keyStore.Load(null, null); keyStore.SetCertificateEntry("mycert", new X509Certificate()); keyStore.SetKeyEntry("mykey", publicKey, null, null); var outputStream = new FileOutputStream("mykeystore.jks"); keyStore.Store(outputStream, "mypassword".ToCharArray()); outputStream.Close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值