密碼學之RSA加密算法

1. 密碼學

1.1 什麼是密碼學?

密碼學是研究編制密碼和破譯密碼的技術科學。在現代特別指對信息以及其傳輸的數學性研究,常被認爲是數學和計算機科學的分支,和信息論也密切相關。html

在這裏簡述一下密碼學的發展歷史。算法

1.2 密碼學的發展歷史

  1. 在1976年之前,全部的加密方法都是同一種模式:加密、解密使用同一種規則(密鑰)。在交互數據的時候,彼此通訊的雙方就必須將規則告訴對方,不然無法解密。這種加密方式被稱爲 對稱加密算法(symmetric encryption algorithm)安全

  2. 1976年,兩位美國計算機學家 迪菲(Whitfield Diffie)赫爾曼(Martin Hellman) 提出了一種創建密鑰的方法,其產生的密鑰可用於加密、密鑰管理或任何其它的加密方式。這被稱爲「迪菲赫爾曼密鑰交換」算法,簡稱 D-H算法。D-H算法啓發了其餘科學家。人們意識到,加密和解密可使用不一樣的規則,只要這兩種規則之間存在某種對應關係便可,這樣就避免了直接傳遞密鑰。bash

  3. 1977年三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)阿迪·薩莫爾(Adi Shamir)倫納德·阿德曼(Leonard Adleman) 一塊兒設計了一種算法,能夠實現非對稱加密。(所謂非對稱,就是指該算法須要一對密鑰,即公鑰(public key)私鑰(private key),且兩密鑰不一樣,使用其中一個加密,則須要用另外一個才能解密)。這個算法用他們三我的的名字命名,叫作 RSA算法網絡

RSA算法的影響是巨大的,絕不誇張地說,只要有計算機網絡的地方,就有RSA算法。這種算法很是可靠,密鑰越長,它就越難破解。函數

接下來,咱們須要學習幾個數學概念,這有助於咱們理解RSA加密算法。學習

2. 幾個數學概念

2.1 取模運算(mod)

即求餘運算,是在整數運算中求一個整數A除以另外一個整數B的餘數的運算,且不考慮運算的商。在計算機程序設計中也有mod運算,其格式爲: mod(A, B),便是兩個數值做除法運算後的餘數。ui

注意:加密

  1. 當A、B爲同號時,即同爲正整數或負整數時,mod運算與咱們熟悉的%運算相同,可看成是%運算;
    如,3 mode 17 = 3 % 17 = 3;-5 mod -3 = -5 % -3 = -2
  2. A、B異號時,mod運算與%運算不一樣,在這裏不做詳細贅述,感興趣的同窗可自行查閱相關資料。

2.2 互質關係

若是兩個正整數,除了1以外,沒有其它公因數,咱們就稱這兩個數存在互質關係,即這兩個數互質。
關於互質關係,不可貴到如下幾個結論:spa

  1. 任意兩個 不一樣的質數 互質。好比11和23互質,11和11不互質。
  2. 一個是質數,另外一個只要不是前者的倍數,二者就構成互質關係。好比5和12互質。
  3. 一個質數與任意一個比它小的數互質。好比11和8。
  4. 1和任意一個大於1的天然數互質。好比1和99。
  5. p是大於1的整數,則p和p-1互質。好比10和9。

注意: 兩個正整數互質,意思是這兩個整數存在互質關係,即沒有1以外的其它公因數,並不意味着這兩個數是質數。好比9和10互質,可是9和10均爲合數。

2.3 歐拉函數

對於一個正整數n,小於n且和n互質的正整數的個數,計算這個值的方法叫作歐拉函數,記作:φ(n)。歐拉函數通式爲

\phi(n)=n({1}-{1\over{p_1}})({1}-{1\over{p_2}})...({1}-{1\over{p_k}})

其中,p1、p2、...、pk爲n的質因數。
如12=2*2*3,2和3爲12的質因數,則φ(12)=12*(1-1/2)(1-1/3)=4。 關於歐拉函數,一樣有幾個推論:

  1. 特別聲明,若是n=1,則φ(1)=1,由於1與任何數(包括它自己)造成互質關係。
  2. 當n是質數的時候,φ(n)=n-1。如φ(7)=6,即一、二、三、四、五、6均與7互質。
  3. 若是n能夠分解成兩個互質的整數之積,如n=a*b,則φ(n)=φ(a)*φ(b)。 如φ(56)=φ(7)*φ(8)=24; 注意,φ(49)≠φ(7)*φ(7) => φ(49)≠36,由於7與7不互質。事實上,φ(49)=42。
  4. 由2和3能夠獲得,若是n=a*b,且a、b均爲質數,則φ(n)=(a-1)*(b-1)。如φ(35)=φ(5)*φ(7)=24;
  5. 若是n=pk(其中p爲質數,k爲大於1的整數),則φ(n)=φ(pk)=pk-pk-1=(p-1)pk-1。如φ(49)=φ(72)=(7-1)*71=42。

