RSA加密算法
操作
公鑰與私鑰的產(chǎn)生
假設Alice想要通過一個不可靠的媒體接收Bob的一條私人消息。她可以用以下的方式來產(chǎn)生一個公鑰和一個私鑰:
隨意選擇兩個大的質(zhì)數(shù)p{\displaystyle p}和q{\displaystyle q},p{\displaystyle p}不等于q{\displaystyle q},計算N=pq{\displaystyle N=pq}。
根據(jù)歐拉函數(shù),求得r=φ φ -->(N)=φ φ -->(p)φ φ -->(q)=(p? ? -->1)(q? ? -->1){\displaystyle r=\varphi (N)=\varphi (p)\varphi (q)=(p-1)(q-1)}
選擇一個小于r{\displaystyle r}的整數(shù)e{\displaystyle e},使e{\displaystyle e}與r{\displaystyle r}互質(zhì)。并求得e{\displaystyle e}關于r{\displaystyle r}的模反元素,命名為d{\displaystyle d}(求d{\displaystyle d}令ed≡ ≡ -->1(modr){\displaystyle ed\equiv 1{\pmod {r}}})。(模反元素存在,當且僅當e{\displaystyle e}與r{\displaystyle r}互質(zhì))
將p{\displaystyle p}和q{\displaystyle q}的記錄銷毀。
(N,e){\displaystyle (N,e)}是公鑰,(N,d){\displaystyle (N,d)}是私鑰。Alice將她的公鑰(N,e){\displaystyle (N,e)}傳給Bob,而將她的私鑰(N,d){\displaystyle (N,d)}藏起來。
加密消息
假設Bob想給Alice送一個消息m{\displaystyle m},他知道Alice產(chǎn)生的N{\displaystyle N}和e{\displaystyle e}。他使用起先與Alice約好的格式將m{\displaystyle m}轉(zhuǎn)換為一個小于N{\displaystyle N},且與N{\displaystyle N}互質(zhì)的整數(shù)n{\displaystyle n},比如他可以將每一個字轉(zhuǎn)換為這個字的Unicode碼,然后將這些數(shù)字連在一起組成一個數(shù)字。假如他的信息非常長的話,他可以將這個信息分為幾段,然后將每一段轉(zhuǎn)換為n{\displaystyle n}。用下面這個公式他可以將n{\displaystyle n}加密為c{\displaystyle c}:
計算c{\displaystyle c}并不復雜。Bob算出c{\displaystyle c}后就可以將它傳遞給Alice。
解密消息
Alice得到Bob的消息c{\displaystyle c}后就可以利用她的密鑰d{\displaystyle d}來解碼。她可以用以下這個公式來將c{\displaystyle c}轉(zhuǎn)換為n{\displaystyle n}:
得到n{\displaystyle n}后,她可以將原來的信息m{\displaystyle m}重新復原。
解碼的原理是
已知ed≡ ≡ -->1(modr){\displaystyle ed\equiv 1{\pmod {r}}},即 ed=1+hφ φ -->(N){\displaystyle ed=1+h\varphi (N)}。 由歐拉定理得:
簽名消息
RSA也可以用來為一個消息署名。假如Alice想給Bob傳遞一個署名的消息的話,那么她可以為她的消息計算一個散列值(Message digest),然后用她的私鑰加密這個散列值并將這個“署名”加在消息的后面。這個消息只有用她的公鑰才能被解密。Bob獲得這個消息后可以用Alice的公鑰解密這個散列值,然后將這個數(shù)據(jù)與他自己為這個消息計算的散列值相比較。假如兩者相符的話,那么他就可以知道發(fā)信人持有甲的密鑰,以及這個消息在傳播路徑上沒有被篡改過。
安全
假設偷聽者乙獲得了甲的公鑰N{\displaystyle N}和e{\displaystyle e}以及丙的加密消息c{\displaystyle c},但她無法直接獲得甲的密鑰d{\displaystyle d}。要獲得d{\displaystyle d},最簡單的方法是將N{\displaystyle N}分解為p{\displaystyle p}和q{\displaystyle q},這樣她可以得到同余方程de=1(mod(p? ? -->1)(q? ? -->1)){\displaystyle de=1(\mathrm {mod} (p-1)(q-1))}并解出d{\displaystyle d},然后代入解密公式
導出n(破密)。但至今為止還沒有人找到一個多項式時間的算法來分解一個大的整數(shù)的因子,同時也還沒有人能夠證明這種算法不存在(見因數(shù)分解)。
至今為止也沒有人能夠證明對N{\displaystyle N}進行因數(shù)分解是唯一的從c{\displaystyle c}導出n{\displaystyle n}的方法,但今天還沒有找到比它更簡單的方法。(至少沒有公開的方法。)
因此今天一般認為只要N{\displaystyle N}足夠大,那么黑客就沒有辦法了。
假如N{\displaystyle N}的長度小于或等于256位,那么用一臺個人電腦在幾個小時內(nèi)就可以分解它的因子了。1999年,數(shù)百臺電腦合作分解了一個512位長的N{\displaystyle N}。今天對N{\displaystyle N}的要求是它至少要1024位長。
1994年彼得·秀爾(Peter Shor)證明一臺量子計算機可以在多項式時間內(nèi)進行因數(shù)分解。假如量子計算機有朝一日可以成為一種可行的技術的話,那么秀爾的算法可以淘汰RSA和相關的派生算法。(即依賴于分解大整數(shù)困難性的加密算法)
假如有人能夠找到一種有效的分解大整數(shù)的算法的話,或者假如量子計算機可行的話,那么在解密和制造更長的鑰匙之間就會展開一場競爭。但從原理上來說RSA在這種情況下是不可靠的。
實現(xiàn)細節(jié)
密鑰生成
首先要使用概率算法來驗證隨機產(chǎn)生的大的整數(shù)是否質(zhì)數(shù),這樣的算法比較快而且可以消除掉大多數(shù)非質(zhì)數(shù)。假如有一個數(shù)通過了這個測試的話,那么要使用一個精確的測試來保證它的確是一個質(zhì)數(shù)。
除此之外這樣找到的p{\displaystyle p}和q{\displaystyle q}還要滿足一定的要求,首先它們不能太靠近,此外p? ? -->1{\displaystyle p-1}或q? ? -->1{\displaystyle q-1}的因子不能太小,否則的話N{\displaystyle N}也可以被很快地分解。
此外尋找質(zhì)數(shù)的算法不能給攻擊者任何信息,這些質(zhì)數(shù)是怎樣找到的,尤其產(chǎn)生隨機數(shù)的軟件必須非常好。要求是隨機和不可預測。這兩個要求并不相同。一個隨機過程可能可以產(chǎn)生一個不相關的數(shù)的系列,但假如有人能夠預測出(或部分地預測出)這個系列的話,那么它就已經(jīng)不可靠了。比如有一些非常好的隨機數(shù)算法,但它們都已經(jīng)被發(fā)表,因此它們不能被使用,因為假如一個攻擊者可以猜出p{\displaystyle p}和q{\displaystyle q}一半的位的話,那么他們就已經(jīng)可以輕而易舉地推算出另一半。
此外密鑰d{\displaystyle d}必須足夠大,1990年有人證明假如p{\displaystyle p}大于q{\displaystyle q}而小于2q{\displaystyle 2q}(這是一個很經(jīng)常的情況)而dN14{\displaystyle d ,那么從N{\displaystyle N}和e{\displaystyle e}可以很有效地推算出d{\displaystyle d}。此外e=2{\displaystyle e=2}永遠不應該被使用。
速度
比起DES和其它對稱算法來說,RSA要慢得多。實際上Bob一般使用一種對稱算法來加密他的信息,然后用RSA來加密他的比較短的對稱密碼,然后將用RSA加密的對稱密碼和用對稱算法加密的消息送給Alice。
密鑰分配
和其它加密過程一樣,對RSA來說分配公鑰的過程是非常重要的。分配公鑰的過程必須能夠抵擋中間人攻擊。假設Eve交給Bob一個公鑰,并使Bob相信這是Alice的公鑰,并且她可以截下Alice和Bob之間的信息傳遞,那么她可以將她自己的公鑰傳給Bob,Bob以為這是Alice的公鑰。Eve可以將所有Bob傳遞給Alice的消息截下來,將這個消息用她自己的密鑰解密,讀這個消息,然后將這個消息再用Alice的公鑰加密后傳給Alice。理論上Alice和Bob都不會發(fā)現(xiàn)Eve在偷聽他們的消息。今天人們一般用可靠的第三方機構簽發(fā)證書來防止這樣的攻擊。
時間攻擊
1995年有人提出了一種非常意想不到的攻擊方式:假如Eve對Alice的硬件有充分的了解,而且知道它對一些特定的消息加密時所需要的時間的話,那么她可以很快地推導出d。這種攻擊方式之所以會成立,主要是因為在進行加密時所進行的模指數(shù)運算是一個比特一個比特進行的,而比特為1所花的運算比比特為0的運算要多很多,因此若能得到多組消息與其加密時間,就會有機會可以反推出私鑰的內(nèi)容。
典型密鑰長度
1997年后開發(fā)的系統(tǒng),用戶應使用1024位密鑰,證書認證機構應用2048位或以上。
已公開的或已知的攻擊方法
針對RSA最流行的攻擊一般是基于大數(shù)因數(shù)分解。1999年,RSA-155 (512 bits)被成功分解,花了五個月時間(約8000 MIPS年)和224 CPU hours在一臺有3.2G中央內(nèi)存的Cray C916計算機上完成。
RSA-158表示如下:
2009年12月12日,編號為RSA-768(768 bits, 232 digits)數(shù)也被成功分解。這一事件威脅了現(xiàn)通行的1024-bit密鑰的安全性,普遍認為用戶應盡快升級到2048-bit或以上。
RSA-768表示如下:
相關條目
公開密鑰加密
量子計算機
秀爾算法
免責聲明:以上內(nèi)容版權歸原作者所有,如有侵犯您的原創(chuàng)版權請告知,我們將盡快刪除相關內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價值
- 一般般
- 沒價值
{{item.userName}} 舉報
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評論 {{curReplyId == item.id ? '取消回復' : '回復'}}
{{_reply.userName}} 舉報
{{_reply.time}}