rsa加密:Java与.Net环境下RSA加密解密交互不成功



由于项目需要我们要实现Java环境下面用RSA公钥对信息加密、然后在.Net环境下面用RSA私钥解密这个功能;
由于以前没有深入接触过.Net所以遇到这个问题时候还是心里比较没底但是我觉得这个问题肯定能够解决RSA加密解密算法已经太成熟了各语言应该都会提供标准支持才对;

但经过测试的后发现:原来跨平台间交互还是存在很多障碍各平台对标准支持度相差太多;直接体现就是本平台内加密的后解密没有问题但是方加密另外方解密就不行!!

由于经过加密结果都是所以对进行了base64编码然后再进行传输;

问题解决过程中发现以下些有趣问题:
1、.Net下面对串转换成思路方法有好几类比如Encoding.Default.GetString、ByteConverter.GetBytes等;但这些思路方法并不是等效要谨慎使用前者是符合我们期望结果每个字母会返回后者每个字母会返回2个其中第 2个值为0;
2、.Net和Java环境下面取值范围不Java中是-128-127;而.Net下面则是0-255;加密的后中很多都是非可见只能通过值来看所以要注意两个平台内差别但是对相同值相差256是正常只是各平台实现区别而已;
3、.Net环境下面对同样串用相同RSA公钥加密居然每次结果不样!而Java环境下面则每次结果是;这点就是我们此次解决互通问题关键!究其原因是这样:.Net为了加强RSA加密算法安全性在每次加密时候都会生成随机数和原始数据起被加密这显然不是单纯标准RSA加密;而Java中RSA加密是完全标准化不添加随机数;这样双方加密标准就是不所以方加密另方解密肯定是不能成功啦!
4、既然找到了双方不能互通原因那接下来就只能想办法消除这两者间差别了;思路方法有 2:其是.Net方修改代码放弃默认RSA算法实现类自己实现套支持标准化类;其 2是Java方修改代码保持和.Net方;两者比较话思路方法 2几乎没有可实施性无法看到.Net源代码也就无法知道随机数添加规则另外若java方修改后续可能会导致很多新问题我们不仅要和.Net互通还要和Php等其他语言互通;思路方法可行但是难度不小幸好已经有达人在.Net下实现了标准化RSA算法可以参考http://www.codeproject.com/csharp/bigeger.asp项目;
5、虽然找到了实现标准化RSA算法类文件但是他需要RSA私钥中两个参数D和Modules;但我们是使用证书没法直接使用;幸好.Net下面提供了对证书pfx文件导入和导出功能通过X509Certicate2类搞定;注意参数哦会有大用处哦;
6、前面提到.Net在加密时会自动添加随机数所以每次RSA加密时能够操作数据块就会变小了标准RSA加密每次能操作128个据实际测试结果显示.Net下面最多只能加密117个操作位就不行若需要加密大长度则必须进行拼接才行;若只需要加密128以内是数据则可以考虑用BigIntegerRSA实现思路方法;
Tags:  rsa加密软件 javarsa rsa加密算法 rsa加密

延伸阅读

最新评论

发表评论