一、 來源
1977年,三位數(shù)學(xué)家Rivest、Shamir 和 Adleman 設(shè)計(jì)了一種算法,可以實(shí)現(xiàn)非對(duì)稱加密。這種算法用他們?nèi)齻€(gè)人的名字命名,叫做RSA算法。
二、 原理
1、找出兩個(gè)‘很大’的質(zhì)數(shù):P & Q,一般長(zhǎng)度是上百位。然后通過下面計(jì)算得到N和 M;
N = P * Q
M = (P - 1) * (Q - 1)
2、找出整數(shù)E,E與M互質(zhì),即除了1之外,沒有其他公約數(shù)
3、找出整數(shù)D,使用ED除以M余1,即(ED) % M = 1
4、經(jīng)過上述準(zhǔn)備工作之后,可以得到:
E是公鑰,負(fù)責(zé)加密
D是私鑰,,負(fù)責(zé)解密
N負(fù)責(zé)公鑰和私鑰之間的聯(lián)系
5、加密算法,假定對(duì)X進(jìn)行加密
(X^E)%N = Y
6、解密算法,根據(jù)‘費(fèi)馬小定理',可以使用以下公式完成解密
(Y^D)%N = X
三、 RSA算法演練
1、RSA原理代碼演示
2、RSA算法演練
-(void)RSADemo{
CryptorTools *tools = [[CryptorTools alloc] init];
// 加載公鑰
NSString *pubPath = [[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil];
[tools loadPublicKeyWithFilePath:pubPath];
// 使用公鑰加密
NSString *result = [tools RSAEncryptString:@"i love you"];
NSLog(@"%@",result);
// 加載私鑰
NSString **privatePath = [[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil];
[tools loadPrivateKey:privatePath password:@"123"];
// 使用私鑰解密
NSLog(@"%@",[tools RSADecryptString:result]);
}
四、 RSA應(yīng)用場(chǎng)景
由于 RSA算法的加密解密速度要比對(duì)稱算法速度慢很多,在實(shí)際應(yīng)用中,通常采取如下:
1.數(shù)據(jù)本身的加密和解密使用對(duì)稱加密算法(AES)。
2.用RSA算法加密并傳輸對(duì)稱算法所需的密鑰。
五、 RSA密鑰生成過程
程序開發(fā)證書生成
1.生成私鑰文件
$ openssl genrsa -out private.pem1024
openssl:是一個(gè)自由的軟件組織,專注做加密和解密的框架。
genrsa:指定了生成私鑰算法使用RSA
-out:后面的參數(shù)表示生成的key的輸入文件
1024:表示的是生成key的長(zhǎng)度,單位字節(jié)(bits)
2.創(chuàng)建證書請(qǐng)求
$ openssl req -new -key private.pem -out rsacert.csr
可以拿著這個(gè)文件去數(shù)字證書頒發(fā)機(jī)構(gòu)(即CA)申請(qǐng)一個(gè)數(shù)字證書。CA會(huì)給你一個(gè)新的文件cacert.pem,那才是你的數(shù)字證書。(要收費(fèi)的)
3.生成證書并簽名,有效期10年
$ openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
X509是一種非常通用的證書格式。
4.將用上面生成的密鑰privkey.pem和 rsacert.csr證書請(qǐng)求文件 生成一個(gè)數(shù)字證書rsacert.crt。這個(gè)就是公鑰。
5.轉(zhuǎn)換格式 將 PEM 格式文件 轉(zhuǎn)換成 DER 格式
$ openssl x509 -outform der -in rsacert.crt -out rsacert.der
在iOS開發(fā)中,公鑰是不能使用base64編碼的,上面的命令是將公鑰的base64編碼字符串轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)
6.導(dǎo)出 P12 文件
$ openssl pkcs12 -export -out p.p12 -inkey private.em -in rsacert.crt
在iOS使用私鑰不能直接使用,需要導(dǎo)出一個(gè)p12文件。下面命令就是將私鑰文件導(dǎo)出為p12文件。