
RSA算法是非對稱加密算法,在1977年被羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的,故取名為RSA非對稱加密算法,而今在計算機數(shù)據(jù)加密領(lǐng)域以及電子商業(yè)中廣泛使用。
RSA數(shù)學原理及推導(dǎo)流程
離散對數(shù)——歐拉函數(shù)——歐拉定理——模反元素——迪菲赫爾曼密鑰交換——RSA誕生。
1.離散對數(shù)
離散對數(shù)其實是一種數(shù)學規(guī)律,即存在一個數(shù)m,m的k次方模以n,會存在一個規(guī)律,那就是值在1在n-1之間,此時我們就稱m為n的原根。
比如:3^k mod 17 的值會在1~16這個范圍,所以3是17的原根。
2.歐拉函數(shù)
求一個正整數(shù),比它小的正整數(shù)中,有多少個與它構(gòu)成互質(zhì)關(guān)系,這個值就是歐拉函數(shù)。用φ()表示.
互質(zhì)關(guān)系:如果兩個正整數(shù),除了1之外沒有,沒有其它共同的公因數(shù)。
特點:
- 當n為質(zhì)數(shù)時,φ(n) = n-1
- 如果n可以分解為兩個質(zhì)數(shù)的乘積時,φ(a*b) = φ(a) * φ(b)
以上可得:
φ(n) = φ(a)*φ(b) = (a-1)*(b-1)
3.歐拉定理
如果兩個正整數(shù)m和n互質(zhì),那么m的φ(n)次方減去1,可以被n整除。
m^φ(n) mod n = 1
==>推導(dǎo):
1、等式兩邊同時乘以K,得:
m^k*φ(n) mod n = 1
2、等式兩邊同時乘以m,得:
m^(k*φ(n)+1) mod n = 1
費馬小定理:在歐拉函數(shù)條件下,加上m和n都是質(zhì)數(shù)的條件。
即上述公式可表示為:
m^(n-1) mod n = 1
4.模反元素
如果兩個正整數(shù)e和x互質(zhì),一定存在整數(shù)d,使得ed-1被x整除,即d就是e相對于x的模反元素。如下表示:
//e、x互質(zhì)
//d是e相對于x的模反元素。
e*d mod x = 1
==> e*d = kx+1
==>分析
模反元素的推導(dǎo)結(jié)果對比歐拉定理的推導(dǎo)結(jié)果:
e*d = kx+1 <==> m^(k*φ(n)+1) mod n = m
替換k*φ(n)+1 為e*d 得:
//m<n
//d是e相對于φ(n)的模反元素。
m^(e*d) mod n = m
5.迪菲赫爾曼密鑰交換
用于將上述公式拆分,具體過程如圖所示

==>由上推導(dǎo):m^e mod n = c --> c^d mod n = m^e*d mod n = m,得:
6.RSA加密公式
公式成立條件:
m<n
d是e相對于φ(n)的模反元素。
m^e mod n = c //公鑰加密
c^d mod n = n //私鑰解密
公鑰:n和e (公開)
私鑰:n和d
安全說明:
根據(jù)公式:e*d = kφ(n)+1,目前n和e公開,要想求出d,就得知道φ(n),所以需要將n因式分解才行。為了避免被破解,所以n會取很大很大的整數(shù)。一般為1024個二進制位(目前已知人類破解極限是768位),所以公式成立需要六個數(shù):
p1、p2、n、φ(n)、e、d
終端操作RSA加密
- 生成私鑰
openssl genrsa -out privite.pem 2048
查看私鑰信息:cat privite.pem ,得到如下Base64編碼。(因為base64是按照6個比特位來加密的,所以最后不足6個比特位的時候就用=表示)

- 輸入明文
openssl rsa -in privite.pem -text -out privite.txt
打開txt:open private.txt,可見下圖框中標識publicExponent: 65537 (0x10001),其中65537代表RSA加密公式中的e.

- 通過私鑰生成對應(yīng)公鑰
openssl rsa -in privite.pem -pubout -out public.pem
- 通過公鑰加密數(shù)據(jù),私鑰解密數(shù)據(jù)。
//公鑰加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
//私鑰解密
openssl rsautl -decrypt -in enc.txt -inkey privite.pem -out dec.txt
- 通過私鑰加密數(shù)據(jù)(簽名),公鑰解密。
//加密。
openssl rsautl -sign -in message.txt -inkey privite.pem -out enc.txt
//解密
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt
RSA特點:
- 相對安全。由于是非對稱加密,密鑰不用傳遞。
- 加密效率低。
- 加密數(shù)據(jù)小。
終端生成證書
1.生產(chǎn)csr文件(mac公鑰)
openssl req -new -key private.pem -out rsacert.csr
2.生成crt文件(base64)
根據(jù)上述csr文件及私鑰文件而來
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
3.生成der文件(公鑰)
根據(jù)上述crt文件而來。
openssl x509 -outform der -in rsacert.crt -out rsacert.der
4.生成p12文件
這里會提示輸入p12證書的密碼。
pkcs12 -export -out p.p12 -inkey privite.pem -in rsacert.crt
補充:
ios系統(tǒng)不直接支持rsa,但是支持x509(一種證書標準,主要定義了證書中應(yīng)該包含哪些內(nèi)容)的支持認證。
同樣的X.509證書,可能有不同的編碼格式。PEM編碼和 DER編碼
相關(guān)文件擴展名:CRT,CER,KEY,CSR(證書簽名請求,相當于一個公鑰,私鑰是放在服務(wù)端的 )
Xcode代碼演示
通過上述生成的.der和.p12文件,用RSA加密及解密文件。
將der證書和p12證書導(dǎo)入到xcode項目中,通過rsa第三方工具類,完成加解密過程。
//1、加載公鑰
[[RSACryptor sharedRSACryptor] loadPublicKey:[[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil]] ;
//2、加載私鑰
[[RSACryptor sharedRSACryptor] loadPrivateKey:[[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil] password:@"123456"];
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//加密
NSData * ret = [[RSACryptor sharedRSACryptor] encryptData:[@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
//編碼
NSString * base64 = [ret base64EncodedStringWithOptions:0];
NSLog(@"%@",base64);
//解密
NSData * jiemi = [[RSACryptor sharedRSACryptor] decryptData:ret];
NSLog(@"%@",[[NSString alloc] initWithData:jiemi encoding:NSUTF8StringEncoding]);
}
參考資源鏈接
Objective-C-RSA
那些證書相關(guān)的玩意兒(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)