2.4 歐拉定理

歐拉定理指的是,若是兩個互質的正整數m和n,那麼m的φ(n)次方減去1,能夠被n整除。即,

\mathbf{m}^{\phi(n)}\mod\mathbf{n}\equiv1

如7和3互質,7φ(3) mod 3 = 72 mod 3 = 1

  1. 費馬小定理:當n爲質數的時候,則有 mn-1 mod n ≡ 1
  2. 歐拉定理是RSA算法的核心,理解了這個定理,就理解了RSA算法。

2.5 模反元素

若是兩個正整數m和n互質,那麼必定能夠找到整數d,使得md-1能被n整除,那麼d就是m相對於n的模反元素。即

\mathbf{m}\mathbf{d}\mod\mathbf{n}\equiv1

由上式,可得 d=(kn+1)/m

歐拉定理能夠證實上式。因爲m和n互質,那麼m和n必知足歐拉定理,即 mφ(n) mod n ≡ 1, 令d=mφ(n)-1,即得證!

如,3和5互質,當,k爲大於等於1的整數,不難求出當k=4時,獲得d=3,即3(d)就是11(e)相對於8(x)的一個模反元素。

3. RSA加密算法

介紹完以上幾個數學概念,咱們詳細介紹一下RSA加密算法。

3.1 RSA加密算法原理

RSA使用不一樣的加密密鑰與解密密鑰,是一種「由已知加密密鑰推導出解密密鑰在計算上是不可行的」密碼體制。其原理是基於大數難以分解,即兩個大素數相乘容易,但逆向獲得一個由兩個大質數相乘獲得的更大數的因子則很困難。除了暴力破解,目前尚未其它有效的方法。換而言之,RSA加密算法的可靠性,取決於對極大整數作因式分解的難度。假若有人找到一種快速因數分解的算法(或者量子計算機技術快速發展?),那麼RSA的可靠性就會極度降低。但就目前而言,1024位RSA基本安全,2048位是極其安全的。

舉例來講,你能夠對33進行因式分解(3*11),可是你無法對下面這個整數進行因式分解

12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413
複製代碼

它等於這樣兩個質數的乘積:

33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917
複製代碼

3.2 密鑰生成的步驟

咱們經過一個例子,來理解RSA加密算法。假如甲和乙兩人進行通訊。其流程以下:

  1. 甲選擇兩個不相等的質數p和q,甲選擇了3和11,即p=3,q=11。
    注意:實際應用中,這兩個質數越大,就越難破解。
  2. 甲計算獲得p和q的乘積n,即n=33
    n的長度就是密鑰長度,33寫成二進制是100001,一共有6位,因此這個密鑰是6位。
  3. 甲計算n的歐拉函數φ(n),獲得φ(n) = (p-1)(q-1) = 20
  4. 隨機選一個整數e,知足1 < e < φ(n),且e與φ(n)互質。甲選擇了13。
  5. 再計算e相對於φ(n)的模反元素d。將e、φ(n)代入公式ed=kφ(n)+1,獲得13d=20k+1,此二元一次方程能夠用 「擴展歐幾里得算法」 求解,此處省略過程。總之,甲算出一組整數解爲(d,k)=(17,11),即d=17
  6. n和e封裝成公鑰,n和d封裝成私鑰。即公鑰是(33,13),私鑰是(33,17) 注意:實際應用中,公鑰和私鑰的數據都採用 ASN.1 格式表達。

3.3 RSA加密算法的可靠性分析

上述步驟共出現6個數字:p:三、q:十一、n:3三、φ(n):20、e:1三、d:17。其中,公鑰用了兩個,即(n和e),其他四個數字不公開。這些數字中最關鍵的是d,由於n和d組成了私鑰,一旦d泄露,就等於私鑰泄露。

討論:在已知公鑰(n,e)的狀況下,推導d

因爲d是e相對於φ(n)的模反元素,知足ed mod φ(n) ≡ 1,要想求出d,必須知道e和φ(n)。
又由φ(n) = (p-1)(q-1),只有知道p和q,才能求出φ(n)。
而n = pq,只有將n因式分解,才能算出p和q。

結論:若是n能夠被因式分解,d就能夠算出,也就意味着私鑰被破解。所以,RSA加密算法的可靠性,取決於對極大整數作因式分解的難度。

3.4 加密和解密

