- ·上一篇文章:vs2005下Global.asax缺少cs文件的解决方法
- ·下一篇文章:CollapsiblePanel控件使用方法介绍
java与.net平台之间进行RSA加密验证
buff.append("</RSAKeyValue>");
return buff.toString().replaceAll("[ \t\n\r]", "");
} catch (Exception e) {
System.err.println(e);
return null;
}
}
通过以上两个方法,就可以将java端的公钥和私钥转换为.net端的了。
然后.net端可以用如下代码装载转换好的key
//java端转换为.net端的私钥
string NET_PRIVATE_KEY = @"<RSAKeyValue><Modulus>lKc3QnhdBGrA+Tkz0QvbgEWHDjS/AMp4bhwqFgQXdo+mIwC/8POr8GpgCpsY2GgU+PBIFI51q2U64aKFwQYQhxSiQI3r7kAa5+DVQVhheRlAaHz/iRMr2HqVkxqtjoTbNjVCMuTqgX7xu30YDcX9ZXSH0lGWCy3NEdzxBpOAtFk=</Modulus><Exponent>AQAB</Exponent><P>3eX5uQZalJF/tgosNUUV8ss4aVAwDntID63Ta6bFEnZFzp3YckXKGzmOQuygHK0tuUviN+BQFlk0eelMz3JMiQ==</P><Q>q3+YtH0B30ijTITtGWqNI+zXbhpodhVuugWHkihz9XKFQ7srbYA3YovvyOmK1Q/zlF92X3MFfUjRFWB/fEVVUQ==</Q><DP>Ey1tB7Ck43Ivt2vppjDyVKl7lp53iMje0XwUaZlgLthJ8DF0I2wkq3Wt9dq9e7z71qfYRTv9r/DFuEORf9xBAQ==</DP><DQ>n2ynDSmkIugIfeqX6meluv7BqWW9NABqhVz8kT8vxLzn63XEQi/NzLtfdbq8x6HjgktX5BUtxjB5xVCGUoS1cQ==</DQ><InverseQ>FNZDF90zR/2b/kevm4DomVTs7Iz/oaidOFsLQqD4BZfycuMdpTMAO8UUVtK5+eL7G24JaJAmb1U6QfkTc4syOQ==</InverseQ><D>cVf2aHZB5kZHkT+uZKx31xwsWAabxEyc+sf6xwKjqUDqWjIOJ/iDlzJkvHF5xjfGFfGP5CyjR+ZNuREkjwLCwjBiOhp34QMuN22LbKfHsvgHYiAOqkTxwASQ2FwaonA8nrfluHZhWECMrOSYag2QWuaOoToF91XvkNf8tBFcHQE=</D></RSAKeyValue>";
//java端转换为.net端的公钥
//string NET_PUBLIC_KEY = @"<RSAKeyValue><Modulus>vpUk3hmR9kDdo8+AoLfFqpP/JlPkU6VDlMaDqF5WoNUQcdUsfUT4cQSZaa5O/aeDP2llvPL0paQmlXn1bV2A0dJKTnvlWNQC/QGFlcVIfSWeDaZnZDn/Z1XEqwBKMnZtCIQZQPws7kqlouV9CmjcA2i8Fm9S0fDl7F6CfJfJlsM=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(NET_PRIVATE_KEY);
//RSA.FromXmlString(NET_PUBLIC_KEY);
注意,如果.net端只是验证,可以只导入NET_PUBLIC_KEY;如果.net端既加密又验证,那么只导入NET_PRIVATE_KEY即可,不用导入NET_PUBLIC_KEY。
下面给出完整代码及使用说明:
使用说明:
1.使用java端的GenerateKeys方法,生成java端和.net端需要的公钥和私钥
2.java端调用Sign方法进行加密,调用Verify方法进行验证
3..net端调用signData方法进行加密,调用verifySignature方法进行验证
.net端c#代码:
using System;
using System.Security.Cryptography;
using System.IO;
using System.Text;
using System.Xml;
using System.Web;
namespace RSASecurity
{
class ssosign
{
private RSAParameters RSAKeyInfo;
private static RSACryptoServiceProvider RSA=null;
//私钥
private const string NET_PRIVATE_KEY = @"<RSAKeyValue><Modulus>lKc3QnhdBGrA+Tkz0QvbgEWHDjS/AMp4bhwqFgQXdo+mIwC/8POr8GpgCpsY2GgU+PBIFI51q2U64aKFwQYQhxSiQI3r7kAa5+DVQVhheRlAaHz/iRMr2HqVkxqtjoTbNjVCMuTqgX7xu30YDcX9ZXSH0lGWCy3NEdzxBpOAtFk=</Modulus><Exponent>AQAB</Exponent><P>3eX5uQZalJF/tgosNUUV8ss4aVAwDntID63Ta6bFEnZFzp3YckXKGzmOQuygHK0tuUviN+BQFlk0eelMz3JMiQ==</P><Q>q3+YtH0B30ijTITtGWqNI+zXbhpodhVuugWHkihz9XKFQ7srbYA3YovvyOmK1Q/zlF92X3MFfUjRFWB/fEVVUQ==</Q><DP>Ey1tB7Ck43Ivt2vppjDyVKl7lp53iMje0XwUaZlgLthJ8DF0I2wkq3Wt9dq9e7z71qfYRTv9r/DFuEORf9xBAQ==</DP><DQ>n2ynDSmkIugIfeqX6meluv7BqWW9NABqhVz8kT8vxLzn63XEQi/NzLtfdbq8x6HjgktX5BUtxjB5xVCGUoS1cQ==</DQ><InverseQ>FNZDF90zR/2b/kevm4DomVTs7Iz/oaidOFsLQqD4BZfycuMdpTMAO8UUVtK5+eL7G24JaJAmb1U6QfkTc4syOQ==</InverseQ><D>cVf2aHZB5kZHkT+uZKx31xwsWAabxEyc+sf6xwKjqUDqWjIOJ/iDlzJkvHF5xjfGFfGP5CyjR+ZNuREkjwLCwjBiOhp34QMuN22LbKfHsvgHYiAOqkTxwASQ2FwaonA8nrfluHZhWECMrOSYag2QWuaOoToF91XvkNf8tBFcHQE=</D></RSAKeyValue>";
//公钥参数
private const string PUB_KEY_MODULES = @"1lpnLvumD8/NedJ7s4WS8UO9OORbXVTgJXmfa72bI4A1L1l6Np91BETQ+yB8Fq6iGWw5OR8OB2UbRBcopb2etepDqWd7kmCtbVT36kTW+E8dWdaVjbI2BCXEGaXuzPPdGOlp52OaawYR5zyG0MiCvJ4jE7RDJax4Cl24ZqPUs4U=";
//公钥参数
private const string PUB_KEY_EXP = @"AQAB";
/**//// <summary>
/// Reads the Public key file and Loads the RSAParameters with the
/// Modulous and Exponent data.
/// </summary>
public ssosign(RSAType type)
{
RSA = new RSACryptoServiceProvider();
//if (type == RSAType.ITDMS)
//{
// RSAKeyInfo = new RSAParameters();
// RSAKeyInfo.Modulus = Convert.FromBase64String(PUB_KEY_MODULES);
// RSAKeyInfo.Exponent = Convert.FromBase64String(PUB_KEY_EXP);
// RSA.ImportParameters(RSAKeyInfo);
//}
//else //type == RSAType.RSP
//{
RSA.FromXmlString(NET_PRIVATE_KEY);
//}
}
/**//// <summary>
/// sign the data
/// </summary>
/// <param name="dataToBeSigned"></param>
/// <returns></returns>
public string signData(string dataToBeSigned)
{
byte[] data = Encoding.UTF8.GetBytes(dataToBeSigned);
byte[] endata = RSA.SignData(data,"SHA1");
return Convert.ToBase64String(endata);
}
/**//// <summary>
/// Verifies the signature for a given data.
/// </summary>
/// <param name="signature">Signature data in Base64</param>
/// <param name="signedData">Original data in BASE64</param>
/// <returns>True if signature is valid else False</returns>
public bool verifySignature(string signature,string signedData)
{
byte[] sign = Convert.FromBase64String(signature);
return verifySignature(sign,signedData);
}
/**//// <summary>
/// Verifies the signature for a given data.
/// </summary>
/// <param name="signature">The signature </param>
/// <param name="signedData">Original data in Base64</param>
/// <returns></returns>
public bool verifySignature(byte[] signature , string signedData)
{
try
{
byte[] hash = Convert.FromBase64String(signedData);
if(RSA.VerifyData(hash,"SHA1",signature))
{
return true;
}
else
{
//Consol
java与.net平台之间进行RSA加密验证