C# RSA加密与JAVA RSA互通

朕赐你肥皂 2015-02-01 11:18:16
现在一个接口问题,需要客户端(.net)根据RSA生成公钥通过接口发送到服务端(java)
我代码是这样写的:

/// <summary>
/// RSA加密
/// </summary>
/// <param name="str_Plain_Text">需要加密的明文</param>
/// <param name="str_Public_Key">公钥</param>
/// <param name="str_Private_Key">私钥</param>
/// <returns></returns>
public static string RSA_Encrypt(string str_Plain_Text, out string str_Public_Key, out string str_Private_Key)
{
str_Public_Key = "";
str_Private_Key = "";
UnicodeEncoding ByteConverter = new UnicodeEncoding();
byte[] DataToEncrypt = ByteConverter.GetBytes(str_Plain_Text);
try
{
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
str_Public_Key = Convert.ToBase64String(RSA.ExportCspBlob(false));
str_Private_Key = Convert.ToBase64String(RSA.ExportCspBlob(true));

//OAEP padding is only available on Microsoft Windows XP or later.
byte[] bytes_Cypher_Text = RSA.Encrypt(DataToEncrypt, false);
str_Public_Key = Convert.ToBase64String(RSA.ExportCspBlob(false));
str_Private_Key = Convert.ToBase64String(RSA.ExportCspBlob(true));
string str_Cypher_Text = Convert.ToBase64String(bytes_Cypher_Text);
return str_Cypher_Text;
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
}

然后不管怎么调用接口,返回的数据都是空,服务端JAVA那边人说,公钥是正确的就能得到数据,他们本地测试的生成公钥的方法如下:
BASE64Encoder base64Encoder = new BASE64Encoder();
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,密钥大小为2048位
keyPairGen.initialize(2048);
// 生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
// 得到私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 得到公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

Call call=(Call) service.createCall();
call.setTargetEndpointAddress(new URL(SOAP_SERVICE_ENDPOINT));
call.setOperationName("getKey");//调用getKey方法
//传入的公钥
String pk=base64Encoder.encode(publicKey.getEncoded());


各位大神!!!!!!!!请帮忙解决下这个问题,小弟在线等,非常着急
...全文
796 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yizhilideliliang 2016-01-27
  • 打赏
  • 举报
回复
@gaind 你好,你是怎么引用的BouncyCastle的呢?
朕赐你肥皂 2015-02-01
  • 打赏
  • 举报
回复
引用 8 楼 github_22161131 的回复:
BouncyCastle,一般和java做加密解密的互通使用它比较方便。 你可以用它生成rsa密钥对,也可以用.net的RSACryptoServiceProvider生成再转换过去。然后把公钥用 var keyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keypair.Public); var enc = keyInfo.ToAsn1Object().GetEncoded(); 得到的enc再base64应该就是java那边需要的格式了。
感谢,我先试试
winnowc 2015-02-01
  • 打赏
  • 举报
回复
BouncyCastle,一般和java做加密解密的互通使用它比较方便。 你可以用它生成rsa密钥对,也可以用.net的RSACryptoServiceProvider生成再转换过去。然后把公钥用 var keyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keypair.Public); var enc = keyInfo.ToAsn1Object().GetEncoded(); 得到的enc再base64应该就是java那边需要的格式了。
朕赐你肥皂 2015-02-01
  • 打赏
  • 举报
回复
引用 5 楼 github_22161131 的回复:
c#的RSA.ExportCspBlob(false) 和 java那边 publicKey.getEncoded() 不是一个格式的,当然不行。 java那边需要的公钥是der格式公钥的base64形式,.net上面没有直接支持导出der格式公钥的方法,需要用第三方框架或者自己写。
如果需要第三方框架是什么框架?
朕赐你肥皂 2015-02-01
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
哦,如果你纠结于“返回的数据都是空”这个问题,那么你跟对方协商让对方给你一个出错信息好了。 我想你是拿这个借口搪塞人家,来逃避你公钥错误这个事实的。
我来这里是需要有人帮我解决问题,不是我拿什么当借口,也不是要你来教训我什么
winnowc 2015-02-01
  • 打赏
  • 举报
回复
c#的RSA.ExportCspBlob(false) 和 java那边 publicKey.getEncoded() 不是一个格式的,当然不行。 java那边需要的公钥是der格式公钥的base64形式,.net上面没有直接支持导出der格式公钥的方法,需要用第三方框架或者自己写。
  • 打赏
  • 举报
回复
哦,如果你纠结于“返回的数据都是空”这个问题,那么你跟对方协商让对方给你一个出错信息好了。 我想你是拿这个借口搪塞人家,来逃避你公钥错误这个事实的。
  • 打赏
  • 举报
回复
引用 2 楼 gaind 的回复:
按道理说,我不管是传公钥或者是传什么,只要是个String类型的字符串,那边都会有返回值的~~~
那边是不是返回给你说“你公钥非法”这个值嘛。
朕赐你肥皂 2015-02-01
  • 打赏
  • 举报
回复
按道理说,我不管是传公钥或者是传什么,只要是个String类型的字符串,那边都会有返回值的~~~ 尼玛,JAVA那边人说,必须要传递正确的公钥~尼玛,机器能知道这个公钥是否正确啊?
tcmakebest 2015-02-01
  • 打赏
  • 举报
回复
单单从楼主的代码看, 返回空肯定是发生异常了,这么严重的问题居然被忽略啊
朕赐你肥皂 2015-02-01
  • 打赏
  • 举报
回复
感谢github_22161131 告之的BouncyCastle 下载这个控件引入后可以获取到数据了!! 代码如下: 引用 using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.X509; using Org.BouncyCastle.Math; RsaKeyPairGenerator rsaKeyPairGenerator = new RsaKeyPairGenerator(); RsaKeyGenerationParameters rsaKeyGenerationParameters = new RsaKeyGenerationParameters(BigInteger.ValueOf(3), new Org.BouncyCastle.Security.SecureRandom(), 1024, 25); rsaKeyPairGenerator.Init(rsaKeyGenerationParameters);//初始化参数 AsymmetricCipherKeyPair keyPair = rsaKeyPairGenerator.GenerateKeyPair(); AsymmetricKeyParameter publicKey = keyPair.Public;//公钥 AsymmetricKeyParameter privateKey = keyPair.Private;//私钥 SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey); PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey); Asn1Object asn1ObjectPublic = subjectPublicKeyInfo.ToAsn1Object(); byte[] publicInfoByte = asn1ObjectPublic.GetEncoded(); Asn1Object asn1ObjectPrivate = privateKeyInfo.ToAsn1Object(); byte[] privateInfoByte = asn1ObjectPrivate.GetEncoded(); String TemppublicKey = Convert.ToBase64String(publicInfoByte);//生成的公钥 String TempprivateKey = Convert.ToBase64String(privateInfoByte);//生成的密钥 搞定! 返回值(截取了一部分) returnKey":"WT//tT9nf6pAyz4Pyx0HCjsHpk18jUKMLW

110,533

社区成员

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

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

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