RSA原理探究及命令行實踐

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)+1e*d 得:

//m<n
//d是e相對于φ(n)的模反元素。
m^(e*d) mod n = m
5.迪菲赫爾曼密鑰交換

用于將上述公式拆分,具體過程如圖所示

WX20181207-142741@2x.png

==>由上推導(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個比特位的時候就用=表示)

catPrivate.png

  • 輸入明文
openssl rsa -in privite.pem -text -out privite.txt

打開txtopen private.txt,可見下圖框中標識publicExponent: 65537 (0x10001),其中65537代表RSA加密公式中的e.

WX20181207-110007@2x.png

  • 通過私鑰生成對應(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等)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容