RSA加密,JAVA与.NET之间转换
最近由于项目需求,需要集成某报表平台的单点登录(JAVA),原文地址(后台单点登录RSA示例代码- FineBI帮助文档 FineBI帮助文档 (fanruan.com)。通信数据使用RSA非对称加密。但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用。网上搜到使用java进行格式转换的代码搜了很多文章,都不能直接使用。
在使用加密网站 加密后,发现加密填充方式为PKCS1,在根据关键词 RSA PKCS1加密查找了很多资料后终于有了解决方案
JAVA的加密密钥格式如
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDHc+PP8LuTlBL1zCX+lh9kcur gHHIXFnV/tDK789DaJuhwZvQ1lu5Zdcn+ULbNUKkB6b5tCP0sZxlpoCVKMyKHtde h/YGXwBD8sMc+XcRs0eh3/tyr4EoBu3bomzHWDGmHjH/F5GotFTrGcB6xQwAROy4 mT5SketlQ3c7tucI+QIDAQAB -----END PUBLIC KEY-----
.net的加密密钥格式如(以下只写出公钥)
<RSAKeyValue> <Modulus>pJlJIR0+G/vs7mhycs0Zd5DbWokMCsLX7Ih373+ljlteRmTm8IHj0Sl8zA26Qu/oAmqh9OFk806zW3TXl90RghSeQhzZBXFHBrTFN4U/o3wPhZBdFazh80bbskrmQ/jmz70qUm3HmGzsb3toxzN6Ehakdo7qP2Kc6aOVTyXrYpk=</Modulus> <Exponent>AQAB</Exponent> </RSAKeyValue>
两种语言加密的密钥格式不一样,转换方法网上也有很多种,关键是那种最使用???
最终找到了开源项目
Install-Package XC.RSAUtil
项目地址:https://github.com/stulzq/RSAUtil
RSAUtil 项目#
RSAUtil 项目是.NET Core下RSA算法使用帮助工具,支持使用RSA算法对数据进行加密,解密,签名和验证签名,支持xml,pkcs1,pkcs8三种密钥格式,支持这三种格式的密钥相互转换。最后还支持pem格式化。
使用#
生成密钥#
使用“RsaKeyGenerator”类。返回的结果是一个有两个元素的字符串的列表,元素1是私钥,元素2是公钥。
格式:XML
var keyList = RsaKeyGenerator.XmlKey(2048);
var privateKey = keyList [0];
var publicKey = keyList [1];
格式:Pkcs1
var keyList = RsaKeyGenerator.Pkcs1Key(2048);
var privateKey = keyList [0];
var publicKey = keyList [1];
格式:Pkcs8
var keyList = RsaKeyGenerator.Pkcs8Key(2048);
var privateKey = keyList [0];
var publicKey = keyList [1];
RSA密钥转换
使用“RsaKeyConvert”类。它支持这三种格式的密钥转换,即:xml,pkcs1,pkcs8。
XML-> Pkcs1:
- 私钥:
RsaKeyConvert.PrivateKeyXmlToPkcs1()
- 公钥:
RsaKeyConvert.PublicKeyXmlToPem()
XML-> Pkcs8:
- 私钥:
RsaKeyConvert.PrivateKeyXmlToPkcs8()
- 公钥:
RsaKeyConvert.PublicKeyXmlToPem()
Pkcs1-> XML:
- 私钥:
RsaKeyConvert.PrivateKeyPkcs1ToXml()
- 公钥:
RsaKeyConvert.PublicKeyPemToXml()
Pkcs1-> Pkcs8:
- 私钥:
RsaKeyConvert.PrivateKeyPkcs1ToPkcs8()
- 公钥:不需要转换
Pkcs8-> XML:
- 私钥:
RsaKeyConvert.PrivateKeyPkcs8ToXml()
- 公钥:
RsaKeyConvert.PublicKeyPemToXml()
Pkcs8-> Pkcs1:
- 私钥:
RsaKeyConvert.PrivateKeyPkcs8ToPkcs1()
- 公钥:不需要转换
加密,解密,签名和验证签名
XML,Pkcs1,Pkcs8分别对应类:
RsaXmlUtil
,RsaPkcs1Util
,RsaPkcs8Util
。它们继承自抽象类RSAUtilBase
- 加密:
RSAUtilBase.Encrypt()
- 解密:
RSAUtilBase.Decrypt()
- Sign:
RSAUtilBase.SignData()
- 验证:
RSAUtilBase.VerifyData()