求 一个可用C#用RSA私钥加密代码

cqhydz 2016-10-27 02:54:09
对方是java开发的程序,需要RSA,在百度上找了好几天都有没找到合意的。求各位大神出手
测试加密私钥 pkcs8格式
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAISU+guXmcMuIxjSsveKWTxtRnguutnC9Cpv9fDCOaxwqWom8Q3IXam97cPWTKAQEcwbuTL4VIj64TGRMBBfpkMszCCDmhfWbvjQWimfI6NuF3WcvsiY5B2mn+Ns7PZPaypr2DKNgXmHNrHsBOTNvL1Cob0vTaSS1lo8cYNgyCwhAgMBAAECgYEAgI9pK2Z0rkOFuuNMsSZRQ3v+0jkV7GTTmHb6d9wOSrzwOkPKiP/aeub1sGmT4b3TVCUp31fXuP/077iGb8ogECYBK0Z+GPjwZ/7qWhRqCtKHSxBvpCjl3ZHLza4MCE5jj2/PkBjb44UMtTAG0uMExvYwsZI4VxT/X0kwDM82eQECQQDdYnI6adofR18OOQab0VgRzy1KyfAiBYpEpb3W4X2wQ0xtxUUjC0UIIpXUlgpzP8MYg7BVnFady8eKOrvwL7yxAkEAmU/zSyUNaCkXZPWhVQI0fjiW7FJHD8Ez7nMUxKiPjbm2K51nUjwtu6T6Rz/7phL9i2JaO2S4OYWlrf+6JSSCcQJAIKDQyxEsx61iMhtvgOmSvFU3jK1Eig8c+M8gspnbR24zxn3rmaWgj/lg8csHUUMVgvhttcBr96fACfxsFJNEkQJADCCG3irQJK0bbKEBYfgKrvFK/uaDOHvP38y6l9O9hzhpcInC4n5gH7etFHW7MifOZnghKxGMgQBRWrIfx1BcAQJBANZEOrqqwpeYhm+LKJg51CYS4H7/IxxCaCnZErA6MVCvlQTeCVztyf2tytJGy3BNROhhNcWwF04rDHPyjXO87Ug=

测试加密内容
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

---------------------------------------------------------------
可以使用BouncyCastle.Crypto.dll ,有这个插件1.7.4114.6375/1.8 版。
参考过的代码
http://blog.csdn.net/theodore26/article/details/50331049
无法处理较长的加密内容
http://www.knowsky.com/561737.html
不太好用。
转换pkcs8格式到xml
http://www.cnblogs.com/datous/p/RSAKeyConvert.html
-------------------------------------------------------------------------------
测试后发现这个还行,但无法对长字符进行处理。转xml格式需要用我上面哪个
  /// <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;
}
...全文
1142 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuxuzhaozhao87 2017-04-17
  • 打赏
  • 举报
回复
楼主,麻烦帮下忙,你是怎么解决长字符串加密的啊?真的要被这个RSA搞疯了。
cqhydz 2016-10-31
  • 打赏
  • 举报
回复
引用 13 楼 starfd 的回复:
string halg = "SHA256";//SHA1 MD5 SHA256 Signature signature = Signature.getInstance(“SHA1withRSA”); 一个是SHA256,一个是SHA1
基本本解决了,你的方法是可用的。谢谢结贴
cqhydz 2016-10-28
  • 打赏
  • 举报
回复
引用 13 楼 starfd 的回复:
string halg = "SHA256";//SHA1 MD5 SHA256 Signature signature = Signature.getInstance(“SHA1withRSA”); 一个是SHA256,一个是SHA1
我已经进行修改了的SHA1,但出来的签名仍不对,不会java只有等提供看一下。 AV8bFyUcPhNKWps054K/O2/4ovLKE2fQ07+20VB6KngkVt2lHx/Y8+v+Xg+Spv4QDxk0FndPe+k5bANwth4zM4GjEQqjmzOZGMOJh8OHJkGGvBwGX03+Y6o4Bd6ABQNxCu1LnEFt/iH0jHumt+J69slpt6Si8qhA3VXK0bOnoec= 在网上找了个代码BouncyCastle的,能模拟java签名,但我不知道如何时将Modulus>hex string <Modulus>hJT6C5eZwy4jGNKy94pZPG1GeC662cL0Km/18MI5rHCpaibxDchdqb3tw9ZMoBARzBu5MvhUiPrhMZEwEF+mQyzMIIOaF9Zu+NBaKZ8jo24XdZy+yJjkHaaf42zs9k9rKmvYMo2BeYc2sewE5M28vUKhvS9NpJLWWjxxg2DILCE=</Modulus> <Exponent>AQAB</Exponent> 转成类似> modulus: a054f6d4200348efa66cc6795c4a107337ad14d27cba13ea9c8da63e542e377a7539f0b8cfecb1674d4fabebf11151337406c66cdbc580fa
  • 打赏
  • 举报
