RSA的證明


最初寫這篇《RSA的證明》是看到了一篇好文——《“不給力啊,老溼!”:RSA加密與破解 》,但是這篇文章在網絡上大部分的分享中,公式大多不完整。而且各處的推演使用的數學語言與程序員習慣的表示方法差異太大了。於是出了此文,對《RSA加密與破解》進行了總結,並將數學部分換成程序員易於理解的方式。但是大部分內容還是來源於《RSA加密與破解》,少量的借鑑使用了《RSA算法基礎詳解》進行補充說明。

但是,回過頭來看這篇文章,雖然當初反覆修改,但仍有很多地方表述不明確、不嚴謹、也不夠簡潔。例如公式(3)可以得到更多化簡,這就導致推導證明RSA時可以更加簡單高效;在證明RSA時本末倒置,沒有把證明的根本目標說清楚;另外,對於n的選取,本應該有更詳細的說明,n的選取本是RSA得以成立的至關重要的一點,但是國內網絡上的資料似乎很少提及,或者不會進行詳細說明。

因此,對此文再次進行了修改,希望能夠與國內大部分胡亂轉載的RSA資料有明顯的區別,能夠起到給網友從另一個角度看問題的啓示作用。並儘量將問題說得詳細,邏輯順暢、嚴謹。

前言
RSA是一種非對稱加密算法,能夠將大家都能看懂的明文加密成旁人無法讀懂的密文。相比之下,最早的加密,如凱撒移位加密,其加密和解密用的是相同的鑰匙(密鑰),被稱作對稱加密算法。這種算法,一旦知道了一個密鑰,便可以獲取所有加密通訊的明文。

但是,如果加密用一把鑰匙,而解密只能用另一把鑰匙,那麼,即便竊聽消息的人獲得了加密密鑰,也無法還原出明文。這樣便極大的提高了加密通訊的安全性。這種加密與解密密鑰不同的方式被稱作非對稱加密。

1977年,羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)三人共同提出了著名的非對稱加密算法——RSA,是目前安全性最高的加密算法之一。

要想清晰的瞭解這個算法,首先要掌握幾個數學概念、定理或公理,其中最核心的要算歐拉定理。17世紀的費馬首先給出該定理的一個特殊形式,即費馬小定理:
p是一個正的質數,a是任意一個不能被p整除的整數。那麼,a^(p−1)−1能被p整除。

也就是
(a^(p−1))%p=1

費馬有個習慣,就是在書邊寫註釋,由於書邊空白一般太小,導致他提出了著名的“費馬猜想”卻沒有地方寫證明,於是在書邊空白處留下一句“我發現了一個美妙的證明,但由於空白太小而沒有寫下來”。導致相當長的一段時間內,這個猜想讓無數後來人想破腦瓜也不得證。可見,在書邊寫註釋也不是一個好習慣。同樣的,”費馬小定理“的證明,也是很久以後的事兒了。

一百年後,出了個大牛叫歐拉,話說歐拉一生寫了70多本數學專著,幾乎把當時所有數學領域都征服了一遍,這麼一個具有徵服癖的人,自然沒有放過費馬,於是歐拉狂虐費馬小定理,將其擴展到一個更廣的適用範圍,用數學語言描述如下:
如果n是一個正整數,a是任意一個非0整數,且n和a互質,那麼:
(a^ϕ(n))%n=1 (1)

其中,ϕ(n)是歐拉函數,ϕ(n)=從1到n-1中所有與n互質整數的個數。互質,說白了就是公約數只有1。那麼,比如說5,則1,2,3,4都與5互質,因此ϕ(5)=4。

對於質數p,它和1,2,3,…,p-1都互質,所以ϕ(p)=p-1。比如ϕ(11)=10。

由於質數p有ϕ(p)=p−1。因此,從歐拉定理可以推出費馬小定理。在歐拉虐了費馬之後,我們可以忘記費馬小定理了(話說這裏只是調侃哈,費馬還是超級牛的)。用一個例子簡單的檢驗歐拉定理。如果n是6,那麼ϕ(6)=2。讓a是11,和6互質。112−1爲120,確實可以被6整除,符合歐拉定理。

關於歐拉函數,還有一個推論:
m和n是互質的正整數。那麼
ϕ(mn)=ϕ(m)ϕ(n) (2)

除了上面的(1)和(2),還需要提前說明一個點:
(a*b)%n=(a%n)(b%n)=((a%n)b)%n (3)

