工具類介紹
框架從 CryptoExercise(蘋果3.0時的包)進行提取擴展
iOS 系統(tǒng)自帶相關(guān)函數(shù)說明疮装,框架主要使用前兩種:
SecKeyEncrypt 使用公鑰對數(shù)據(jù)加密
SecKeyDecrypt 使用私鑰對數(shù)據(jù)解密
SecKeyRawVerify 使用公鑰對數(shù)字簽名進行驗證
SecKeyRawSign 使用私鑰生成數(shù)字簽名
普遍的加密方法:客戶端用RSA的公鑰加密AES的秘鑰,服務(wù)器端用私鑰解開獲得的AES的秘鑰竿屹,客戶端再與服務(wù)器端進行AES加密的數(shù)據(jù)傳輸盾鳞,即HTTPS協(xié)議傳輸?shù)脑?/h4>
加密解密概念
對稱加密算法:加密解密都使用相同的秘鑰,速度快诡挂,適合對大數(shù)據(jù)加密碎浇,方法有DES,3DES璃俗,AES等
非對稱加密算法
非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)
公開密鑰與私有密鑰是一對奴璃,可逆的加密算法,用公鑰加密城豁,用私鑰解密苟穆,用私鑰加密,用公鑰解密,速度慢雳旅,適合對小數(shù)據(jù)加密跟磨,方法有RSA
散列算法(加密后不能解密,上面都是可以解密的)
用于密碼的密文存儲攒盈,服務(wù)器端是判斷加密后的數(shù)據(jù)
不可逆加密方法:MD5抵拘、SHA1、SHA256型豁、SHA512
RSA算法原理:
- 找出兩個“很大”的質(zhì)數(shù):P & Q(上百位)
N = P * Q
M = (P – 1) * (Q – 1)
- 找出整數(shù)E僵蛛,E與M互質(zhì),即除了1之外迎变,沒有其他公約數(shù)
- 找出整數(shù)D墩瞳,使得 ED 除以 M 余 1,即 (E * D) % M = 1
- 經(jīng)過上述準備工作之后氏豌,可以得到:E是公鑰,負責加密D是私鑰热凹,負責解密N負責公鑰和私鑰之間的聯(lián)系
- 加密算法泵喘,假定對X進行加密(X ^ E) % N = Y(6)解密算法,根據(jù)費爾馬小定義般妙,可以使用以下公式完成解密(Y ^ D) % N = X
使用方法
XHCryptorTools *tools = [[XHCryptorTools alloc] init];
// 1. 加載公鑰
NSString *pubPath = [[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil];
[tools loadPublicKeyWithFilePath:pubPath];
// 2. 使用公鑰加密纪铺,加密內(nèi)容最大長度 117
NSString *result = [tools RSAEncryptString:@"abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghi"];
NSLog(@"RSA 加密 %@", result);
// 3. 加載私鑰,并指定導(dǎo)出 p12 時設(shè)置的密碼
NSString *privatePath = [[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil];
[tools loadPrivateKey:privatePath password:@"123"];
// 4. 使用私鑰解密
NSLog(@"解密結(jié)果 %@", [tools RSADecryptString:result]);
公鑰碟渺、私鑰生成
公鑰:就是簽名機構(gòu)簽完給我們頒發(fā)的鲜锚,放在網(wǎng)站的根目錄上,可以分發(fā)
私鑰:一般保存在中心服務(wù)器
加密解密使用了兩種文件 .p12是私鑰 .der是公鑰苫拍,終端命令生成步驟如下:
- 創(chuàng)建私鑰芜繁,生成安全強度是512(也可以是1024)的RAS私鑰,.pem是base64的證書文件
openssl genrsa -out private.pem 512
- 生成一個證書請求绒极,生成證書請求文件.csr
openssl req -new -key private.pem -out rsacert.csr
終端提示如下:
- 國家名字骏令、代碼
- 省的名字
- 城市的名字
- 公司的名字
- 公司的單位
- 我的名字
- 電子郵件
- 以及兩個附加信息可以跳過
生成證書請求界面
簽名,找證書頒發(fā)機構(gòu)簽名垄提,證明證書合法有效的榔袋,也可以自簽名一個證書
生成證書并簽名,有效期10年铡俐,生成一個.crt的一個base64公鑰文件
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
由于iOS開發(fā)時使用的時候不能是base64的凰兑,必須解成二進制文件!
解成.der公鑰二進制文件审丘,放程序做加密用
openssl x509 -outform der -in rsacert.crt -out rsacert.der
-
生成.p12二進制私鑰文件
.pem 是base64的不能直接使用吏够,必須導(dǎo)成.p12信息交換文件用來傳遞秘鑰
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
輸入一個導(dǎo)出密碼(框架中l(wèi)oadPrivateKey:方法的password參數(shù)需要用的密碼):
輸入導(dǎo)出密碼界面.png
對稱加密算法:加密解密都使用相同的秘鑰,速度快诡挂,適合對大數(shù)據(jù)加密碎浇,方法有DES,3DES璃俗,AES等
非對稱加密算法
非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)
公開密鑰與私有密鑰是一對奴璃,可逆的加密算法,用公鑰加密城豁,用私鑰解密苟穆,用私鑰加密,用公鑰解密,速度慢雳旅,適合對小數(shù)據(jù)加密跟磨,方法有RSA
散列算法(加密后不能解密,上面都是可以解密的)
用于密碼的密文存儲攒盈,服務(wù)器端是判斷加密后的數(shù)據(jù)
不可逆加密方法:MD5抵拘、SHA1、SHA256型豁、SHA512
RSA算法原理:
N = P * Q
M = (P – 1) * (Q – 1)
XHCryptorTools *tools = [[XHCryptorTools alloc] init];
// 1. 加載公鑰
NSString *pubPath = [[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil];
[tools loadPublicKeyWithFilePath:pubPath];
// 2. 使用公鑰加密纪铺,加密內(nèi)容最大長度 117
NSString *result = [tools RSAEncryptString:@"abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghi"];
NSLog(@"RSA 加密 %@", result);
// 3. 加載私鑰,并指定導(dǎo)出 p12 時設(shè)置的密碼
NSString *privatePath = [[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil];
[tools loadPrivateKey:privatePath password:@"123"];
// 4. 使用私鑰解密
NSLog(@"解密結(jié)果 %@", [tools RSADecryptString:result]);
公鑰:就是簽名機構(gòu)簽完給我們頒發(fā)的鲜锚,放在網(wǎng)站的根目錄上,可以分發(fā)
私鑰:一般保存在中心服務(wù)器
openssl genrsa -out private.pem 512
openssl req -new -key private.pem -out rsacert.csr
終端提示如下:
簽名,找證書頒發(fā)機構(gòu)簽名垄提,證明證書合法有效的榔袋,也可以自簽名一個證書
生成證書并簽名,有效期10年铡俐,生成一個.crt的一個base64公鑰文件
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
由于iOS開發(fā)時使用的時候不能是base64的凰兑,必須解成二進制文件!
解成.der公鑰二進制文件审丘,放程序做加密用
openssl x509 -outform der -in rsacert.crt -out rsacert.der
生成.p12二進制私鑰文件
.pem 是base64的不能直接使用吏够,必須導(dǎo)成.p12信息交換文件用來傳遞秘鑰
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
輸入一個導(dǎo)出密碼(框架中l(wèi)oadPrivateKey:方法的password參數(shù)需要用的密碼):