回复
string halg = "SHA256";//SHA1 MD5 SHA256 Signature signature = Signature.getInstance(“SHA1withRSA”); 一个是SHA256,一个是SHA1
cqhydz 2016-10-27
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
http://blog.csdn.net/starfd/article/details/51838589 用BouncyCastle将java的base64格式转为net的xml格式,不需要你这个DotNetUtilities,然后怎么从私钥得到公钥在#8的代码里
程序建立好了,我试着还原了一下,同公钥是一致了。但我发现签名同哪面给我数据样本有点不一致 java 处理 ** * 用私钥对信息生成数字签名 * @param data 待签名数据 * @param privateKey 私钥 * @return * @throws Exception */ public static String sign(byte[] data, String privateKey) throws Exception { byte[] keyBytes = Base64Utils.decode(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); //加密算法:RSA KeyFactory keyFactory = KeyFactory.getInstance(“RSA”); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); //用SHA算法签名,用RSA算法加密 Signature signature = Signature.getInstance(“SHA1withRSA”); signature.initSign(privateK); signature.update(data); //对签名进行Base64编码,变为可读的字符串 return new String(Base64Utils.encode(signature.sign())); } 使用此私钥对下文数据进行签名 amount=10&merOrderId=T201608240001&merchantId=898310060514001&mode=3¬ifyUrl=http://116.228.21.170:80/webpay/merReceiveUmsNotify.do&return2MerUrl=http://116.228.21.170/webpay/merPayResult.do 得 L+xjoZKUDdS1hWWQHygPgMB+oRGJI0+FRhzzeQkwlfLOzBDs03MNymNu/SrZmnpZsmtKh3zeaEJAwZT21hW8LlBdGyMvq37RPIqU/4FpNtrzuvNEJ+q0xMwgHdY37S/4QosuFr7Sdys+UAiZHOTBozWE6DvFlja4H/yBUMaXQLc= --------------------上面是样本----------------------------------- 我发现我签名得到的是 Kfq6JX2kNy39H+ATZB+gCMPR/t4HAmcw/X0my++Rwux1zhmIr0rZDGzVL1aJ/u4X3G1jqS95rVqYPdsIkb/XcmblHnFLFgRk4bPqZoU6TbXbVlI6bObmwPyXFHq7zbBMO6oddF8ufKIcuMjFffm32Na5KcSeWhCYWzNQX0/6sqo=
cqhydz 2016-10-27
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
http://blog.csdn.net/starfd/article/details/51838589 用BouncyCastle将java的base64格式转为net的xml格式,不需要你这个DotNetUtilities,然后怎么从私钥得到公钥在#8的代码里
谢谢回复,我想问一下,推导出来的公钥是 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCElPoLl5nDLiMY0rL3ilk8bUZ4LrrZwvQqb/XwwjmscKlqJvENyF2pve3D1kygEBHMG7ky+FSI+uExkTAQX6ZDLMwgg5oX1m740FopnyOjbhd1nL7ImOQdpp/jbOz2T2sqa9gyjYF5hzax7ATkzby9QqG9L02kktZaPHGDYMgsIQIDAQAB 这个值吗,我还在重建你的示例,我的是net3.5 不能用默认值,有点错误。
  • 打赏
  • 举报
回复
http://blog.csdn.net/starfd/article/details/51838589 用BouncyCastle将java的base64格式转为net的xml格式,不需要你这个DotNetUtilities,然后怎么从私钥得到公钥在#8的代码里
cqhydz 2016-10-27
  • 打赏
  • 举报
回复
加载公钥时 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCElPoLl5nDLiMY0rL3ilk8bUZ4LrrZwvQqb/XwwjmscKlqJvENyF2pve3D1kygEBHMG7ky+FSI+uExkTAQX6ZDLMwgg5oX1m740FopnyOjbhd1nL7ImOQdpp/jbOz2T2sqa9gyjYF5hzax7ATkzby9QqG9L02kktZaPHGDYMgsIQIDAQAB //转换密钥 AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa); 提示:该项不适于在指定状态下使用。 有对BouncyCastle 知道多一点的吗,这里应如何修改
  • 打赏
  • 举报
回复
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下的签名方式,代码也都有,如果对方不行,那就莫宰羊了……
  • 打赏
  • 举报
回复
KeyGenerator在前面的博客里,http://blog.csdn.net/starfd/article/details/51907315,那个只是生成秘钥的封装,不影响其他
  • 打赏
  • 举报
回复
C#不提供私钥加密,公钥解密功能,因为它本身已经按标准提供了签名过程,而java也有配套签名的方法 难道签名也有长度问题?
cqhydz 2016-10-27
  • 打赏
  • 举报
回复
另外它是一个签名、验签测试,非加密解密
cqhydz 2016-10-27
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
http://blog.csdn.net/starfd/article/details/51917916
这个代码我也找过,它是用的公钥加密-私钥解密,现在需要私钥加密-公钥解密,而且这个代码基本.net4.0有部分代码不对,还有如KeyGenerator 也没有找到定义代码。
  • 打赏
  • 举报
回复
http://www.cnblogs.com/zys529/archive/2012/05/24/2516539.html 然后太长导致的加密失败,可以参考这个
cqhydz 2016-10-27
  • 打赏
  • 举报
回复
忘记说程序环境了是基本于.net 2.0/3.5 上的代码。私钥加密,公钥解密,支持长字符串。

110,555

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