背景
polarssl库是C语言的加密库,包括RSA加解密,签名验签等功能。
Java端也有自己专门做加解密,验签的包。
只是针对RSA来说,两端保存公私钥的方式不一样,如下:
//Java端
//公钥
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAr11xfg4P35Z9olhK0Lb7sZOO
V9pzDBXyU3QVmnfJFYj4L1DApI1xPVrekTCxzk319GvHZqdxoR7CbYH2mUAu9Sd0
K4AmdzvKKfnzRyp1VGMmKJ+Yu1rJ2GsSfmt7/Z/NZt/gcx0UjVOWWl67yVRtoSd8
AGMChe39w6VGInzmdQIDAQAB
-----END PUBLIC KEY-----
//私钥
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDAr11xfg4P35Z9olhK0Lb7sZOOV9pzDBXyU3QVmnfJFYj4L1DA
pI1xPVrekTCxzk319GvHZqdxoR7CbYH2mUAu9Sd0K4AmdzvKKfnzRyp1VGMmKJ+Y
u1rJ2GsSfmt7/Z/NZt/gcx0UjVOWWl67yVRtoSd8AGMChe39w6VGInzmdQIDAQAB
AoGACC6KHRButW2CPOR2CPs9gd4uTKbeBPDtmk7BM6JNqtFfcbZvSzbRi2OWZl6r
lCk/9eKClG1/TQZmls1CmFTf55ZZPooxDU2Q6uFPHKZYamb2bKlK3f931hg6+q1P
4mvTgKXo8Su4ODfofwLsMiWhIkxOhcMIex9mSQlw4SaQ3YMCQQDhU1nfzXPcB9A+
EL7AsjwgtvOeS1ACQJedExo7tlTSVY8tV3Rtm2W8wvcjO/TB9r8LDi6VcKAo80WR
zwdTcqFrAkEA2up7hbymEa88ZV9fmNjHDN4jU4eaw9HC+dp8LopPGuwfJ5YHiRDn
2oquM8oquAMHq9dGro3p/JB1Zw/yafgvnwJBAMXoCbZSpAKMMlFxL7ncUoeBaXSN
PZbc2M2zq4Tq3pFnaLwwZiinJrKmo56k2JNMf/vb1vqW03VkRqSMrCiVNEUCQQDZ
ZxwciGh0D47vLXQGmuGyibiTb4vnBB2Ze7zvizNcDTozWe9J05wtkKPHkvIxo/Cu
WzA6kXzZ8axmGZQoYO0JAkBnQrR09eZ03ClVjyIeWIWFSICfElPxUMa39IxRNM0D
MmHF6srKe6X2T8lMT7BHsFAUPIQl1OJEGK4MdzrPMNaW
-----END RSA PRIVATE KEY-----
//polarssl
#define RSA_N "9292758453063D803DD603D5E777D788" \
"8ED1D5BF35786190FA2F23EBC0848AEA" \
"DDA92CA6C3D80B32C4D109BE0F36D6AE" \
"7130B9CED7ACDF54CFC7555AC14EEBAB" \
"93A89813FBF3C4F8066D2D800F7C38A8" \
"1AE31942917403FF4946B0A83D3D3E05" \
"EE57C6F5F5606FB5D4BC6CD34EE0801A" \
"5E94BB77B07507233A0BC7BAC8F90F79"
#define RSA_E "10001"
#define RSA_D "24BF6185468786FDD303083D25E64EFC" \
"66CA472BC44D253102F8B4A9D3BFA750" \
"91386C0077937FE33FA3252D28855837" \
"AE1B484A8A9A45F7EE8C0C634F99E8CD" \
"DF79C5CE07EE72C7F123142198164234" \
"CABB724CF78B8173B9F880FC86322407" \
"AF1FEDFDDE2BEB674CA15F3E81A1521E" \
"071513A1E85B5DFA031F21ECAE91A34D"
#define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
"2C01CAD19EA484A87EA4377637E75500" \
"FCB2005C5C7DD6EC4AC023CDA285D796" \
"C3D9E75E1EFC42488BB4F1D13AC30A57"
#define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
"E211C2B9E5DB1ED0BF61D0D9899620F4" \
"910E4168387E3C30AA1E00C339A79508" \
"8452DD96A9A5EA5D9DCA68DA636032AF"
#define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
"3C94D22288ACD763FD8E5600ED4A702D" \
"F84198A5F06C2E72236AE490C93F07F8" \
"3CC559CD27BC2D1CA488811730BB5725"
#define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
"D8AAEA56749EA28623272E4F7D0592AF" \
"7C1F1313CAC9471B5C523BFE592F517B" \
"407A1BD76C164B93DA2D32A383E58357"
#define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
"F38D18D2B2F0E2DD275AA977E2BF4411" \
"F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
"A74206CEC169D74BF5A8C50D6F48EA08"
有一个项目,是和服务器通信,要对数据做签名和验签。
我做Android端,要求公私钥签名这些对安全有要求的东西放到jni中做,polarssl是我们常用的东西。
但是服务端的同事给了我Java端那种公私钥,就是一串base64编码的字符串。
当时我就很疑惑怎么把密钥放到polarssl中。
然后和其他同事商量这个事,他说Java的密钥是不是asn1编码,听到句话,我就豁然开朗。
直接开干,用ASN1View工具看Java端的密钥,发现Java的密钥果然是Asn1编码,用工具看就直接对应着密钥的属性。
Java私钥转换到polarssl的过程
-
将Java私钥开头和末尾的内容去掉(----线里面的东西),然后保存到txt文档中,并用asn1view查看
1.png
前面的是OID什么的,最后一个OCTET STRING是真正的内容,也有的密钥用工具看时直接是STRING里的内容,
上面那个例子就是这样的 -
把OCTET STRING中的内容拷贝出来,转成Base64格式,再用asn1view工具查看
2.png
对应的Integer就是N,E,D,P,DP,DQ,QP那些,直接拷贝出来复制到polarssl中即可使用。
网友评论