一悄晃、 來(lái)源
1977年玫霎,三位數(shù)學(xué)家Rivest、Shamir 和 Adleman 設(shè)計(jì)了一種算法妈橄,可以實(shí)現(xiàn)非對(duì)稱加密庶近。這種算法用他們?nèi)齻€(gè)人的名字命名,叫做RSA算法眷细。
二拦盹、 原理
1鹃祖、找出兩個(gè)‘很大’的質(zhì)數(shù):P & Q,一般長(zhǎng)度是上百位溪椎。然后通過(guò)下面計(jì)算得到N和 M;
N = P * Q
M = (P - 1) * (Q - 1)
2、找出整數(shù)E恬口,E與M互質(zhì)校读,即除了1之外,沒(méi)有其他公約數(shù)
3祖能、找出整數(shù)D歉秫,使用ED除以M余1,即(ED) % M = 1
4养铸、經(jīng)過(guò)上述準(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密鑰生成過(guò)程
程序開(kāi)發(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開(kāi)發(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文件梳码。