基礎知識
RSA設計
\(m^{ed} \equiv 1 \: (mod\: n)\)
RSA密鑰生成
第一步,隨機選擇兩個不相等的質數p和q。
如61和53。(質數越大越安全。)
第二步,計算p和q的乘積n。
把61和53相乘:
n = 61×53 = 3233
n的長度就是密鑰長度。3233寫成二進制是110010100001,一共有12位,所以這個密鑰就是12位。
RSA密鑰一般是1024位和2048位。
第三步,計算n的歐拉函數φ(n)。
根據公式:
φ(n) = (p-1)(q-1)
算出φ(3233)等於60×52,即3120。
第四步,隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。
在1到3120之間,隨機選擇了17。(應用中,可選擇65537。)
第五步,計算e對於φ(n)的模反元素d。
所謂”模反元素”就是指有一個整數d,可以使得ed被φ(n)除的余數為1。
ed ≡ 1 (mod φ(n))
這個式子等價於
ed - 1 = kφ(n)
於是,找到模反元素d,實質上就是對下面這個二元一次方程求解。
ex + φ(n)y = 1
已知 e=17, φ(n)=3120,
17x + 3120y = 1
這個方程可以用擴展歐幾里得算法(輾轉相除法)求解:(這里求解過程圖片待傳)
算出一組整數解為 (x,y)=(2753,-15),即 d=2753。
第六步,將n和e封裝成公鑰,n和d封裝成私鑰。
在例子中,n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753)。
RSA加密
小紅有了公鑰和私鑰這樣就可以進行加解密了,於是小紅拉着小明一起來測試一下!
加密要用公鑰 (n,e)
假設小明先測試性的給小紅發一個字母m=“A”,我們都知道在通信傳輸中只能傳輸0和1,所以我們先將“A”轉ascii碼為65,所以m=65,m必須是整數(字符串可以取ascii值或unicode值),且m必須小於n。
所謂”加密”,就是使用下面的加密公式算出下式的密文c:
me ≡ c ( m o d n ) m^e ≡ c (mod n)
me ≡c(modn)
小明得到的公鑰是(n,e)=(3233, 17),m=65,那么得到下面的等式:
65 17 ≡ c ( mod 3233 ) 65^17 ≡ c (mod 3233)
6517≡c(mod3233)
小明通過計算器一算c=2790,所以他就把2790發給小紅了。
RSA解密
RSA關鍵
首先要使用概率算法來驗證隨機產生的大的整數是否質數,這樣的算法比較快而且可以消除掉大多數非質數。假如有一個數通過了這個測試的話,那么要使用一個精確的測試來保證它的確是一個質數。
除此之外這樣找到的p和q還要滿足一定的要求,首先它們不能太靠近,此外p-1或q-1的因子不能太小,否則的話N也可以被很快地分解。
此外尋找質數的算法不能給攻擊者任何信息,這些質數是怎樣找到的,尤其產生隨機數的軟件必須非常好。要求是隨機和不可預測。這兩個要求並不相同。一個隨機過程可能可以產生一個不相關的數的系列,但假如有人能夠預測出(或部分地預測出)這個系列的話,那么它就已經不可靠了。比如有一些非常好的隨機數算法,但它們都已經被發表,因此它們不能被使用,因為假如一個攻擊者可以猜出p和q一半的位的話,那么他們就已經可以輕而易舉地推算出另一半。
此外密鑰d必須足夠大,1990年有人證明假如p大於q而小於2q(這是一個很經常的情況)而\({d < N(1/4)/3}\),(1/4)是N的上標,那么從N 和 e可以很有效地推算出d。此外e = 2永遠不應該被使用。
RSA安全分析
密鑰中一共生成了六個數字:p q n φ(n) e d,這六個數字之中,公鑰用到了兩個(n和e),其余四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d泄漏,就等於私鑰泄漏。
那么,有無可能在已知n和e的情況下,推導出d?
ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d
φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)
n=pq。只有將n因數分解,才能算出p和q
結論:如果n可以被因數分解,d就可以算出,也就意味着私鑰被破解。
假設偷聽者乙獲得了甲的公鑰N和e以及丙的加密消息c,但她無法直接獲得甲的密鑰d。要獲得d,最簡單的方法是將N分解為p和q,這樣她可以計算(p-1)(q-1)並從而由e推算出d。至今為止還沒有人找到一個多項式時間的計算方法來分解一個大的整數的因子,但至今為止也還沒有人能夠證明這種算法不存在。
RSA破解
針對RSA最流行的攻擊一般是基於大數因數分解。
1999年,RSA-155(512 bits)被成功分解,花了五個月時間(約8000 MIPS 年)和224 CPU hours 在一台有3.2G中央內存的Cray C916計算機上完成 。
2002年,RSA-158也被成功因數分解。
RSA-158表示如下:
39505874583265144526419767800614481996020776460304936454139376051579355626529450683609
727842468219535093544305870490251995655335710209799226484977949442955603
= 3388495837466721394368393204672181522815830368604993048084925840555281177×
11658823406671259903148376558383270818131012258146392600439520994131344334162924536139
2009年12月12日,編號為 RSA-768 (768 bits, 232 digits)數也被成功分解[1]。這一事件威脅了現通行的1024-bit密鑰的安全性,普遍認為用戶應盡快升級到2048-bit或以上。
RSA-768 =
123018668453011775513049495838496272077285356959533479219732245215172640050726
365751874520219978646938995647494277406384592519255732630345373154826850791702
6122142913461670429214311602221240479274737794080665351419597459856902143413
=
3347807169895689878604416984821269081770479498371376856891
2431388982883793878002287614711652531743087737814467999489
×
3674604366679959042824463379962795263227915816434308764267
6032283815739666511279233373417143396810270092798736308917
RSA的選擇密文攻擊
RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝( Blind),讓擁有私鑰的實體簽署。然后,經過計算就可得到它所想要的信息。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:
( XM )^d = X^d *M^d mod n
這個固有的問題來自於公鑰密碼系統的最有用的特征--每個人都能使用公鑰。
但從算法上無法解決這一問題,主要措施有兩條:一條是采用好的公鑰協議,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way HashFunction 對文檔作HASH處理。
RSA的公共模數攻擊
若系統中共有一個模數,只是不同的人擁有不同的e和d,系統將是危險的。最普遍的情況是同一信息用不同的公鑰加密,這些公鑰共模而且互質,那末該信息無需私鑰就可得到恢復。設P為信息明文,兩個加密密鑰為e1和e2,公共模數是n,則:
C1 = P^e1 mod n
C2 = P^e2 mod n
密碼分析者知道n、e1、e2、C1和C2,就能得到P。
因為e1和e2互質,故用Euclidean算法能找到r和s,滿足:
r * e1 + s * e2 = 1
假設r為負數,需再用Euclidean算法計算C1^(-1),則
( C1^(-1) )^(-r) * C2^s = P mod n
另外,還有其它幾種利用公共模數攻擊的方法。總之,如果知道給定模數的一對e和d,一是有利於攻擊者分解模數,一是有利於攻擊者計算出其它成對的e’和d’,而無需分解模數。解決辦法只有一個,那就是不要共享模數n。
RSA的小指數攻擊。
有一種提高 RSA速度的建議是使公鑰e取較小的值,這樣會使加密變得易於實現,速度有所提高。但這樣作是不安全的,對付辦法就是e和d都取較大的值。
RSA算法是第一個能同時用於加密和數字簽名的算法,也易於理解和操作。
另外,RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學界多數人士傾向於因子分解不是NPC問題。
秀爾算法
基於Shor算法攻擊RSA
量子計算里的秀爾算法能使窮舉的效率大大的提高。由於RSA算法是基於大數分解(無法抵抗窮舉攻擊),因此在未來量子計算能對RSA算法構成較大的威脅。一個擁有N量子比特的量子計算機,每次可進行2^N次運算,理論上講,密鑰為1024位長的RSA算法,用一台512量子比特位的量子計算機在1秒內即可破解。
Shor算法具有隨機性,導致破解RSA公鑰密碼體制成功率不高,根據RSA公鑰密碼體制特點和Shor計算結果分析,發現量子函數式f(x)=axmod n 對a值的隨機選取是有規律的.結果是:隨機數a取完全平方數,所求周期r很可能不滿足Shor算法要求;a取非完全平方數可以提高Shor算法破解RSA的成功率.
利用RSA不動點性質,基於量子Fourier變換和變量代換,提出了一種新的攻擊RSA的量子算法.該算法不需要分解n,而是從RSA密文C中直接恢復其明文M.該算法與Shor算法相比,需要的量子位更少,且成功概率大於1/2.最后將新算法的資源消耗情況與Shor算法的進行了對比.
Shor算法能夠在多項式時間內求解整數分解問題和離散對數問題,解決整數分解問題是Shor算法攻擊RSA的核心思想,但攻破RSA並非一定要從解決整數分解問題人手。針對RSA公鑰密碼體制的特點,通過量子傅里葉變換求出RSA密文c模n的e次根進而得到RSA的明文M.即不通過整數分解問題攻破了RSA.與以往密碼分析者通過分解模數n試圖恢復私鑰的做法不同,直接從恢復明文消息人手,給出一個對抗RSA密碼體制的唯密文攻擊算法.即不通過解決整數分解問題實現攻破RSA,且避開了密文C模n的階為偶數這一限制.