110,555
社区成员
发帖
与我相关
我的任务
分享
/// <summary>用私钥给数据进行RSA加密
///
/// </summary>
/// <param name="xmlPrivateKey">私钥</param>
/// <param name="m_strEncryptString">待加密数据</param>
/// <returns>加密后的数据(Base64)</returns>
public static string RSAEncryptByPrivateKey(string xmlPrivateKey, string strEncryptString)
{
//加载私钥
RSACryptoServiceProvider privateRsa = new RSACryptoServiceProvider();
privateRsa.FromXmlString(xmlPrivateKey);
//转换密钥
AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa);
IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");// 参数与Java中加密解密的参数一致
//第一个参数为true表示加密,为false表示解密;第二个参数表示密钥
c.Init(true, keyPair.Private);
byte[] DataToEncrypt = Encoding.UTF8.GetBytes(strEncryptString);
byte[] outBytes = c.DoFinal(DataToEncrypt);//加密
string strBase64 = Convert.ToBase64String(outBytes);
return strBase64;
}
static void RSADemo()
{
string privateJavaKey = @"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAISU+guXmcMuIxjSsveKWTxtRnguutnC9Cpv9fDCOaxwqWom8Q3IXam97cPWTKAQEcwbuTL4VIj64TGRMBBfpkMszCCDmhfWbvjQWimfI6NuF3WcvsiY5B2mn+Ns7PZPaypr2DKNgXmHNrHsBOTNvL1Cob0vTaSS1lo8cYNgyCwhAgMBAAECgYEAgI9pK2Z0rkOFuuNMsSZRQ3v+0jkV7GTTmHb6d9wOSrzwOkPKiP/aeub1sGmT4b3TVCUp31fXuP/077iGb8ogECYBK0Z+GPjwZ/7qWhRqCtKHSxBvpCjl3ZHLza4MCE5jj2/PkBjb44UMtTAG0uMExvYwsZI4VxT/X0kwDM82eQECQQDdYnI6adofR18OOQab0VgRzy1KyfAiBYpEpb3W4X2wQ0xtxUUjC0UIIpXUlgpzP8MYg7BVnFady8eKOrvwL7yxAkEAmU/zSyUNaCkXZPWhVQI0fjiW7FJHD8Ez7nMUxKiPjbm2K51nUjwtu6T6Rz/7phL9i2JaO2S4OYWlrf+6JSSCcQJAIKDQyxEsx61iMhtvgOmSvFU3jK1Eig8c+M8gspnbR24zxn3rmaWgj/lg8csHUUMVgvhttcBr96fACfxsFJNEkQJADCCG3irQJK0bbKEBYfgKrvFK/uaDOHvP38y6l9O9hzhpcInC4n5gH7etFHW7MifOZnghKxGMgQBRWrIfx1BcAQJBANZEOrqqwpeYhm+LKJg51CYS4H7/IxxCaCnZErA6MVCvlQTeCVztyf2tytJGy3BNROhhNcWwF04rDHPyjXO87Ug=";
string privateCSharpKey = RSAConverter.RSAPrivateKeyJava2DotNet(privateJavaKey);
string content = @"lm=0&rn=10&pn=0&fr=search&ie=gbk&word=RAS+%C3%DC%C2%EB%B3%A4%B6%C8+%CE%CA%CC%E2&skiptype=2&returnUrl=http://99.128.21.270/web/merResult.do&return2Url=http://99.128.21.270/web/merResult.do";
RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privateCSharpKey);
Console.WriteLine("允许加密的最大长度:{0}", provider.KeySize / 8 - 11);
Console.WriteLine("要加密长度:{0}", content.Length);
var publicCSharpKey = provider.ToXmlString(false);
//content = "12345612345612345612345612345612345612345612345623456123456123456123456123456123456123456123456123456123456";
//string encData = RSAHelper.Encrypt(publicCSharpKey, content);//error too long
//Console.WriteLine("加密后的内容:{0}", encData);
//Console.WriteLine("私钥解密结果:" + RSAHelper.Decrypt(privateCSharpKey, encData));
string halg = "SHA256";//SHA1 MD5 SHA256
string signData = RSAHelper.SignData(privateCSharpKey, content, halg);//SHA1
Console.WriteLine("生成签名:" + signData);
Console.WriteLine("签名一致:" + RSAHelper.VerifyData(publicCSharpKey, content, signData, halg));
}
用你的试了,直接用SignData没问题,你可以要求java方也采用那篇博客里的java下的签名方式,代码也都有,如果对方不行,那就莫宰羊了……