關(guān)于RSA加解密的一些使用經(jīng)驗(yàn)

RSA加密算法是一種非對(duì)稱(chēng)的加密算法,使用時(shí)需要一對(duì)密鑰(yue),公鑰用來(lái)加密,私鑰用來(lái)解密。關(guān)于RSA的的特性和優(yōu)缺點(diǎn)大家可以度娘或者谷歌。這篇文章主要介紹java后臺(tái),安卓與iOS三個(gè)平臺(tái)的需要的密鑰的生成以及iOS端的使用。

前幾天趕項(xiàng)目,有一個(gè)需求是關(guān)于RSA加密的,關(guān)于RSA加密我只是有所耳聞,沒(méi)有實(shí)際使用過(guò),于是照葫蘆畫(huà)瓢使用公司庫(kù)里的RSA加解密工具,按理說(shuō)在之前的項(xiàng)目中使用Key字符串的形式是可以加解密成功的,可我嘗試使用base64編碼格式的私鑰和pkcs8編碼格式的私鑰都無(wú)法解出公鑰加密的密文。俗話(huà)說(shuō)不能一條路走到黑,所以我就果斷轉(zhuǎn)向嘗試使用密鑰文件來(lái)解決這個(gè)問(wèn)題,所幸最終還是找到解決了這個(gè)問(wèn)題。如以上所說(shuō)問(wèn)題在于—后臺(tái)給的密鑰編碼格式與iOS開(kāi)發(fā)需要的格式不符合。定位到問(wèn)題后開(kāi)始解決問(wèn)題。

由于生成的密鑰需要在不同的平臺(tái)上使用,首先明確不同的平臺(tái)需要什么編碼格式的密鑰,在我的這個(gè)項(xiàng)目中,有iOS,Andriod兩個(gè)客戶(hù)端平臺(tái)以及Java后臺(tái),其中iOS需要p12編碼格式的私鑰,der編碼格式的公鑰;Andriod和Java需要base64編碼的公鑰,pkcs8編碼格式的私鑰。至于其他的平臺(tái)如PHP,前端由于在這個(gè)項(xiàng)目中用不上,就沒(méi)有具體了解。需要的同學(xué)自行查閱資料。

明確需求后使用openssl生成適當(dāng)編碼格式的密鑰,Mac自帶openssl,只需在終端打開(kāi)即可,Windows系統(tǒng)需要下載openssl,以下介紹生成密鑰的過(guò)程。

在生成密鑰之前最好在桌面建立一個(gè)文件夾,然后在終端cd到這個(gè)文件夾,之后生成的文件都會(huì)放到這個(gè)文件夾中,便于管理,生成文件的過(guò)程中也可以在文件夾中直觀的觀察到。

1、終端打開(kāi)openssl

openssl

2、生成pem(base64)編碼格式的私鑰,密鑰強(qiáng)度為1024,即需要加密的字符串長(zhǎng)度不能超過(guò)1024字節(jié)

genrsa -out atrsa_private_key.pem 1024

3、生成per(base64)編碼格式的公鑰,這個(gè)公鑰可以在Andriod和Java平臺(tái)使用

rsa -in atrsa_private_key.pem -pubout -out atrsa_public_key.pem

4、對(duì)私鑰進(jìn)行PKCS8編碼,此時(shí)生成的pkcs8_atrsa_private_key.pem文件內(nèi)的私鑰可以提供給Java和Android使用

pkcs8 -topk8 -in atrsa_private_key.pem -out pkcs8_atrsa_private_key.pem -nocrypt

5、以上生成的密鑰文件通過(guò)用文本編輯器打開(kāi),拷貝對(duì)應(yīng)的密鑰就可以給Java和Andriod使用,下面介紹供iOS使用的密鑰的生成過(guò)程。首先創(chuàng)建證書(shū)請(qǐng)求,這里并不是真的生成了證書(shū),只是發(fā)送了一個(gè)請(qǐng)求

req -new -out atrsacert.csr -key atrsa_private_key.pem

按照要求輸入相應(yīng)信息就行,密碼可以為空,我是將密碼設(shè)置為空,因?yàn)槲也淮_定Java和Andriod平臺(tái)是否有解密的方法。

6、生成證書(shū)并簽名

x509 -req -days 3650 -in atrsacert.csr -signkey atrsa_private_key.pem -out atrsacert.crt

7、轉(zhuǎn)換格式,將PEM 格式文件轉(zhuǎn)換成 DER 格式,這里生成的就是iOS開(kāi)發(fā)中需要用到的公鑰文件

x509 -outform der -in atrsacert.crt -out atrsacert.der

8、導(dǎo)出P12文件,也就是需要用到的私鑰文件

pkcs12 -export -out atrsa_private_key.p12 -inkey atrsa_private_key.pem -in atrsacert.crt

自此,iOS,Android,Java需要的密鑰生成完畢,如下圖所示

其中pkcs8_atrsa_private_key.pem和atrsa_public_key.pem通過(guò)文本編輯方式打開(kāi)后的數(shù)據(jù)如圖二所示,交給Java和Andriod即可,如下圖所示:

解決了根本的問(wèn)題,在iOS中使用這些密鑰文件就很簡(jiǎn)單了,首先將der格式的公鑰和p12格式的私鑰導(dǎo)入工程。然后如下圖使用就可以完成:

關(guān)于這個(gè)工具類(lèi),是我在網(wǎng)上搜到有前輩從GitHub上轉(zhuǎn)過(guò)來(lái)的,我把那個(gè)網(wǎng)址給忘了,實(shí)在是不好意思,在此對(duì)ATRSATool的原作者致謝。

為了方便大家,我把工具類(lèi)上傳到了GitHub,地址如下,需要的話(huà)可以去下載

https://github.com/ZZJJLL/ATRSATool.git

參考鏈接如下,也感謝提供這些資料的作者。

http://www.lxweimin.com/p/bb2bd32e8794

http://zhidao.baidu.com/link?url=n5ZLviDfCkwnUB720kBK9QBDNcM05ViPaMoCsG0GzoV1NEE2eYNa6TJU6WeQ5RNrC_8-1BBnTvPohDmYvg7ZyxR9ABO4cov9Jst_asrsbIq

http://blog.csdn.net/jdsjlzx/article/details/41441147

本人對(duì)于RSA只了解一些皮毛,以上如有不正確的地方還望各位指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 嘟噥嘟噥:最近接到一個(gè)任務(wù):在客戶(hù)端動(dòng)態(tài)生成RSA密鑰對(duì),然后向服務(wù)器發(fā)送這個(gè)密鑰對(duì)中的公鑰字符串,由服務(wù)器進(jìn)行公...
    TimmyR閱讀 8,104評(píng)論 19 21
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • MD5加密是單向的,只能加密不能解密(破解除外)。標(biāo)題可能會(huì)引起讀者誤解,已經(jīng)改正,感謝Li_Cheng同學(xué)的提醒...
    奮斗ing0310閱讀 1,216評(píng)論 1 13
  • 更新:MD5加密是單向的,只能加密不能解密(破解除外)。標(biāo)題可能會(huì)引起讀者誤解,已經(jīng)改正,感謝Li_Cheng同學(xué)...
    葛高召閱讀 2,267評(píng)論 0 4
  • 做產(chǎn)品這行之后VS之前,面對(duì)同樣的問(wèn)題,答案有了一些變化,對(duì)某些答案的理解也更透徹。接觸這行之前,會(huì)去知乎bbs博...
    幺九閱讀 495評(píng)論 0 4