公開金鑰密碼系統及RSA公開金鑰演算法
摘要:
本文簡單介紹了公開密鑰密碼系統的思想和特點,並具體介紹了RSA演算法的理論基礎,工作原理和具體實現過程,並通過一個簡單例子說明了該演算法是如何?。在本文的最後,概括說明了RSA演算法目前存在的一些缺點和解決方案。
關鍵詞: 公開金鑰密碼體制 , 公開金鑰 , 私密金鑰 , RSA
中圖分類號:TP309.7
§1引言
隨著電腦連網的逐步實現,Internet前景越來越美好,全球經濟發展正在進入資訊經濟時代,知識經濟初見端倪。電腦資訊的保密問題顯得越來越重要,無論是個人資訊通訊還是電子商務發展,都迫切需要保證Internet網上資訊傳輸的安全,需要保證資訊安全。資訊安全技術是一門綜合學科,它涉及資訊理論、電腦科學和密碼學等多方面知識,它的主要任務是研究電腦系統和通訊網路內資訊的保護方法以實現系統內資訊的安全、保密、真實和完整。其中,資訊安全的核心是密碼技術。密碼技術是集數學、電腦科學、電子與通訊等諸多學科於一身的交叉學科。它不僅能夠保證機密性資訊的加密,而且能夠實現數位簽章、身分識別驗證、系統安全等功能。是現代化發展的重要科學之一。本文將對公開金鑰密碼系統及該系統中目前最廣泛流行的RSA 演算法做一些簡單介紹。
§2公開金鑰密碼系統
要說明公開金鑰密碼系統,首先來瞭解一下不同的密碼編譯演算法:目前的密碼編譯演算法按密鑰方式可分為單鑰密碼演算法和公開金鑰密碼演算法。
2.1. 單鑰密碼
又稱對稱式密碼,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的密鑰,資訊的寄件者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通訊雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。
單鑰密碼系統的安全性依賴於以下兩個因素:第一,密碼編譯演算法必須是足夠強的,僅僅基於密文本身去解密資訊在實踐上是不可能的;第二,加密方法的安全性依賴於密鑰的秘密性,而不是演算法的秘密性,因此,我們沒有必要確保演算法的秘密性(事實上,現實中使用的很多單鑰密碼系統的演算法都是公開的),但是我們一定要保證密鑰的秘密性。
從單鑰密碼的這些特點我們容易看出它的主要問題有兩點:第一,密鑰量問題。在單鑰密碼系統中,每一對通訊者就需要一對密鑰,當使用者增加時,必然會帶來密鑰量的成倍增長,因此在網路通訊中,大量密鑰的產生﹑存放和分配將是一個難以解決的問題。第二,密鑰分發問題。單鑰密碼系統中,加密的安全性完全依賴於對密鑰的保護,但是由於通訊雙方使用的是相同的密鑰,人們又不得不相互交流密鑰,所以為了保證安全,人們必須使用一些另外的安全通道來分發密鑰,例如用專門的信使來傳送密鑰,這種做法的代價是相當大的,甚至可以說是非常不現實的,尤其在電腦網路環境下,人們使用網路傳送加密的檔案,卻需要另外的安全通道來分發密鑰,顯而易見,這是非常不智是甚至是荒謬可笑的。
2.2 公開金鑰密碼
正因為單鑰密碼系統存在如此難以解決的缺點,發展一種新的﹑更有效﹑更先進的密碼體制顯得更為迫切和必要。在這種情況下,出現了一種新的公開金鑰密碼體制,它突破性地解決了困擾著無數科學家的密鑰分發問題,事實上,在這種體制中,人們甚至不用分發需要嚴格保密的密鑰,這次突破同時也被認為是密碼史上兩千年來自單碼替代密碼發明以後最偉大的成就。
這一全新的思想是本世紀70年代,美國斯坦福大學的兩名學者Diffie和Hellman提出的,該體制與單鑰密碼最大的不同是:
在公開金鑰密碼系統中,加密和解密使用的是不同的密鑰(相對於對稱金鑰,人們把它叫做非對稱金鑰),這兩個密鑰之間存在著相互依存關係:即用其中任一個祕密金鑰加密的資訊只能用另一個密鑰進行解密。這使得通訊雙方無需事先交換密鑰就可進行保密通訊。其中加密金鑰和演算法是對外公開的,人人都可以通過這個祕密金鑰加密檔案然後發給收信者,這個加密金鑰又稱為公開金鑰;而收信者收到加密檔案後,它可以使用他的解密密鑰解密,這個密鑰是由他自己私人掌管的,並不需要分發,因此又成稱為私密金鑰,這就解決了密鑰分發的問題。
為了說明這一思想,我們可以考慮如下的類比:
兩個在不安全通道中通訊的人,假設為Alice(收信者)和Bob(發信者),他們希望能夠安全的通訊而不被他們的敵手Oscar破壞。Alice 想到了一種辦法,她使用了一種鎖(相當於公開金鑰),這種鎖任何人只要輕輕一按就可以鎖上,但是只有Alice的鑰匙(相當於私密金鑰)才能夠開啟。然後Alice 對外發送無數把這樣的鎖,任何人比如Bob想給她寄信時,只需找到一個箱子,然後用一把Alice的鎖將其鎖上再寄給Alice,這時候任何人(包括Bob自己)除了擁有鑰匙的Alice,都不能再開啟箱子,這樣即使Oscar能找到Alice的鎖,即使Oscar能在通訊過程中截獲這個箱子,沒有Alice的鑰匙他也不可能開啟箱子,而Alice的鑰匙並不需要分發,這樣 Oscar也就無法得到這把“私人密鑰”。
從以上的介紹可以看出,公開金鑰密碼體制的思想並不複雜,而實現它的關鍵問題是如何確定公開金鑰和私密金鑰及加/解密的演算法,也就是說如何找到“Alice的鎖和鑰匙”的問題。我們假設在這種體制中, PK是公開資訊,用作加密金鑰,而SK需要由使用者自己保密,用作解密密鑰。密碼編譯演算法E和解密演算法D也都是公開的。雖然SK與PK是成對出現,但卻不能根據PK計算出SK。它們須滿足條件:
① 加密金鑰PK對明文X加密後,再用解密密鑰SK解密,即可恢複出明文,或寫為:DSK(EPK(X))=X
② 加密金鑰不能用來解密,即DPK(EPK(X))≠X
③ 在電腦上可以容易地產產生對的PK和SK。
④ 從已知的PK實際上不可能推匯出SK。
⑤ 加密和解密的運算可以對調,即:EPK(DSK(X))=X
從上述條件可看出,公開密鑰密碼體制下,加密金鑰不等於解密密鑰。加密金鑰可對外公開,使任何使用者都可將傳送給此使用者的資訊用公開祕密金鑰加密發送,而該使用者唯一儲存的私人密鑰是保密的,也只有它能將密文複原、解密。雖然解密密鑰理論上可由加密金鑰推算出來,但這種演算法設計在實際上是不可能的,或者雖然能夠推算出,但要花費很長的時間而成為不可行的。所以將加密金鑰公開也不會危害密鑰的安全。
這種體制思想是簡單的,但是,如何找到一個適合的演算法來實現這個系統卻是一個真正困擾密碼學家們的難題,因為既然Pk和SK是一對存在著相互關係的密鑰,那麼從其中一個推匯出另一個就是很有可能的,如果敵手Oscar能夠從PK推匯出SK,那麼這個系統就不再安全了。因此如何找到一個合適的演算法產生合適的Pk和SK,並且使得從PK不可能推匯出SK,正是迫切要求輸入密碼學家們解決的一道難題。這個難題甚至使得公開金鑰密碼系統的發展停滯了很長一段時間。
為瞭解決這個問題,密碼學家們考慮了數學上的陷門單向函數,下面,我們可以給出它的非正式定義:
Alice的公開加密函數應該是容易計算的,而計算其逆函數(即解密函數)應該是困難的(對於除Alice以外的人)。許多形式為Y=f(x)的函數,對於給定的自變數x值,很容易計算出函數Y的值;而由給定的Y值,在很多情況下依照函數關係f (x)計算x值十分困難。這樣容易計算但難於求逆的函數,通常稱為單向函數。在加密過程中,我們希望加密函數E為一個單項的單射函數,以便可以解密。雖然目前還沒有一個函數能被證明是單向的,但是有很多單射函數被認為是單向的。
例如,有如下一個函數被認為是單向的,假定n為兩個大素數p和q的乘積,b為一個正整數,那麼定義f :
f (x )= x b mod n
(如果gcd(b,φ(n))=1,那麼事實上這就是我們以下要說的RSA加密函數)
如果我們要構造一個公開金鑰密碼體制,僅給出一個單向的單射函數是不夠的。從Alice的觀點來看,並不需要E是單向的,因為它需要用有效方式解密所收到的資訊。因此,Alice應該擁有一個陷門,其中包含容易求出E的你函數的秘密資訊。也就是說,Alice可以有效解密,因為它有額外的秘密知識,即SK,能夠提供給你解密函數D。因此,我們稱一個函數為一個陷門單向函數,如果它是一個單向函數,並在具有特定陷門的知識後容易求出其逆。
考慮上面的函數 f (x) = xb mod n 。我們能夠知道其逆函數f -1有類似的形式 f (x ) = xa mod n,對於合適的取值 a。陷門就是利用 n的因子分解,有效算出正確的指數a(對於給定的b)。
為方便起見,我們把特定的某類陷門單向函數計為?。那麼隨機選取一個函數f 屬於?,作為公開加密函數;其逆函數f -1是秘密解密函數。那麼公開金鑰密碼體制就能夠實現了。
根據以上關於陷門單向函數的思想,學者們提出了許多種公開金鑰加密的方法,它們的安全性都是基於複雜的數學難題。根據所基於的數學難題,至少有以下三類系統目前被認為是安全和有效:大整數因子分解系統(代表性的有RSA)、橢園曲線離散對數系統(ECC)和離散對數系統 (代表性的有DSA)。
§3 RSA演算法
3.1 簡介
當前最著名、應用最廣泛的公開金鑰系統RSA是在1978年,由美國麻省理工學院(MIT)的Rivest、Shamir和Adleman在題為《獲得數位簽章和公開鑰密碼系統的方法》的論文中提出的。它是一個基於數論的非對稱(公開鑰)密碼體制,是一種分組密碼體制。其名稱來自於三個發明者的姓名首字母。 它的安全性是基於大整數素因子分解的困難性,而大整數因子分解問題是數學上的著名難題,至今沒有有效方法予以解決,因此可以確保RSA演算法的安全性。RSA系統是公開金鑰系統的最具有典型意義的方法,大多數使用公開金鑰密碼進行加密和數位簽章的產品和標準使用的都是RSA演算法。
RSA演算法是第一個既能用於資料加密也能用於數位簽章的演算法,因此它為公用網路上資訊的加密和鑒別提供了一種基本的方法。它通常是先產生一對RSA 密鑰,其中之一是保密密鑰,由使用者儲存;另一個為公開密鑰,可對外公開,甚至可在網路伺服器中註冊,人們用公開金鑰加密檔案發送給個人,個人就可以用私密金鑰解密接受。為提高保密強度,RSA密鑰至少為500位長,一般推薦使用1024位。
該演算法基於下面的兩個事實,這些事實保證了RSA演算法的安全有效性:
1) 已有確定一個數是不是質數的快速演算法;
2) 尚未找到確定一個合數的質因子的快速演算法。
3.2 工作原理
1) 任意選取兩個不同的大質數p和q,計算乘積r=p*q;
2) 任意選取一個大整數e,e與(p-1)*(q-1)互質,整數e用做加密金鑰。注意:e的選取是很容易的,例如,所有大於p和q的質數都可用。
3) 確定解密密鑰d: d * e = 1 modulo(p - 1)*(q - 1) 根據e、p和q可以容易地計算出d。
4) 公開整數r和e,但是不公開d;
5) 將明文P (假設P是一個小於r的整數)加密為密文C,計算方法為:
C = Pe modulo r
6) 將密文C解密為明文P,計算方法為:
P = Cd modulo r
然而只根據r和e(不是p和q)要計算出d是不可能的。因此,任何人都可對明文進行加密,但只有授權使用者(知道d)才可對密文解密。
3.3 簡單一實例
為了說明該演算法的工作過程,我們下面給出一個簡單例子,顯然我們在這隻能取很小的數字,但是如上所述,為了保證安全,在實際應用上我們所用的數字要大的多得多。
例:選取p=3, q=5,則r=15,(p-1)*(q-1)=8。選取e=11(大於p和q的質數),通過d * 11 = 1 modulo 8,計算出d =3。
假定明文為整數13。則密文C為
C = Pe modulo r
= 1311 modulo 15
= 1,792,160,394,037 modulo 15
= 7
複原明文P為:
P = Cd modulo r
= 73 modulo 15
= 343 modulo 15
= 13
因為e和d互逆,公開祕密金鑰加密方法也允許採用這樣的方式對加密資訊進行"簽名",以便接收方能確定簽名不是偽造的。
假設A和B希望通過公開祕密金鑰加密方法進行資料轉送,A和B分別公開密碼編譯演算法和相應的密鑰,但不公開解密演算法和相應的密鑰。A和B的密碼編譯演算法分別是ECA和ECB,解密演算法分別是DCA和DCB,ECA和DCA互逆,ECB和DCB互逆。 若A要向B發送明文P,不是簡單地發送ECB(P),而是先對P施以其解密演算法DCA,再用密碼編譯演算法ECB對結果加密後發送出去。
密文C為:
C = ECB(DCA(P))
B收到C後,先後施以其解密演算法DCB和密碼編譯演算法ECA,得到明文P:
ECA(DCB(C))
= ECA(DCB(ECB(DCA(P))))
= ECA(DCA(P)) /*DCB和ECB相互抵消*/
= P /*DCB和ECB相互抵消*/
這樣B就確定報文確實是從A發出的,因為只有當加密過程利用了DCA演算法,用ECA才能獲得P,只有A才知道DCA演算法,沒 有人,即使是B也不能偽造A的簽名。
3.4 優缺點
3.4.1優點
RSA演算法是第一個能同時用於加密和數位簽章的演算法,也易於理解和操作。RSA是被研究得最廣泛的公開金鑰演算法,從提出到現在已近二十年,經曆了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公開金鑰方案之一。該演算法的加密金鑰和密碼編譯演算法分開,使得密鑰分配更為方便。它特別符合電腦網路環境。對於 網上的大量使用者,可以將加密金鑰用電話簿的方式印出。如果某使用者想與另一使用者進行保密通訊,只需從公開金鑰簿上查出對方的加密金鑰,用它對所傳送的資訊加密發出即可。對方收到資訊後,用僅為自己所知的解密密鑰將資訊脫密,瞭解報文的內容。由此可看出,RSA演算法解決了大量網路使用者密鑰管理的難題,這是公開金鑰密碼系統相對於對稱密碼系統最突出的優點。
3.4.2缺點
1)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。
2)安全性, RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價,而且密碼學界多數人士傾向於因子分解不是NPC問題。目前,人們已能分解140多個十進位位的大素數,這就要求使用更長的密鑰,速度更慢;另外,目前人們正在積極尋找攻擊RSA的方法,如選擇密文攻擊,一般攻擊者是將某一資訊作一下偽裝(Blind),讓擁有私密金鑰的實體簽署。然後,經過計算就可得到它所想要的資訊。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:
( XM )d = Xd *Md mod n
前面已經提到,這個固有的問題來自於公開金鑰密碼系統的最有用的特徵--每個人都能使用公開金鑰。但從演算法上無法解決這一問題,主要措施有兩條:一條是採用好的公開金鑰協議,保證工作過程中實體不對其他實體任意產生的資訊解密,不對自己一無所知的資訊簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way Hash Function對文檔作HASH處理,或同時使用不同的簽名演算法。除了利用公用模數,人們還嘗試一些利用解密指數或φ(n)等等攻擊.
3)速度太慢,由於RSA 的分組長度太大,為保證安全性,n 至少也要 600 bitx以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利於資料格式的標準化。目前,SET(Secure Electronic Transaction)協議中要求CA採用2048位元長的密鑰,其他實體使用1024位元的密鑰。為了速度問題,目前人們廣泛使用單,公開金鑰密碼結合使用的方法,優缺點互補:單鑰密碼加密速度快,人們用它來加密較長的檔案,然後用RSA來給檔案祕密金鑰加密,極好的解決了單鑰密碼的密鑰分發問題。
§4結束語
目前,日益激增的電子商務和其它網際網路應用需求使公開金鑰體系得以普及,這些需求量主要包括對伺服器資源的存取控制和對電子商務交易的保護,以及權利保護、個人隱私、無線交易和內容完整性(如保證新聞報道或股票行情的真實性)等方面。公開金鑰技術發展到今天,在市場上明顯的發展趨勢就是PKI與作業系統的整合,PKI是“Public Key Infrastructure”的縮寫,意為“公開金鑰基礎設施”。公開金鑰體制廣泛地用於CA認證、數位簽章和金鑰交換等領域。
公開金鑰加密演算法中使用最廣的是RSA。RSA演算法研製的最初理念與目標是努力使互連網安全可靠,旨在解決DES演算法秘密密鑰的利用公開通道傳輸分發的難題。而實際結果不但很好地解決了這個難題;還可利用RSA來完成對電文的數位簽章以抗對電文的否認與抵賴;同時還可以利用數位簽章較容易地發現攻擊者對電文的非法篡改,以保護資料資訊的完整性。目前為止,很多種加密技術採用了RSA演算法,該演算法也已經在互連網的許多方面得以廣泛應用,包括在安全介面層(SSL)標準(該標準是網路瀏覽器建立安全的互連網串連時必須用到的)方面的應用。此外,RSA加密系統還可應用於智能IC卡和網路安全產品。
但目前RSA演算法的專利期限即將結束,取而代之的是基於橢圓曲線的密碼方案(ECC演算法)。較之於RSA演算法,ECC有其相對優點,這使得ECC的特性更適合當今電子商務需要快速反應的發展潮流。此外,一種全新的量子密碼也正在發展中。
至於在實際應用中應該採用何種密碼編譯演算法則要結合具體應用環境和系統,不能簡單地根據其加密強度來做出判斷。因為除了密碼編譯演算法本身之外,密鑰合理分配、加密效率與現有系統的結合性以及投入產出分析都應在實際環境中具體考慮。加密技術隨著網路的發展更新,將有更安全更易於實現的演算法不斷產生,為資訊安全提供更有力的保障。今後,加密技術會何去何從,我們將拭目以待。
參考文獻:
[1] Douglas R.Stinson.《密碼學原理與實踐》.北京:電子工業出版社,2003,2:131-132
[2] 西蒙.辛格.《密碼故事》.海口:海南出版社,2001,1:271-272
[3] 嬴政天下.密碼編譯演算法之RSA演算法.http://soft.winzheng.com/infoView/Article_296.htm,2003
[4] 加密與數位簽章.http://www.njt.cn/yumdq/dzsw/a2.htm
[5] 駭客中級教程系列之十.http://www.qqorg.i-p.com/jiaocheng/10.html
public key cipher system and RSA public key algorithm
Abstract
The paper introduce the idea and character of the Public Key cryptography in a simple way, especially expound the theoretical foundation, the working principle and the concrete realizing procedure of the RSA algorithm. Besides that, it accounts for how the algorithm realize through a simple example. In the end of this article, some weakness which exist up to now are given out with their solution.
Key Word Public Key cryptography , Public Key , Private Key, RSA