天天看点

java rsa .net_JAVA和.NET RSA密钥格式相互转换(公钥,私钥)

java的公钥和私钥就直接是一个字符串的形式展示的,但是.net是以xml简单包裹形式展示的,这样就会出现秘钥不一致的情况,导致java和.net加密与解密出现障碍,

首先,我们来看一下java端的私钥和公钥的样子:

私钥:

MIIEpAIBAAKCAQEA1kzMNhu7lLciY1LNf4kpnGJ3ugM8hMHAdLAjTNppb0TvnkJj

ugj0q5Y4639jYss/EIz1xaDK9GOSjoSkI4jICwsvv9Zz/kTHXwCpCpH8saS2nJGV

UptChptEBVHMxBncSf7mglLwxHZcAsaC1EHZZ1JFupljjfPM8cewnE5eG/BptDwi

Mhu9Os8lyrnGDXECYWpfOzahSCEj9VtZvEV4uS9tq4/XD1h4wFVVSSwwVjyNRsB+

uUfKy4dtzXbkNqncCppMuGivOfETWiRDm855AbrbSofi+hedcO3g2WriK83EuJg+

aoFqVYQY4+u4WeCuJiihIZHl0pBXuuaJblI0YwIDAQABAoIBAQCJ+UolsDdWqY5P

apl6eoI6+L7jGYBWbTSPLHSd36WwiS7Jsy7oMSnua7rcDNmdWwSQkGEQy9TAAnfy

oH3ZjxBU4+/rUJS/6eJ/TTqI3rNWYJleNvFwDRyI8+CYmDEBNTE6xw38bJAtvZLC

CrNjG75womzYljedxpF2Pb589Ivs6e+F504+lHxCmUZCf4vo+yY7pvO7a0Fk/74P

ilcRi6rvgaew2f2TFlWz+dIKNYhBrVnsoDPuoeuVJFujCKtUJOFNXNMmhfpWROlu

hUddhcXqscIZRN9EJT6Nt0S7cD8ORFEdBI1yyUgY2cTKdB/jFStURtB8UJnsM5of

JVVsm3mJAoGBAPwzrQ1Y5FC52pWcGAUL+CZs6vhOcXLw6BeobeKh/i4pWUGKPQJ5

u8W7M2Gpq1T6QwpaURFvFoM4tWVAk0GF52/5E9ZwDncrAavSzEUmbiE9kFJmcQr2

KsObnqqed6K8AzEdHmQe7dQqMoU/d3m6Vmf1tAARu7Bwb6cO6NpfThNnAoGBANmG

/0K6dtNgXzYFVBMjdy1lARhwY6qINq54t59T+MrnUfazUs21v/sHOPtuYw8E4+vP

q6a9acGyepDYPYdxw4komPg08W3tJWpPk7Tu0e2Hb89OIr6A0ZyRdmPnqutU9FPu

cGpkYurSfdN3dIP8m8/DcQ0PnJs4Y569Nmz4bdWlAoGAWIFuDowOe8HtUqmXyFWd

/SYmA4PLznF6kara/TiqMdry5swzguXjno2Gh5R6evTkiAKQBpU8ikphZioWQ11R

jfsUGiHzAaEHEhyE8RN+fI3VUwV+UEF5WnIHaYr5IxPl7ttwKeSsw9MXLanLLN3W

qt8QDyIqAs5CcJcL4m6lwKsCgYAW02ijuudPJPS4uXRqEbWmyMuFof2DXonGYxp5

mJkpyX47UfPlbCX6FHbxQ1MXt16nVwJfG88mKTFdU6OZO+HV2bG7keqnq1PaxQDt

4oWa1DRyX3Ob4+6a7FStBRlVWnPM/t9C+se6dl4Hu6g5VV+QPKT3RuUbEJ67gIVe

h+8WlQKBgQDf+hXs0hINBz4buWnkXEXOCWlzAHC2QgHawjHdD6Wxg2vvkFPIPeky

i/2xCWxurwgmSZGthMWn+2+49iyJZc+OpzXyOJYLYYSETD1QFduPXU9hKmy4x8wA

TjSAigec3KEduFFEkmHPuvr/WbWM7kPsGf5F7SRyAxsjIFkVG117Hg==

公钥:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1kzMNhu7lLciY1LNf4kp

nGJ3ugM8hMHAdLAjTNppb0TvnkJjugj0q5Y4639jYss/EIz1xaDK9GOSjoSkI4jI

Cwsvv9Zz/kTHXwCpCpH8saS2nJGVUptChptEBVHMxBncSf7mglLwxHZcAsaC1EHZ

Z1JFupljjfPM8cewnE5eG/BptDwiMhu9Os8lyrnGDXECYWpfOzahSCEj9VtZvEV4

