RSA基本原理
RSA使用"秘匙對(duì)"對(duì)數(shù)據(jù)進(jìn)行加密解密.在加密解密數(shù)據(jù)前,需要先生成公鑰(public key)和私鑰(private key).
公鑰(public key): 用于加密數(shù)據(jù). 用于公開(kāi), 一般存放在數(shù)據(jù)提供方, 例如iOS客戶端.
私鑰(private key): 用于解密數(shù)據(jù). 必須保密, 私鑰泄露會(huì)造成安全問(wèn)題.
iOS中的Security.framework提供了對(duì)RSA算法的支持.這種方式需要對(duì)密匙對(duì)進(jìn)行處理, 根據(jù)public key生成證書(shū), 通過(guò)private key生成p12格式的密匙.
除了Secruty.framework, 也可以 將openssl庫(kù)編譯到iOS工程中 , 這可以提供更靈活的使用方式.
一:客戶端發(fā)送流程(公鑰加密,私鑰解密)
二:客戶端接收流程(私鑰加密,公鑰解密)
1睛藻、使用openssl生成密鑰對(duì)
Github Gist: https://gist.github.com/lvjian700/635368d6f1e421447680(參考鏈接)
#!/usr/bin/env bash
echo"Generating RSA key pair ..."
echo"1024 RSA key: private_key.pem"
openssl genrsa -out private_key.pem 1024
echo"create certification require file: rsaCertReq.csr"
openssl req -new -key private_key.pem -out rsaCertReq.csr
echo"create certification using x509: rsaCert.crt"
openssl x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt
echo"create public_key.der For IOS"
openssl x509 -outform der -in rsaCert.crt -out public_key.der
echo"create private_key.p12 For IOS. Please remember your password. The password will be used in iOS."
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
echo"create rsa_public_key.pem For Java"
openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
echo"create pkcs8_private_key.pem For Java"
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
echo"finished."
提示:
1)在創(chuàng)建證書(shū)的時(shí)候, terminal會(huì)提示輸入證書(shū)信息. 根據(jù)提示輸入對(duì)應(yīng)信息就OK.
2)在創(chuàng)建p12密匙時(shí), 會(huì)提示輸入密碼, 此時(shí)的密碼必須記住, 之后會(huì)用到.
3)如果上面指令有問(wèn)題,請(qǐng)參考最新的openssl官方文檔, 以官方的為準(zhǔn).
2启上、下載RSA-objc文件夾。
RSA-objc的下載鏈接:https://github.com/jslim89/RSA-objc店印,從RSA-objc的項(xiàng)目中取出RSA-objc文件夾
3冈在、下載openssl library:
取出include、lib文件夾按摘。下載鏈接:https://github.com/st3fan/ios-openssl
4包券、新建一個(gè)項(xiàng)目,將文件夾RSA-objc炫贤、include溅固、lib拷貝到根目錄下,如圖:
5兰珍、設(shè)置環(huán)境變量:
設(shè)置“Header Search Paths” 的值為/Users/huangzhiming/Desktop/work/OpenSSL/OpenSSL/include ?(絕對(duì)路徑)
注意:設(shè)置“Header Search Paths” 的值時(shí)侍郭,$(PROJECT_DIR)/myRES/include(這么寫(xiě)是相對(duì)路徑)
設(shè)置“Valid Architectures” 的值為 armv7/armv7s。如圖: