上期(RSA簡介及基礎數論知識)爲你們介紹了:互質、歐拉函數、歐拉定理、模反元素 這四個數論的知識點,而這四個知識點是理解RSA加密算法的基石,忘了的同窗能夠快速的回顧一遍。git
1、目前常見加密算法簡介
2、RSA算法介紹及數論知識介紹
3、RSA加解密過程及公式論證算法
今天的內容主要分爲三個部分:安全
你們都知道rsa加密算法是一種非對稱加密算法,也就意味着加密和解密是使用不一樣的密鑰,而這不一樣的密鑰是如何生成的呢?下面咱們來模擬下小紅是如何生成公鑰和私鑰的。
微信
六步生成密鑰:markdown
小紅隨機選擇選擇了61和53。(實際應用中,這兩個質數越大,就越難破解)函數
n = 61×53 = 3233測試
n的長度就是密鑰長度,3233寫成二進制是110010100001,一共有12位,因此這個密鑰就是12位。實際應用中,RSA密鑰通常是1024位,重要場合則爲2048位。atom
這裏利用咱們上篇講到的歐拉函數求解的第四種狀況:加密
若是n能夠分解成兩個互質的整數之積,即:n = p1 × p2,則φ(n) = φ(p1p2) = φ(p1)φ(p2),因此φ(3233) = φ(61x53) = φ(61)φ(53)spa
又由於61和53都是質數,因此能夠根據歐拉函數求解的第二種狀況:
若是n是質數,則 φ(n)=n-1,因此φ(3233) = φ(61x53) = φ(61)φ(53)=60x52=3120
因此 φ(n)=3120
小紅就在1到3120之間,隨機選擇了17。(實際應用中,經常選擇65537)
讓咱們來回顧一下什麼是模反元素:
所謂「模反元素」就是指有一個整數d,可使得ed除以φ(n)的餘數爲1,公式表示:
e d ≡ 1 ( m o d φ ( n ) ) ed ≡ 1 (mod φ(n)) ed≡1(modφ(n))
這個公式等價於
e d – k φ ( n ) = 1 ed – kφ(n) = 1 ed–kφ(n)=1
將e=1七、φ(n)=3120代入得:
17 d – 3120 k = 1 17d – 3120k = 1 17d–3120k=1
設x=d、y=-k,得
17 x + 3120 y = 1 17x+3120y=1 17x+3120y=1
因此咱們要求的模反元素d就是對上面的二元一次方程求解
根據擴展歐幾里得算法(展轉相除法)求解:
上圖咱們使用擴展歐幾里得求得x=-367,因此d=x=-367,但一般咱們習慣取正整數,這樣方便計算,還記得咱們上節講過的模反元素的特性嗎:
3和11互質,那麼3的模反元素就是4,由於 (3 × 4)-1 能夠被11整除。顯然,模反元素不止一個, 4加減11的整數倍都是3的模反元素 {…,-18,-7,4,15,26,…},即若是b是a的模反元素,則 b+kn 都是a的模反元素。
因此咱們取d=d+kφ(n)=-367+1x3120=2753,到這裏全部的計算已經所有完畢!
讓咱們來回顧一下咱們一共出現的6個數字:
在這個例子中n=3233,e=17,d=2753,因此公鑰就是 (n,e)=(3233,17),私鑰就是**(n,d)=(3233, 2753)**,這樣小紅就將公鑰公佈出去,本身保存好私鑰就能夠啦!
至此咱們公鑰、私鑰就生成完畢,是否是以爲並非很難呢?是否是有點懷疑私鑰會不會被人破解呢?下面咱們來看看如何才能暴力破解私鑰。
回顧咱們一共生成了六個數字:p q n φ(n) e d
,這六個數字之中,公鑰用到了兩個(n和e),其他四個數字都是不公開的。其中最關鍵的是d,由於n和d組成了私鑰,一旦d泄漏,就等於私鑰泄漏。
那麼,有無可能在已知n和e的狀況下,推導出d?
結論:若是n能夠被因數分解,d就能夠算出,也就意味着私鑰被破解。
看到這裏有同窗可能會驚呼:原來破解RSA算法的方法這個簡單???
但是,大整數的因數分解,是一件很是困難的事情。也許你能夠對3233進行因數分解(61×53),可是你沒辦法對下面的大整數分解:
123018668453011775513049495838496272077285356959533479219732245215172640050726
365751874520219978646938995647494277406384592519255732630345373154826850791702
6122142913461670429214311602221240479274737794080665351419597459856902143413
它等於兩個質素的乘積:
33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917
這也是目前維基百科記錄的人類分解的最大整數(232個十進制位,768個二進制位),除了暴力破解,尚未發現別的有效方法。因此限制人類分解大整數的是計算機的計算能力,相信若是有一天真正的量子計算機問世後,又會引起一輪安全加密競賽!
小紅有了公鑰和私鑰這樣就能夠進行加解密了,因而小紅拉着小明一塊兒來測試一下!
假設小明先測試性的給小紅髮一個字母m=「A」,咱們都知道在通訊傳輸中只能傳輸0和1,因此咱們先將「A」轉ascii碼爲65,因此m=65,m必須是整數(字符串能夠取ascii值或unicode值),且m必須小於n。
所謂」加密」,就是使用下面的加密公式算出下式的密文c:
m e ≡ c ( m o d n ) m^e ≡ c (mod n) me≡c(modn)
小明獲得的公鑰是(n,e)=(3233, 17),m=65,那麼獲得下面的等式:
6 5 17 ≡ c ( m o d 3233 ) 65^{17} ≡ c (mod 3233) 6517≡c(mod3233)
小明經過計算器一算c=2790,因此他就把2790發給小紅了。
小紅拿到小明發過來的密文c=2790,就用下面的公式進行解密出明文m:
c d ≡ m ( m o d n ) c^d ≡ m (mod n) cd≡m(modn)
而小紅的私鑰爲:(n,d) = (3233,2753),因此獲得下面的等式:
279 0 2753 ≡ m ( m o d 3233 ) 2790^{2753} ≡ m (mod 3233) 27902753≡m(mod3233)
小紅經過計算器一算,得m=65,而後小紅對照着ascii碼錶得出65對應得字母爲A。
至此,整個加解密過程就演示完了,咱們來總結一下:
咱們能夠看到,其實RSA加密算法最核心的就是用公式來加解密,那麼咱們會有個疑問?爲何解密公式必定能夠獲得明文m呢?也就是說這個公式是怎麼推導出來的?公式必定成立嗎?
感興趣的同窗咱們能夠來一塊兒證實一下解密公式,這也是整個RSA加密算法的最後最核心的一個知識點了。這裏我會一步一步的推理,儘量通俗易懂;
首先讓咱們再來回顧一下咱們一共出現的8個數字
驗證rsa算法成立,主要就是驗證解密公式成立:
解 密 公 式 : c d ≡ m ( m o d n ) 解密公式: c^d ≡ m (mod n) 解密公式:cd≡m(modn)
根據加密公式:
加 密 公 式 : m e ≡ c ( m o d n ) → c = m e – k n 加密公式:m^e ≡ c (mod n) → c = m^e – kn 加密公式:me≡c(modn)→c=me–kn
將c代入要咱們要證實的那個解密公式:
( m e – k n ) d ≡ m ( m o d n ) (m^e – kn)^d ≡ m (mod n) (me–kn)d≡m(modn)
上式等同於下面的公式,緣由以下
m e d ≡ m ( m o d n ) m^{ed} ≡ m (mod n) med≡m(modn)
緣由:咱們都知道下面的二元一次方程分解,只有第一項不包含n,而全部包含n的項在對n 取餘 的操做中均可以消掉。所以得出了上面那個結論
( 2 – 2 n ) 2 = 4 − 8 n + 4 n 2 (2 – 2n)^2 = 4-8n+4n^2 (2–2n)2=4−8n+4n2
又由於生成密鑰的第五步中咱們取e並求了他對φ(n)的模反元素d:
e d ≡ 1 ( m o d φ ( n ) ) → e d = h φ ( n ) + 1 ed ≡ 1 (mod φ(n)) → ed = hφ(n)+1 ed≡1(modφ(n))→ed=hφ(n)+1
因此將ed代入上式得
m h φ ( n ) + 1 ≡ m ( m o d n ) m^{hφ(n)+1} ≡ m (mod n) mhφ(n)+1≡m(modn)
因此,咱們只要證實這個公式成立,就證實解密公式的成立,也就證實了RSA算法的成立。
下面咱們分兩種狀況來驗證上面的例子
根據歐拉定理:若是兩個正整數a和n互質,則n的歐拉函數 φ(n) 可讓下面的等式成立:
a φ ( n ) ≡ 1 ( m o d n ) a^{φ(n)} ≡ 1 (mod n) aφ(n)≡1(modn)
證實:由於m與n互質,得
m φ ( n ) ≡ 1 ( m o d n ) → m φ ( n ) = 1 + k n → ( m φ ( n ) ) h = ( 1 + k n ) h m^{φ(n)} ≡ 1 (mod n) → m^{φ(n)} = 1 + kn → (m^{φ(n)})^h = (1 + kn)^h mφ(n)≡1(modn)→mφ(n)=1+kn→(mφ(n))h=(1+kn)h
而(1 + kn)^h對n取模爲1,由於對(1 + kn)^h拆分只有第一項1不含有n,因此有
( m φ ( n ) ) h = ( 1 + k n ) h ≡ 1 ( m o d n ) (m^{φ(n)})^h = (1 + kn)^h ≡ 1 (mod n) (mφ(n))h=(1+kn)h≡1(modn)
同理
( m φ ( n ) ) h ≡ 1 ( m o d n ) → ( m φ ( n ) ) h = 1 + k n → ( m φ ( n ) ) h ∗ m = ( 1 + k n ) ∗ m (m^{φ(n)})^h ≡ 1 (mod n) → (m^{φ(n)})^h = 1 + kn → (m^{φ(n)})^h*m = (1 + kn)*m (mφ(n))h≡1(modn)→(mφ(n))h=1+kn→(mφ(n))h∗m=(1+kn)∗m
而 (1 + kn)*m對n取模爲m,由於前面說過0 < m < n,因此有
( m φ ( n ) ) h ∗ m = ( 1 + k n ) ∗ m ≡ m ( m o d n ) → m h φ ( n ) + 1 ≡ m ( m o d n ) (m^{φ(n)})^h*m = (1 + kn)*m ≡ m (mod n) → m^{hφ(n)+1} ≡ m (mod n) (mφ(n))h∗m=(1+kn)∗m≡m(modn)→mhφ(n)+1≡m(modn)
當m與n互質時,證實原式成功!!!
此時m與n不互質,因此m與n一定有除1之外的公因子,而又由於n等於質數p和質數q的乘積,因此m必然等於kp或kq。
以 m = kp爲例,考慮到這時m與質數q必然互質,則根據歐拉定理和歐拉函數(第二種:當q爲質數,則φ(q)=q-1)使下面的式子成立:
( k p ) φ ( q ) ≡ 1 ( m o d q ) → ( k p ) q − 1 ≡ 1 ( m o d q ) (kp)^{φ(q)} ≡ 1 (mod q) → (kp)^{q-1} ≡ 1 (mod q) (kp)φ(q)≡1(modq)→(kp)q−1≡1(modq)
同上(m與n互質中)證實原理可得:
[ ( k p ) q − 1 ] h ( p − 1 ) × k p ≡ k p ( m o d q ) → ( k p ) h ( p − 1 ) ( q − 1 ) + 1 ≡ k p ( m o d q ) [(kp)^{q-1}]^{h(p-1)} × kp ≡ kp (mod q) → (kp)^{h(p-1)(q-1)+1} ≡ kp (mod q) [(kp)q−1]h(p−1)×kp≡kp(modq)→(kp)h(p−1)(q−1)+1≡kp(modq)
又由於
e d ≡ 1 ( m o d φ ( n ) ) → e d = h φ ( n ) + 1 → e d = h ( p − 1 ) ( q − 1 ) + 1 ed≡1 (mod φ(n)) → ed = hφ(n) + 1 → ed = h(p-1)(q-1) + 1 ed≡1(modφ(n))→ed=hφ(n)+1→ed=h(p−1)(q−1)+1
將ed代入上式
( k p ) e d ≡ k p ( m o d q ) → ( k p ) e d = t q + k p (kp)^{ed} ≡ kp (mod q) → (kp)^{ed} = tq + kp (kp)ed≡kp(modq)→(kp)ed=tq+kp
上式中,等式左邊(kp)^ed對p取模爲0,右邊kp對p取模也爲0,因此tq必定能整除p,但q是與p互質的,因此t必然能整除p,設t=rp,得
( k p ) e d = r p q + k p (kp)^{ed} = rpq + kp (kp)ed=rpq+kp
由於 m=kp,n=pq,因此
m e d = r n + m → m e d ≡ m ( m o d n ) m^{ed} = rn + m → m^{ed} ≡ m (mod n) med=rn+m→med≡m(modn)
又由於生成密鑰的第五步中咱們取e並求了他對φ(n)的模反元素d:
e d ≡ 1 ( m o d φ ( n ) ) → e d = h φ ( n ) + 1 ed ≡ 1 (mod φ(n)) → ed = hφ(n)+1 ed≡1(modφ(n))→ed=hφ(n)+1
將ed代入上式得:
m h φ ( n ) + 1 ≡ m ( m o d n ) m^{hφ(n)+1} ≡ m (mod n) mhφ(n)+1≡m(modn)
當m與n不互質時,證實原式成功!!!
附手稿:
感興趣的同窗能夠掃描下方二維碼關注個人微信公衆號:裸睡的豬