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://blog.csdn.net/jdsjlzx/article/details/41441147
本人對(duì)于RSA只了解一些皮毛,以上如有不正確的地方還望各位指正。