在数据安全上rsa起着非常大的作用,特别是数据网络通讯的安全上。当异构系统在数据网络通讯上对安全性有所要求时,rsa将作为其中的一种选择,此时rsa的互通性就显得尤为重要了。
本文参考网络资料,提供了rsa互通性的一种可行的解决方案(c#,java,php),而这种互通性是在一定的局限性上达成的,比如密钥是1024位的(更高位没试过,应该也可行),基于PKCS1填充方式。
所编写的代码有一部分使用了硬编码,同时注重了功能的实现,在类结构设计上关注不多,有需要的可自行修改重构。
相关的程序集或包或代码请详见本文末尾附件。
生成互通密钥对
重点参考了Jeffrey Walton(http://www.codeproject.com/Articles/25487/Cryptographic-Interoperability-Keys)
1.C#
1 | using Cn.Ubingo.Security.RSA.Core; |
2.Java
1 | import cn.ubingo.security.rsa.core.*; |
3.密钥格式
a.XML—c#平台惯用
私钥:
1 | <RSAKeyValue> |
公钥:
1 | <RSAKeyValue> |
b.ASN—java平台惯用
私钥:
1 | MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKHIlUo34Sc8cQHfZrKZS+JpZZmpJ46AeDj4G/oVaNUBnEPUFi8jB7j8gqN6m6d2oSqqmuJxJEZExxTiXiE1x+vSxO/Gcos53vTeIWpgB2UlZrgWvHbbEJk9OsiVsUeLIhvCTTEfWkJDDe5BrcbCQTdvgmyKJsUjFkkNqarxQMpLAgMBAAECgYA76AXb5ygwurFP07T4Akq2qndsOFZE7q5Vzg2yA3Z/lWqTNTgHuU11Qs9vEIoNryBLp8PVgLbBbFtZkN7xJjSCOA4XURRts7wbVe9wcUTmsbGZmwUkJj52HGCSeo7TwxcdVpliOSZA7vPtem8UoGhx26Pf00R7aZg7bmXTtNB8GQJBANHpETAWVNBoSGG02Um53f0wu0B7ROEwhX4PfJzgvBARgROlOYt84EaH2NCXVgWJljROYLRDCDT1X0cSetxLsJMCQQDFTlVue2iTkSa3xo/zbeCLNKkbiH//k28sEMBikOYZJ6DcnGLVyUku7x3Rth8M6ST5AANiWk12YmQfaULiVeppAkAW9wq8WhUZX+9bUS/ckwsoYiZ6XYIhqO9R5VvaxfONRnz6qz7qddULol0kJQpyPKVEP7bwwcyqDpZH7kumwlklAkACH1qZ6qfwVnJlLbSkuLzeon1jN2+xDyP2BGQda1OeV6fKV8BUbmrkH1xhwiTJXcSxDQf8Sd5ldJ+BGv/GMYhpAkBoK3TU2TiAA1ZHQmti8lywuDAHfw44bzaFCsFr+q4+QIyMa0tnMqH1MWJmNxNYuzWGwG8I8ME7ssz/BtmfU8bo |
公钥:
1 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChyJVKN+EnPHEB32aymUviaWWZqSeOgHg4+Bv6FWjVAZxD1BYvIwe4/IKjepundqEqqpricSRGRMcU4l4hNcfr0sTvxnKLOd703iFqYAdlJWa4Frx22xCZPTrIlbFHiyIbwk0xH1pCQw3uQa3GwkE3b4JsiibFIxZJDamq8UDKSwIDAQAB |
c.PEM—php平台惯用
私钥:
1 | -----BEGIN PRIVATE KEY----- |
公钥:
1 | -----BEGIN PUBLIC KEY----- |
4.密钥互通性
各种格式的密钥都可以通过KeyPair类的c#:To*KeyPair()
或java:to*KeyPair()
方法相互进行转换,无门槛,无障碍。
C#
1 | //转换成不同的格式 |
Java
1 | //转换成不同的格式 |
互通加解密
基于三种语言环境都支持的RSA PKCS1填充方式的算法,实现加解密互通
KeyWorker的c#:Encrypt
,Decrypt
或java:encrypt
,decrypt
或php:encrypt
,decrypt
方法实现加解密的功能
1.C#
1 | using Cn.Ubingo.Security.RSA.Core; |
2.Java
1 | import cn.ubingo.security.rsa.core.*; |
3.php
请保证php文件为utf-8的格式
1 | include "KeyWorker.php"; |
4.加解密互通性
任何语言(指的是c#,java,php)使用KeyWorker加密得到的密文,用任何语言的KeyWorker都可以进行解密,只要公私钥配对即可。