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);
}
}