Java代码:
/*
* 公钥加密,私钥解密
* */
@SuppressWarnings("deprecation")
private static void EncRSA() throws UnsupportedEncodingException
{
//公钥
String publickey="<RSAKeyValue><Modulus>lAZkkM9+ety4jYO7EK+UCDw7b2jCukkTSsoSGzjmVeL/x5xwmLezQKmQKd8231SVQ8Kiy576NA28d3/km8P8s9NNYGlTm0/TxjBcF4DhwlLp1cjqJHDEkJF9KLsDHkddCXAdC9CIvQhn5aMtZ0AlDTVB2vcZdga4DYaNyzwmZ9k=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
PublicKey pubKey = RsaHelper.decodePublicKeyFromXml(publickey);
//私钥
String privatekey = "<RSAKeyValue><Modulus>lAZkkM9+ety4jYO7EK+UCDw7b2jCukkTSsoSGzjmVeL/x5xwmLezQKmQKd8231SVQ8Kiy576NA28d3/km8P8s9NNYGlTm0/TxjBcF4DhwlLp1cjqJHDEkJF9KLsDHkddCXAdC9CIvQhn5aMtZ0AlDTVB2vcZdga4DYaNyzwmZ9k=</Modulus><Exponent>AQAB</Exponent><P>zJn0qTCSaaPdMm00HwCvmuRTP7i+Hahxbuq9fQVEQq+FI4/Brv6Ir3bPIBklr6q5G4GLUjGNr9l2t7DuwP7AKQ==</P><Q>uTX42WUoxeOvGVZFKfpgwMRjycaLkY4RpTUk/CMaEhURgDq/AxwEFEGDG3iZcp2x6e24W65mOmuwJ+ejqgMQ==</Q><DP>OmYPMWONxt1gu43z/I1jkiBtqph+m1SC3BfgchjYvPgAVoAn1l0Mgpi00gKbgSKHp1Q4ggNm37SAcDnuS+Pq0Q==</DP><DQ>MjAU6dwGq3EiPqxo+5IUa8gL/l5l7aBg2bLH/ecJJoM9BdFld1M9K7wA6g3JDwz6bBh1z6o3m3cZNEzDxx1h0Q==</DQ><InverseQ>HlgXgA1f2xyh5Ap8WYZV+DzP5J0wazVYKhgmky0QEYNYvW42sLgq1pwjovhbUVRUYwzceQgyk6b78ptYXh1BZw==</InverseQ><D>EEKPg3S3gQmD4E+rGc8fpLPxF3DbixkB3IJL8N+UNbUEwcmGeNAdCapWorLZVTj2WIYl2dYxx8wGet36n72soW1vrVJ5YwhJN0bMGP0tAzmU1qrSMwt17jdqKpCLVfBxHJMjMhL6qaSx4LBN4e690LcOG/44Kfm0CViIdyEE6IE=</D></RSAKeyValue>";
//将C#端私钥转换成Java端私钥
PrivateKey prvKey=RsaHelper.decodePrivateKeyFromXml(privatekey);
String dataStr = "jiaye";
byte[] dataByteArray = dataStr.getBytes("utf-8");
System.out.println("data的Base64表示:"
+ Base64Helper.encode(dataByteArray));
System.out.println((new Date()).toLocaleString() + ": 加密中。。。"); // 加密
byte[] encryptedDataByteArray = RsaHelper.encryptData(
dataByteArray, pubKey);
System.out.println("encryptedData的Base64表示:"
+ Base64Helper.encode(encryptedDataByteArray));
//解密C#加密好的密文:
System.out.println((new Date()).toLocaleString() + ": C#加密好的密文解密中。。。"); // 解密
String prvstr="BuVtIEeEkFAnqIES9a1hwe2EY9leETykIRUxhdZAqcJxh97MOk4qHuTnYswTrlX4D+25sPaVnEPfCo5T9+OAhQyKUjitEMDXttP6Hb0W8ya69T3WfUes1HCFLjv7FSgPYLVFpJfvR/z3t+z93CF8pgtbnsIY8ZWpxpt//LmiFNs=";
byte[] b= Base64Helper.decode(prvstr);
byte[] dec = RsaHelper.decryptData(b, prvKey);
// System.out.println(new String(dec, "utf-8"));
System.out.println((new Date()).toLocaleString() + ": java解密中。。。"); // 解密
// byte[]
byte[] decryptedDataByteArray = RsaHelper.decryptData(
encryptedDataByteArray, prvKey);
System.out.println(new String(decryptedDataByteArray, "utf-8"));
System.out.println((new Date()).toLocaleString() + ": java签名中。。。");// 签名
byte[] signDataByteArray = RsaHelper.signData(dataByteArray,
prvKey);
System.out.println("signData的Base64表示:"
+ Base64Helper.encode(signDataByteArray));
// 验签
//C#生成的签名验证:
String signc="b87FdJsdVTBkNOoP4kl375mzinY9bcwDZAHOvvw/0sHT7pFF/m1nDnB9UL5hHZ4rNIsV75EIHS43RL4+XgKXx6+xQFbIqIwc7CZ0DYMrKJ7oDCUVZH/BogvhYKpaht4u0vge8Twst12xMGQBH/zy5Hvx1AOJ+xNMMBrPnSRKavE=";
System.out.println((new Date()).toLocaleString() + ": C#生成的签名验签中。。。");
byte[] signcbyte= Base64Helper.decode(signc);
boolean flagc = RsaHelper.verifySign(dataByteArray, signcbyte, pubKey);
System.out.println("验签结果:" + flagc);
System.out.println((new Date()).toLocaleString() + ": java验签中。。。");
boolean isMatch = RsaHelper.verifySign(dataByteArray,
signDataByteArray, pubKey);
System.out.println("验签结果:" + isMatch);
}
.Net代码:
public static class RSAHelper
{
private const int MAXDECRYPTSIZE = 128;
/// <summary>
/// RSA解密
/// </summary>
/// <param name="encryptData">经过Base64编码的密文</param>
/// <param name="privateKey">私钥</param>
/// <returns>RSA解密后的数据</returns>
public static string decrypt(string encryptData, string privateKey)
{
string decryptData = "";
try
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateKey);
byte[] bEncrypt = Convert.FromBase64String(encryptData);
int length = bEncrypt.Length;
int offset = 0;
string cache;
int i = 0;
while (length - offset > 0)
{
if (length - offset > MAXDECRYPTSIZE)
{
cache = Encoding.UTF8.GetString(provider.Decrypt(getSplit(bEncrypt, offset, MAXDECRYPTSIZE), false));
}
else
{
cache = Encoding.UTF8.GetString(provider.Decrypt(getSplit(bEncrypt, offset, length - offset), false));
}
decryptData += cache;
i++;
offset = i * MAXDECRYPTSIZE;
}
}
catch (Exception e)
{
throw e;
}
return decryptData;
}
/// <summary>
/// 截取字节数组部分字节
/// </summary>
/// <param name="input"></param>
/// <param name="offset">起始偏移位</param>
/// <param name="length">截取长度</param>
/// <returns></returns>
private static byte[] getSplit(byte[] input, int offset, int length)
{
byte[] output = new byte[length];
for (int i = offset; i < offset + length; i++)
{
output[i - offset] = input[i];
}
return output;
}
/// <summary>
/// 加密
/// </summary>
/// <param name="original">原文</param>
/// <param name="publicKey">公钥</param>
/// <returns></returns>
public static string encrypt(string original, string publicKey)
{
string creatingext;
try
{
var enc = new UTF8Encoding();
byte[] bytes = enc.GetBytes(original);
var crypt = new RSACryptoServiceProvider();
crypt.FromXmlString(publicKey);
bytes = crypt.Encrypt(bytes, false);
creatingext = Convert.ToBase64String(bytes);
}
catch (Exception ex)
{
throw ex;
}
return creatingext;
}
}