引用:http://blog.csdn.net/dslinmy/article/details/37362661
这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣鼓出来了。
首先,介绍一下写这代码的目的:完成webService验证问题,服务器端采用C#开发,客户端采用Java开发。服务器端给客户端提供公钥,已进行数据加密,客户端加密后提数据提交给服务器,服务器用私钥对数据解密,进行验证。
这里遇到的主要问题是C# RSACryptoServiceProvider类产生的公钥、私钥都是xml字符串数据,而java RSA算法要求的 Modulus、Exponent都是BigInteger类型,两者间的转换才是问题所在。
关于Java 和 C#各自独立的进行RSA加密解密,大家可以看整两篇文章,java RSA加密解密实现() 和 C#中RSA加密解密和签名与验证的实现。
接下来讲一下实现步骤:
首先由C# RSACryptoServiceProvider类生成公钥、私钥
/// <summary> /// 生成公钥、私钥 /// </summary> /// <returns>公钥、私钥,公钥键"PUBLIC",私钥键"PRIVATE"</returns> public Dictionary<string, string> createKeyPair() { Dictionary<string, string> keyPair = new Dictionary<string, string>(); RSACryptoServiceProvider provider = new RSACryptoServiceProvider(1024); keyPair.Add("PUBLIC", provider.ToXmlString(false)); keyPair.Add("PRIVATE", provider.ToXmlString(true)); return keyPair; }
如此处生成的公钥为
在客户端(Java)对C#提供的公钥提取Modulus和Exponent
用Modulus和Exponent产生公钥RSAPublicKey(java)
这里有个关键步骤先对Mudolus和Exponent进行Base64解码,这个是由于C#生成的密钥对,其参数已经过Base64编码成String类型,而java RSA参数是未经base64编码的byte[]类型。
至于Base64编码、解码方法,参考这篇文章,java 编码和解码,想详细。
经过测试,这样做的确得到了正确的结果。
若是有什么地方有问题,还望大家指正!