这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣鼓出来了。
首先,介绍一下写这代码的目的:完成webService验证问题,服务器端采用C#开发,客户端采用Java开发。服务器端给客户端提供公钥,已进行数据加密,客户端加密后提数据提交给服务器,服务器用私钥对数据解密,进行验证。
这里遇到的主要问题是C# RSACryptoServiceProvider类产生的公钥、私钥都是xml字符串数据,而java RSA算法要求的 Modulus、Exponent都是BigInteger类型,两者间的转换才是问题所在。
接下来讲一下实现步骤:
首先由C# RSACryptoServiceProvider类生成公钥、私钥
如此处生成的公钥为
在客户端(Java)对C#提供的公钥提取Modulus和Exponent
用Modulus和Exponent产生公钥RSAPublicKey(java)
这里有个关键步骤先对Mudolus和Exponent进行Base64解码,这个是由于C#生成的密钥对,其参数已经过Base64编码成String类型,而java
RSA参数是未经base64编码的byte[]类型。
获得公钥后就可以进行RSA加密处理了,这里还有一点需要提的是,RSA加密解密都有最大长度限制,加密最大长度为117字节,解密最大长度是128字节,此外,此处加密得到的数据是经过Base64编码处理的
加密后的数据提交给C#服务器端进行解密,当然,这里也要注意最大长度限制问题
这样,就顺利完成了。
经过测试,这样做的确得到了正确的结果。
若是有什么地方有问题,还望大家指正!
----------------------------------------------------------------------------------------
<a target="_blank" href="http://blog.csdn.net/dslinmy/article/details/37881067">C# Java间进行RSA加密解密交互(二)</a>
<a target="_blank" href="http://blog.csdn.net/dslinmy/article/details/38016831">C# Java间进行RSA加密解密交互(三)</a>