這是去年12月在CSDN寫的一篇加密算法文章 現在決定在簡書寫博客 移植過來方便復習再理解。
最近算法課老師要求小組上臺講算法,我們就去學習了一下RSA算法。
以前的加密算法,大部分屬于對稱加密算法。通信雙方只有掌握同一種規則,才能進行加密解密。這種加密模式有一個最大弱點:甲方必須把加密規則告訴乙方,否則無法解密。就好像一把鑰匙單獨對應一把鎖。但是問題在于,當通信對象很多時,就會有很多把鎖和鑰匙,這時候保存和傳遞密鑰就是很大的問題。
RSA是一種非對稱加密,公開密鑰算法。他利用了利用了單向函數正向求解很簡單,反向求解很復雜的特性。
具體來說:
1.兩個質數相乘很簡單,將一個數分解成質數相乘很難
2.(m^e)modN=c 已知m求c很簡單,已知c求m很難
而RSA加密算法,就是基于這樣的一個正向簡單逆向難的數論思路。上面的公式中,m是發送的原數字,c是加密后的數字,e、N是公開的公鑰。即使有人截獲了加密后的c,也很難破解,獲得m。其難度就在于大整數的因式分解。
那么,我們獲得了c之后,就需要有一套自己獨特的方式進行解密,而我們自己的秘密武器,就是私鑰d。我們需要有這樣一個數d,可以讓我們通過(c^d)modN=m推出m。而這個思路和推倒,就利用了歐拉公式,和歐拉定理。
介紹一下我們需要掌握的一些數學定理:
歐拉函數:在小于等于n的正整數之中,有多少個與n構成互質關系?以φ(n)表示。在1到8之中,與8形成互質關系的是1、3、5、7,所以
φ(8) = 4。
注意:如果n是質數,那么φ(n)=n-1。因為質數與小于它的每一個數,都構成互質關系。比如5與1、2、3、4都構成互質關系。
歐拉函數另一種情況:如果n可以分解成兩個互質的整數之積,n = p1 × p2則φ(n) = φ(p1p2) = φ(p1)φ(p2)。這里不再證明,有興趣的查閱數學資料。結合φ(n)=n-1,可以推出φ(n)=(p-1)(q-1)
歐拉定理:如果兩個正整數a和n互質,則n的歐拉函數 φ(n) 可以讓下面的等式成立:a^φ(n) ≡ 1( mod n)
(符號為同余號,即兩邊除以n余數相同)
模反元素:如果兩個正整數a和n互質,那么一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的余數是1。
ab ≡ 1( mod n)這個模反元素,就是我們得到私鑰的關鍵
由上面的思路我們可以想到,如果有這樣一個數n,由質數p,q構成因子,那么我們由上式很容易求出φ(n) = φ(p1p2) = φ(p1)φ(p2)=(p1-1)(p2-1),而這個n就用作公鑰。
RSA加密算法主要過程如下:
隨意選擇兩個大的質數p和q,p不等于q,計算N=pq。
根據歐拉函數,不大于N且與N互質的整數個數為φ(N)= (p-1)(q-1)。
選擇一個整數e與φ(N)互質,并且e小于φ(N)。
用以下這個公式計算d:d× e ≡ 1 (mod φ(N))。
將p和q的記錄銷毀。
我們一共用到6個數字:p,q,n,φ(n),e,d
再解釋一下,pq是我們設置的兩個質數,n是質數pq的乘積,φ(n)是歐拉函數,e是我們自己設置的與φ(N)互質的數字,而d是φ(N)的模反元素。 這6個數字中n,e是公鑰,所有人可以看到,用來進行加密。n,d是私鑰,只有自己能看到,通過私鑰我們就可以進行快速正確的解鎖。
那么怎么證明 (c^d)modN=m 是成立的呢? 我們看到,已知(m^e)modN=c,將c帶入上式
(((m^e)modN)^d)modN=m
上式子可以化簡為
((m^e)^d)modN=m即(m^ed)modN=m
為什么可以這樣化簡?為什么(m^e)modN直接等于了m^e?把Modn約沒了?
重點!!!因為
m^e mod n ≡ m^e (mod n)
他們是同余的!我們知道,同余的兩個數的N次方,依然是同余的!這里就是關鍵,我就是卡在這里不明白好久。。- - 所以推倒得出結果
m^ed mod N=m
根據歐拉定理:m^φ(n) ≡1 (mod n),又1^k≡1,所以
m^k*φ(n) ≡1 (mod n)
,兩邊同乘以m得
m*(m^k*φ(n)) ≡1*m (mod n)
化簡得
m^(kφ(n)+1) ≡m(mod n)*
由這兩個結果可以得出ed=kφ(n)+1,即d=(k*φ(n)+1)/e*。這個等式是否似曾相識?是的,他就是我們的模反元素求解過程,
而我們在模反元素求解過程中,ab ≡ 1( mod φ(n)) 也可以化簡為ab=kφ(n)+1,b=kφ(n)+1/a。 通過推倒,模反元素d就是我們的私鑰。通過他,我們可以用一把鑰匙解開很多的鎖。只要保證私鑰的不丟失,密碼就很難破解。
最后舉個例子。我設置質數p=3,q=11,則n=33,φ(n)=20,e需要取一個小于φ(n)且互質φ(n)的數,這里取e=7,模反元素d: ed≡1(mod φ(n)),即 7*d % 20 =1 求得d=3
現在6個元素都有了值 我們進行加密和解密。
傳輸m m=5 (m^e)modN=c 即5^7mod 33=14 c=14 加密之后的數是14
我們在通過(c^d)modN=m求得m 即14^3mod33=5 得出加密前,即真正傳送的數字是5
想要獲得m,必須求得d.而d是通過d=(k*φ(n)+1)/e 得到的。而φ(n)的求得又需要分解N的質因數。我的例子里N比較小。而當數字N越大時,分解N的質因數越難,所以說他的安全系數還是很高的。以上是我對RSA加密算法的一點理解。
(總結這個,又花了兩個多小時的時間,希望自己能夠真正理解并記住,也它是有用的,能幫到別人理解。畢竟不擅長算法,如果有錯誤不完善的地方請大家指出!)
參考資料:
1.https://www.zhihu.com/question/25038691
2.http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html