uS9tq4/XD1h4wFVVSSwwVjyNRsB+uUfKy4dtzXbkNqncCppMuGivOfETWiRDm855

AbrbSofi+hedcO3g2WriK83EuJg+aoFqVYQY4+u4WeCuJiihIZHl0pBXuuaJblI0

YwIDAQAB

我们再来看一下.net端的私钥和公钥的样子:

私钥:

vpUk3hmR9kDdo8+AoLfFqpP/JlPkU6VDlMaDqF5WoNUQcdUsfUT4cQSZaa5O/aeDP2llvPL0paQmlXn1bV2A0dJKTnvlWNQC/QGFlcVIfSWeDaZnZDn/Z1XEqwBKMnZtCIQZQPws7kqlouV9CmjcA2i8Fm9S0fDl7F6CfJfJlsM=AQAB

+94gtho2crq+GpiUDyunfpA5SdHWMslL0GtL3epn6D50AziKmsgWrnksFiKSyPy+3lLj/Qgxa8kLXQb1qg/3QQ==

wbWcrybn0eaxiPZacZLZXzXO8g12hYoXT1h0DTLvy1rnVUOspNfKZcBZMjPxT4+QEknoTShSnSbJ5sHitfZxAw==0yVTbPYqoSHWTvuMW+9v2hVUQYNtO2Qvb4kTr/VbqIH6xdx3reyBv0CL6f6P6XihFkaNJMnijIadRR6ZgjkiQQ==gPSTa3L+DxmCBQjj6wn01dJvg2p9BaeJnxPmpkbLplhM+tFDpLXXkud7OdWkhu+u3M4A7SSz4tTIwms+rx5x2w==4NxLLg6UCAoCpXMgqqZHWMgbMwNNFr9diCWP/tZ5OJmWYHgn7zfqMXa/RNaethjdG1biIkj5h7qm6XDBBqGuxw==r7YEWr1KhLcDYg9jMUqd9QokOSspnTEGoPlx016/EeO/GKSJMynOwSyTYQszisvRxzoecdmyU7GHXVMnQ2Ds7WvbcuNkIRWmxFa4nTkk2zNF6KByvvFwLiW4LQXF6B+uV7+ZNqvfhCoD/j2wki8jfWkuuAaKnTda/axHMi+zRYE=

公钥:

vpUk3hmR9kDdo8+AoLfFqpP/JlPkU6VDlMaDqF5WoNUQcdUsfUT4cQSZaa5O/aeDP2llvPL0paQmlXn1bV2A0dJKTnvlWNQC/QGFlcVIfSWeDaZnZDn/Z1XEqwBKMnZtCIQZQPws7kqlouV9CmjcA2i8Fm9S0fDl7F6CfJfJlsM=AQAB

一下给出java和.net互相转化代码

也可以在这里下载http://downloads.bouncycastle.org/csharp/bccrypto-net-1.7-bin.zip

以下为转化代码:

using System;

using System.Xml;

using Org.BouncyCastle.Asn1.Pkcs;

using Org.BouncyCastle.Asn1.X509;

using Org.BouncyCastle.Crypto.Parameters;

using Org.BouncyCastle.Math;

using Org.BouncyCastle.Pkcs;

using Org.BouncyCastle.Security;

using Org.BouncyCastle.X509;

///

/// RSA密钥格式转换

///

public class RSAKeyConvert

{

///

/// RSA私钥格式转换,java->.net

///

/// java生成的RSA私钥

///

public static string RSAPrivateKeyJava2DotNet(string privateKey)

{

RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));

return string.Format("{0}{1}

{2}

{3}{4}{5}{6}{7}",

Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),

Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));

}

///

/// RSA私钥格式转换,.net->java

///

/// .net生成的私钥

///

public static string RSAPrivateKeyDotNet2Java(string privateKey)

{

XmlDocument doc = new XmlDocument();

doc.LoadXml(privateKey);

BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));

BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));

BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));

BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));

BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));

BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));

BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));

BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));

RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);

PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);

byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();

return Convert.ToBase64String(serializedPrivateBytes);

}

///

/// RSA公钥格式转换,java->.net

///

/// java生成的公钥

///

public static string RSAPublicKeyJava2DotNet(string publicKey)

{

RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));

return string.Format("{0}{1}",

Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),

Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));

}

///

/// RSA公钥格式转换,.net->java

///

/// .net生成的公钥

///

public static string RSAPublicKeyDotNet2Java(string publicKey)

{

XmlDocument doc = new XmlDocument(); doc.LoadXml(publicKey);

BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));

BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));

RsaKeyParameters pub = new RsaKeyParameters(false, m, p);

SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);

byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();

return Convert.ToBase64String(serializedPublicBytes);

}

}