有了公鑰和私鑰,就能夠進行通訊了。

  1. 假設乙要向甲發送信息m,他須要用甲的公鑰(n,e)即(33,13)對m進行加密,獲得密文c。加密規則爲:me mod n ≡ c,假設m爲6,則c=18。因而,乙將18發給了甲。
  2. 甲收到了乙發送過來的信息,即18,也就是c的值,並用本身的私鑰(n,d)即(33,17)進行解密。解密規則爲:cd mod n ≡ m,即m=6。所以,甲知道了乙發送過來的原文是6。

至此,「加密-解密」的過程就完成了。

思考:爲何解密規則是 cd mod n ≡ m

3.5 解密規則的證實

根據加密規則 me mod n ≡ c,獲得 c ≡ me - kn
將其代入咱們要證實的解密規則,可獲得:
(me - kn)d mod n ≡ m
它等同於證實: med mod n ≡ m
又因爲d爲e相對於φ(n)的模反元素,故ed mod φ(n) ≡ 1,即ed = k*φ(n)+1,將ed代入上式得:
mkφ(n)+1 mod n ≡ m,(k爲大於等於1的整數)
所以,上式得證則解密規則成立!

在此,咱們再梳理一下加-解密過程當中的這幾個數字:p:三、q:十一、n:3三、φ(n):20、e:1三、d:1七、明文m:六、密文c:18。

  1. n爲兩個質數p和q的乘積,則n與以上除了p、q、n以外的任意數互質。(實際運用中,p和q爲大質數,從而保證了n被破解的難度很大);
  2. e知足1 < e < φ(n),而且與φ(n)互質,d爲e相對於φ(n)的模反元素,即ed=kφ(n)+1

接下來,分紅兩種狀況證實解密。

  • m與n互質時
  1. 根據歐拉定理,mφ(n) mod n ≡ 1
  2. 因爲1^k≡11*m≡m,對兩邊表達式進行k次冪運算後,再各乘以m,獲得 mkφ(n)+1 mod n ≡ m,得證!
  3. 即m和n互質時,解密規則成立。
  • m與n不互質時
  1. 因爲n爲兩個質數(p和q)的乘積,故m必爲其中一個質數的倍數,在此取m=kp
  2. 根據歐拉定理,有 (kp)φ(q) mod q ≡ 1
  3. 因爲1^[hφ(p)]≡11*(kp)≡kp,獲得 (kp)hφ(n)+1 mod q ≡ kp
  4. ed=kφ(n)+1,代入上式可得 (kp)ed mod q ≡ kp,故 (kp)ed ≡ tq + kp(思考t和p的關係)
    t和p的關係:由上式獲得 (kp)ed mod t ≡ kp ,顯然,t必然能被p整除,即 t=t'p
  5. 所以,(kp)ed ≡ t'pq + kp,因爲m=kpn=pq,因此 med mod n ≡ m,得證!即,m和n不互質時,解密規則也成立!

綜上,不管明文m是什麼內容,都能經過加密規則:me mod n ≡ c 生成密文c,再由解密規則:cd mod n ≡ m 獲得明文m。

3.6 RSA算法的特色

經過對RSA算法原理、流程的驗算分析,不可貴出如下幾個結論:

  1. RSA算法不須要進行密鑰傳遞,安全性高。
  2. RSA算法的加密解密效率不高,通常應用於處理小數據。
    如加密KEY、數字簽名等。

4. 示例

講了半天RSA算法的理論知識,是時候展現真正的技術了。接下來,咱們用終端來玩一下RSA吧。

因爲Mac系統內置OpenSSL(開源加密庫),因此咱們能夠直接在終端上使用命令來玩RSA。
OpenSSL中RSA算法的經常使用指令主要有三個:

genrsa,生成並輸入一個RSA私鑰
rsautl,使用RSA密鑰進行加密、解密、簽名和驗證等運算
rsa,處理RSA密鑰的格式轉換問題。

操做流程以下:

  1. 生成一個長度爲1024位的RSA私鑰
openssl genrsa -out private.pem 1024
複製代碼

結果以下:

  • 對私鑰內容感興趣的同窗能夠用下面的命令將私鑰轉換成明文。
openssl rsa -in private.pem -text -out private.txt
複製代碼

自行打開private.txt文件便可,這裏不做文件內容說明。

  1. 從私鑰中提取公鑰
openssl rsa -in private.pem -pubout -out public.pem
複製代碼

結果以下:

  1. 假設明文文件內容是

  2. 對明文文件進行 公鑰加密私鑰解密

經過公鑰進行加密

openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
複製代碼

經過私鑰進行解密

openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
複製代碼

結果以下:

解密後的文件dec.txt內容正好是【密碼:helloRSA123456】,與明文內容一致。至此,RSA算法流程結束。

注意:也可用 私鑰加密公鑰解密,如:
1). 經過私鑰進行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt
2). 經過公鑰進行解密
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt

5. 參考資料

相關文章
相關標籤/搜索