簡單的證明如下:
假設a和b除以n的餘數爲c1,c2,則a和b可以寫成a=n*t1+c1,b=n*t2+c2
那麼,ab=n^2*t1*t2+n*t1*c2+n*t2*c1+c1*c2
因此,a*b除以n的餘數爲(c1*c2)%n,由於c1和c2都不能被n整除,因此(c1*c2)%n=c1*c2,即(a*b)%n=(a%n)*(b%n)。
根據此可以推論
(a^m)%n=((a%n)^m)%n=(a%n)^m

以上其實是令人枯燥乏味的數論方面的東西,這些東西本來在古代沒太多實際意義,沒想到現代計算機和通訊技術的發展,爲這些理論開闢出廣大的應用空間。RSA加密,便應用了以上理論。

在證明RSA算法前,我們先來了解下這個算法和加密解密過程
1.先選擇兩個質數p和q,讓n=p*q;
2.而k=ϕ(n)=(p−1)(q−1)*;
3.選擇任意d,條件是1<d<φ(n),且d與k互質;
4.取整數e,使得(d*e)%k=1。也就是說d*e=k*t+1,t爲某一整數。根據歐拉定理(d^φ(k))%k=(d*d^(φ(k)−1))%k=1,可計算出e=d^(φ(k)−1)

(e, n)和(d, n)爲密鑰。

設有需要被加密的明文c,c與n互質。x爲密文。
加密c的過程爲:
x=(c^e)%n

解密x的過程爲:
c=(x^d)%n

好了,輪到我們開工,證明這個算法了
要證明RSA,就是證明c經過加密再解密後仍然是c,也就是c=(((c^e)%n)^d)%n

證明下面主要使用了d*e=kt+1以及(3)及推論):
(((c^e)%n)^d)%n
=(c^(d*e))%n
=(c^(k*t+1))%n
=(c*((c^k)^t))%n
=(c%n)*((c^k)^t)%n
=(c%n)*((c^k)%n)^t

根據歐拉定理(1),對於任意c,如果c與n互質,那麼:
(c^k)%n=(c^ϕ(n))%n=1

因此,
(c%n)*((c^k)%n)^t
=(c%n)*(1^t)
=c%n

因爲c與n互質,所以c%n=c,也就是說:
(((c^e)%n)^d)%n=c

因此RSA得證。

關鍵點
根據上面證明可見,RSA算法的關鍵,在於找到一個與明文c互質的數n,如果c是一個整數,那麼很容易找到與之互質的數,如果c是一組數字,如c1,c2,…,cx,那麼如何找到一個n與所有的c都互質呢?
方法在於質數p和q必須比所有的c大,所得的n就一定與所有的c都互質。原因在於:
1.如果兩個數之中,較大的那個數是質數,則兩者構成互質關係,指數p和q比所有的c都大,因此p和q與所有的c都互質;
2.由於n只能分解成p和q,而所有的c都與p和q互質,所以n與所有的c都互質。

RSA的安全性
爲了對n求餘的時候,不會把數字弄混了,RSA算法要求所有被加密的數c要小於n。

但n大更重要的原因是要保護p和q。想破解,必須找到d。回顧RSA工作過程(注意n是公開的),可以這樣破解:
1.先找到隱藏的p和q
2.知道了p和q,可以算出k
3.d*e = k*t+1,即找到一個e,可以讓d*e-1被k整除。d就找到了。

上面的整個破解過程中,最困難的是第一步——找到兩個隱藏的p和q。如果p和q都選得非常大,比如說200位,會導致n也非常大,有400位。尋找一個400位數字的質數分解,對現在的計算機而言並不容易,這需要做除法運算大約sqrt(10^400)/2次。相當於10^199次除法運算!以超級計算機天河2號爲例,其浮點運算能力是每秒10^16級別。那麼,用天河2號找到p和q大約需要10^174年。這個活,要請上帝出手了。不過,假如10^174年後,天河2號得到明文如下(如果天河2號還在的話):
”10^174年減1天后,此信息作廢。“

那麼,估計上帝也要哭笑不得了。

【1】符號%和函數mod()均表示取模運算,可以理解爲求餘,如5%3=2
【2】符號^表示乘方運算,如5^2=25
【3】關於n的選取這裏只給出的一個簡單的方法。一個反例是p、q與c不互質,例如p=5,q=7,c=70,很明顯n=35,與c不互質
【4】本文資料參考《“不給力啊,老溼!”:RSA加密與破解 》,對其進行了簡化,並用更加符合程序員的語言給出詳細的RSA算法證明,原文鏈接爲:http://www.cnblogs.com/vamei/p/3480994.html#!comments,如果原文公式顯示異常,則可以參考:http://blog.jobbole.com/96702/
【5】參考資料《RSA算法基礎詳解》,來自:http://www.cnblogs.com/hykun/p/RSA.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章