常用的加解密技術(1)

常用的加密解密技術(1)

【數字簽名算法分析與Hash簽名】

序:這篇文章我用了近一週的時間完成,其中涉及到的RSA算法已經在上一篇《公鑰密碼體系》中詳細的介紹過,目前數字簽名中人們使用很多的還是512位與1024位的RSA算法。

摘要: 數字簽字和認證機構是電子商務的核心技術。數字簽名作爲目前Internet中電子商務重要的技術,不斷地進行改進,標準化。本文從數字簽名的意義出發,詳細介紹了數字簽名中涉及到的內容與算法,並自行結合進行改進。

關鍵詞:Internet 公鑰加密 Hash函數 電子商務 加密 數字簽名 

數字簽名簡介

我們對加解密算法已經有了一定理解,可以進一步討論"數字簽名"(注意不要與數字認證混淆)的問題了,即如何給一個計算機文件進行簽字。數字簽字可以用對稱算法實現,也可以用公鑰算法實現。但前者除了文件簽字者和文件接受者雙方,還需要第三方認證,較麻煩;通過公鑰加密算法的實現方法,由於用祕密密鑰加密的文件,需要靠公開密鑰來解密,因此這可以作爲數字簽名,簽名者用祕密密鑰加密一個簽名(可以包括姓名、證件號碼、短信息等信息),接收人可以用公開的、自己的公開密鑰來解密,如果成功,就能確保信息來自該公開密鑰的所有人。

公鑰密碼體制實現數字簽名的基本原理很簡單,假設A要發送一個電子文件給B,A、B雙方只需經過下面三個步驟即可:

1. A用其私鑰加密文件,這便是簽字過程

2. A將加密的文件送到B

3. B用A的公鑰解開A送來的文件

這樣的簽名方法是符合可靠性原則的。即:

簽字是可以被確認的,
簽字是無法被僞造的,
簽字是無法重複使用的,
文件被簽字以後是無法被篡改的,
簽字具有無可否認性,
數字簽名就是通過一個單向函數對要傳送的報文進行處理得到的用以認證報文來源並覈實報文是否發生變化的一個字母數字串。用這幾個字符串來代替書寫簽名或印章,起到與書寫簽名或印章同樣的法律效用。國際社會已開始制定相應的法律、法規,把數字簽名作爲執法的依據。

數字簽名的實現方法

實現數字簽名有很多方法,目前數字簽名採用較多的是公鑰加密技術,如基於RSA Data Security公司的PKCS(Public KeyCryptography Standards)、DSA(Digital SignatureAlgorithm)、x.509、PGP(Pretty GoodPrivacy)。1994年美國標準與技術協會公佈了數字簽名標準(DSS)而使公鑰加密技術廣泛應用。同時應用散列算法(Hash)也是實現數字簽名的一種方法。

非對稱密鑰密碼算法進行數字簽名

算法的含義:

非對稱密鑰密碼算法使用兩個密鑰:公開密鑰和私有密鑰,分別用於對數據的加密和解密,即如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能進行解密;如果用私有密鑰對數據進行加密,則只有用對應的公開密鑰才能解密。

使用公鑰密碼算法進行數字簽名通用的加密標準有: RSA,DSA,Diffie-Hellman等。

簽名和驗證過程:

發送方(甲)首先用公開的單向函數對報文進行一次變換,得到數字簽名,然後利用私有密鑰對數字簽名進行加密後附在報文之後一同發出。

接收方(乙)用發送方的公開密鑰對數字簽名進行解密交換,得到一個數字簽名的明文。發送方的公鑰可以由一個可信賴的技術管理機構即認證中心(CA)發佈的。

接收方將得到的明文通過單向函數進行計算,同樣得到一個數字簽名,再將兩個數字簽名進行對比,如果相同,則證明簽名有效,否則無效。

這種方法使任何擁有發送方公開密鑰的人都可以驗證數字簽名的正確性。由於發送方私有密鑰的保密性,使得接受方既可以根據結果來拒收該報文,也能使其無法僞造報文簽名及對報文進行修改,原因是數字簽名是對整個報文進行的,是一組代表報文特徵的定長代碼,同一個人對不同的報文將產生不同的數字簽名。這就解決了銀行通過網絡傳送一張支票,而接收方可能對支票數額進行改動的問題,也避免了發送方逃避責任的可能性。

對稱密鑰密碼算法進行數字簽名

算法含義

對稱密鑰密碼算法所用的加密密鑰和解密密鑰通常是相同的,即使不同也可以很容易地由其中的任意一個推導出另一個。在此算法中,加、解密雙方所用的密鑰都要保守祕密。由於計算機速度而廣泛應用於大量數據如文件的加密過程中,如RD4和DES,用IDEA作數字簽名是不提倡的。

使用分組密碼算法數字簽名通用的加密標準有:DES,Tripl-DES,RC2,RC4,CAST等。

簽名和驗證過程

Lamport發明了稱爲Lamport-Diffle的對稱算法:利用一組長度是報文的比特數(n)兩倍的密鑰A,來產生對簽名的驗證信息,即隨機選擇2n個數B,由簽名密鑰對這2n個數B進行一次加密交換,得到另一組2n個數C。

發送方從報文分組M的第一位開始,依次檢查M的第I位,若爲0時,取密鑰A的第i位,若爲1則取密鑰A的第i+1位;直至報文全部檢查完畢。所選取的n個密鑰位形成了最後的簽名。

接受方對簽名進行驗證時,也是首先從第一位開始依次檢查報文M,如果M的第i位爲0時,它就認爲簽名中的第i組信息是密鑰A的第i位,若爲1則爲密鑰A的第i+1位;直至報文全部驗證完畢後,就得到了n個密鑰,由於接受方具有發送方的驗證信息C,所以可以利用得到的n個密鑰檢驗驗證信息,從而確認報文是否是由發送方所發送。

這種方法由於它是逐位進行簽名的,只有有一位被改動過,接受方就得不到正確的數字簽名,因此其安全性較好,其缺點是:簽名太長(對報文先進行壓縮再簽名,可以減少簽名的長度);簽名密鑰及相應的驗證信息不能重複使用,否則極不安全。

結合對稱與非對稱算法的改進

對稱算法與非對稱算法各有利弊,所以結合各自的優缺點進行改進,可以用下面的模塊進行說明:

Hash算法進行數字簽名

Hash算法也稱作散列算法或報文摘要,Hash算法將在數字簽名算法中詳細說明。

Hash算法數字簽字通用的加密標準有: SHA-1,MD5等。

數字簽名算法  

數字簽名的算法很多,應用最爲廣泛的三種是:Hash簽名、DSS簽名、RSA簽名。這三種算法可單獨使用,也可綜合在一起使用。數字簽名是通過密碼算法對數據進行加、解密變換實現的,常用的HASH算法有MD2、MD5、SHA-1,用DES算法、RSA算法都可實現數字簽名。但或多或少都有缺陷,或者沒有成熟的標準。

Hash簽名

Hash簽名是最主要的數字簽名方法,也稱之爲數字摘要法(digital digest)、數字指紋法(digital fingerprint)。它與RSA數字簽名是單獨的簽名不同,該數字簽名方法是將數字簽名與要發送的信息緊密聯繫在一起,它更適合於電子商務活動。將一個商務合同的個體內容與簽名結合在一起,比合同和簽名分開傳遞,更增加了可信度和安全性。下面我們將詳細介紹Hash簽名中的函數與算法。

單向函數

單向函數的概念是公開密鑰密碼的核心。儘管它本身並不是一個協議,但對大多數協議來說卻是一個基本結構模塊。

單向函數的概念是計算起來相對容易,但求逆卻非常困難。也就是說,已知x,我們很容易計算f(x)。但已知f(x),卻難於計算出x。在這裏,"難"定義成:即使世界上所有的計算機都用來計算,從f(x)計算出x也要花費數百萬年的時間。

打碎盤子就是一個很好的單向函數的例子。把盤子打碎成數千片碎片是很容易的事情,然而,要把所有這些碎片再拼成爲一個完整的盤子,卻是非常困難的事情。

這聽起來很好,但事實上卻不能證實它的真實性。如果嚴格地按數學定義,我們不能證明單向函數的存在性,同時也還沒有實際的證據能夠構造出單向函數。即使這樣,還是有很多函數看起來和感覺像單向函數:我們能夠有效地計算它們,且至今還不知道有什麼辦法能容易地求出它們的逆。例如,在有限域中x2是很容易計算的,但計算x1/2卻難得多。所以我們假定也儘量構造單向函數存在。

陷門單向函數是有一個祕密陷門的一類特殊單向函數。它在一個方向上易於計算而反方向卻難於計算。但是,如果你知道那個祕密,你也能很容易在另一個方向計算這個函數。也就是說, 已知x,易於計算f(x),而已知f(x),卻難於計算x。然而,有一些祕密信息y,一旦給出f(x)和y,就很容易計算x。

拆開表是很好的單向陷門函數的例子。很容易把表拆成數百片小片,把這些小片組裝成能夠工作的表是非常困難的。然而,通過祕密信息(表的裝配指令),就很容易把表還原。

單向Hash函數

單向Hash函數有很多名字:壓縮函數、縮短函數、消息摘要、指紋、密碼校驗和、信息完整性檢驗(DIC)、操作檢驗碼(MDC)。不管你怎麼叫,它是現代密碼學的中心。單向Hash函數是許多協議的另一個結構模塊。

Hash函數長期以來一直在計算機科學中使用,無論從數學上或別的角度看,Hash函數就是把可變輸入長度串(叫做預映射,Pre-image)轉換成固定長度(經常更短)輸出串(叫做hash值)的一種函數。簡單的Hash函數就是對預映射的處理,並且返回由所有輸入字節異或組成的一字節。

這兒的關鍵就是採集預映射的指紋:產生一個值,這個值能夠指出候選預映射是否與真實的預映射有相同的值。因爲Hash函數是典型的多到一的函數,我們不能用它們來確定兩個串一定相同,但我們可用它來得到準確性的合理保證。

單向Hash函數是在一個方向上工作的Hash函數,從預映射的值很容易計算其Hash值,但要產生一個預映射的值使其Hash值等於一個特殊值卻是很難的。好的hash函數也是無衝突的:難於產生兩個預映射的值,使他們的hash值相同。

Hash函數是公開的,對處理過程不用保密。單向hash函數的安全性是它的單向性。無論怎麼看,輸出不依賴於輸入。預映射單個比特的改變,平均而言,將引起hash值中一半的比特改變。已知一個hash值,要找到預映射的值,使它的hash值等於已知的hash值在計算上是不可行的。

哈希函數,即對於任意長度的信息m,經過哈希函數運算後,壓縮後固定長度的數,比如64比特HASH函數的特殊要求是:

1. 已知哈希函數的輸出,要求它的輸入是困難的,即已知c=Hash(m),求m是困難的。這表現了函數的單向性。

2. 已知m,計算Hash(m)是容易的。這表現了函數的快速性。

3. 已知,構造m2使Hash(m2)=c1是困難的。這是函數的抗碰撞性。

4. c=Hash(m),c的每一比特都與m的每一比特有關,並有高度敏感性。即每改變m的一比特,都將對c產生明顯影響。這就是函數的雪崩性。

5. 作爲一種數字簽名,還要求哈希函數除了信息m自身之外,應該基於發信方的祕密信息對信息m進行確認。

6. 接受的輸入m數據沒有長度限制;對輸入任何長度的m數據能夠生成該輸入報文固定長度的輸出;

曾有數家統計計算結果表明,如hash(m)的長度爲128位(bit)時,則任意兩個分別爲M1.M2的輸入報文具有完全相同的h(m)的概率爲10-24,即近於零的重複概率。它較人類指紋的重複概率10-19還要小5個數量級。而當我們取hash(m)爲384(bit)乃至1024(bit)時,則更是不大可能重複了。

另外,如輸入報文M1與輸入報文M2全等,則有h(m1)與h(m2)全等,如只將M2或M1中的某任意一位(bit)改變了,其結果將導致h(m1)與h(m2)中有一半左右對應的位(bit)的值都不相同了。這種發散特性使電子數字簽名很容易發現(驗證簽名)輸入報文的關鍵位的值被人篡改了。

數字摘要(digitaldigest)加密方法亦稱安全Hash編碼法(SHA:SecureHashAlgorithm)或MD5(MDstandardforMessageDigest),由RonRivest設計。該編碼法採用單向Hash函數將需加密的明文"摘要"成一串128bit的密文,這一串密文亦稱爲數字指紋(FingerPrint),它有固定的長度,且不同的明文摘要必定一致。這樣這串摘要使可成爲驗證明文是否是"真身"的"指紋"了。

Hash簽名不屬於強計算密集型算法,應用較廣泛。很多少量現金付款系統,如DEC的Millicent和CyberCash的CyberCoin等都使用Hash簽名。使用較快的算法,可以降低服務器資源的消耗,減輕中央服務器的負荷。Hash的主要侷限是接收方必須持有用戶密鑰的副本以檢驗簽名,因爲雙方都知道生成簽名的密鑰,較容易攻破,存在僞造簽名的可能。如果中央或用戶計算機中有一個被攻破,那麼其安全性就受到了威脅。

DSS和RSA簽名

DSS和RSA採用了公鑰算法。

Digital SignatureAlgorithm(DSA)是Schnorr和ElGamal簽名算法的變種,被美國NIST作爲DSS(DigitalSignatureStandard)數字簽名標準。DSS是由美國國家標準化研究院和國家安全局共同開發的。由於它是由美國政府頒佈實施的,主要用於與美國政府做生意的公司,其他公司則較少使用,它只是一個簽名系統,而且美國政府不提倡使用任何削弱政府竊聽能力的加密軟件,認爲這才符合美國的國家利益。算法中應用了下述參數:

p:L bits長的素數。L是64的倍數,範圍是512到1024;
q:是p - 1的160bits的素因子;
g:g = h^((p-1)/q) mod p,h滿足h < p - 1, h^((p-1)/q) mod p >; 1;
x:祕密密鑰,正整數,x < q;
y:y = g^x mod p ,( p, q, g, y )爲公鑰;
k爲隨機數,0〈k〈q;
H( x ):One-Way Hash函數。
DSS中選用SHA( Secure Hash Algorithm )。 p, q, g可由一組用戶共享,但在實際應用中,使用公共模數可能會帶來一定的威脅。 簽名過程如下:

1. P產生隨機數k,k < q;

2. P計算 r = ( g^k mod p ) mod q

s = ( k^(-1) (H(m) + xr)) mod q

驗證過程: 簽名結果是( m, r, s )。

3. 驗證時計算 w = s^(-1)mod q

u1 = ( H( m ) * w ) mod q

u2 = ( r * w ) mod q

v = (( g^u1 * y^u2 ) mod p ) mod q

若v = r,則認爲簽名有效。

DSA位數僅爲160位,沒有太大的意義,也存在系統平臺不兼容的問題,而且DSA是基於整數有限域離散對數難題的,安全強度和速度均低於RSA算法。DSA的一個重要特點是兩個素數公開,這樣,當使用別人的p和q時,即使不知道私鑰,你也能確認它們是否是隨機產生的,還是作了手腳。RSA算法卻作不到。DSA算法的安全性也依賴於有限域上的離散對數問題,其優點是不涉及專利問題。

其中H(x)可選擇美國推薦的標準算法SHA或MD5等安全散列算法。其中MD5算法在本論壇中已有介紹。

RSA是最流行的一種加密標準,許多產品的內核中都有RSA的軟件和類庫,早在Web飛速發展之前,RSA數據安全公司就負責數字簽名軟件與Macintosh操作系統的集成,在Apple的協作軟件PowerTalk上還增加了簽名拖放功能,用戶只要把需要加密的數據拖到相應的圖標上,就完成了電子形式的數字簽名。RSA與Microsoft、IBM、Sun和Digital都簽訂了許可協議,使在其生產線上加入了類似的簽名特性。與DSS不同,RSA既可以用來加密數據,也可以用於身份認證。和Hash簽名相比,在公鑰系統中,由於生成簽名的密鑰只存儲於用戶的計算機中,安全係數大一些。

用RSA或其它公開密匙密碼算法進行數字簽名的最大方便是沒有密匙分配問題(網絡越複雜、網絡用戶越多,其優點越明顯)。因爲公開密匙加密使用兩個不同的密匙,其中有一個是公開的,另一個是保密的。公開密匙可以保存在系統目錄內、未加密的電子郵件信息中、電話黃頁(商業電話)上或公告牌裏,網上的任何用戶都可獲得公開密匙。而保密密匙是用戶專用的,由用戶本身持有,它可以對由公開密匙加密信息進行解密。

RSA算法中數字簽名技術實際上是通過一個哈希函數來實現的。數字簽名的特點是它代表了文件的特徵,文件如果發生改變,數字簽名的值也將發生變化。不同的文件將得到不同的數字簽名。一個最簡單的哈希函數是把文件的二進制碼相累加,取最後的若干位。哈希函數對發送數據的雙方都是公開的。

下面用一個典型的應用公鑰密碼體制的模塊流程圖來說明數字簽名的過程:



我們認爲RSA算法是目前比較好的密碼算法,它不僅可以作爲加密算法使用,而且可以用作數字簽名和密鑰分配與管理,而DSA只適合作簽名,且安全強度和速度都不如RSA,橢圓曲線上的公開密鑰密碼系統安全強度依賴於曲線的選擇和體制,我們相信它會有更高的安全強度,目前200比特長的橢圓曲線密碼體制已經有相當高的安全強度。

數字簽名的保密性

數字簽名的保密性很大程度上依賴於公開密鑰。

數字簽名的加密解密過程和祕密密鑰的加密解密過程雖然都使用公開密鑰體系,但實現的過程正好相反,使用的密鑰對也不同。數字簽名使用的是發送方的密鑰對,發送方用自己的私有密鑰進行加密,接收方用發送方的公開密鑰進行解密。這是一個一對多的關係:任何擁有發送方公開竊鑰的人都可以驗證數字簽名的正確性,而祕密密鑰的加密解密則使用的是接收方的密切對,這是多對一的關係:任何知道接收方公開密鑰的人都可以向接收方發送加密信息,只有唯一擁有接收方私有密鑰的人才能對信息解密。這是一個複雜但又很有趣的過程。在實用過程中,通常一個用戶擁有兩個密鑰對一一一個密鑰對用來對數字簽名進行加密解密,一個密鑰對用來對祕密密鑰進行加密解密。這種方式提供了更高的安全性。

又由於加密鑰匙是公開的,密鑰的分配和管理就很簡單,而且能夠很容易地實現數字簽名。因此,最適合於電子商務應用需要。在實際應用中,公開密鑰加密系統並沒有完全取代祕密鑰匙加密系統,這是因爲公開密鑰加密系統是基於尖端的數學難題,計算非常複雜,它的速度遠趕不祕密鑰匙加密系統。因此,在實際應用中可利用二者的各自優點,採用祕密鑰匙加密系統加密文件,採用公開密鑰加密系統加密"加密文件"的密鑰,這就是混合加密系統,它較好地解決了運算速度問題和密鑰分配管理問題。

數字簽名中的問題與改進

以上數字簽字的方法是相當簡單和理想化的,具體應用中還是有一些問題需要解決的。

1. 簽字後的文件可能被接收方重複使用。如果簽字後的文件是一張支票,接收方很容易多次用該電子支票兌換現金,爲此發送方需要在文件中加上一些該支票的特有的憑證,如時間戳timestamp(但時間戳會有一個時間是否同步的問題)等,以防止上述情況發生。

2.數字簽名應用很多的RSA算法是基於大數的因子分解難題,由於計算水平的提高,人們逐漸可以用計算機分解更大的數。因此RSA算法的密鑰也就越來越長,諸位使用PGP時至少要選擇700比特以上的密鑰。在電子商務的SET協議中,規定用戶使用1024比特的RSA密鑰,認證中心CA使用2048比特的RSA密鑰。長密鑰帶來兩個問題,一是運算速度較慢,另一個是密鑰存儲和管理問題。如果用16位的IC卡實現電子錢包,使用1024比特的RSA算法速度就很慢,要以秒計算。而固化RSA算法的IC卡或32位的IC卡價格則較貴。

3.公鑰算法的效率是相當低的,不易用於長文件的加密,爲此我們採用Hash函數,將原文件P通過一個單向(one-way)的Hash函數作用,生成相當短的(僅幾十或幾百bits)的輸出H,即Hash(P)=H,這裏由P可以很快生成H,但由於H幾乎不可能生成P,然後再將公鑰算法作用在H上生成"簽字"S,記爲Ek1(H)=S,k1爲A的公鑰,A將(P,S)傳給B,B收到(P,S)後,需要驗證S是A的簽字。若我們有H1=H2,即Dk2(S)=Hash(P),我們才能認爲S就是A的簽字。

4. 如果在Hash簽名使用一個密鑰k,讓只有知道此密鑰k的人才能使用hash,即用H(m,k)代替H(m),則可以增強Hash加密的安全性。以上方法實際上就是把簽字過程從對原文件轉移到一個很短的hash值上,大大地提高了效率,可以在現代的電子商務中被廣泛的使用。

數字簽名的發展方向

2000年1月舉行的第六屆國際密碼學會議對應用於公開鑰密碼系統的加密算法,推薦了兩種:基於大整數因子分解難題的RSA算法和基於橢圓曲線上離散對數計算難題的ECC算法。所以基於RSA算法的數字簽名還有一定的發展。   

對於未來的加密、生成和驗證數字簽名的工具需要完善,只有用SSL(安全套接層)建立安全鏈接的Web瀏覽器,纔會頻繁使用數字簽名,公司要對其僱員在網絡上的行爲進行規範,就要建立廣泛協作機制來支持數字簽名,支持數字簽名是Web發展的目標,確保數據保密性、數據完整性和不可否認性才能保證在線商業的安全交易。

和數字簽名有關的複雜認證能力就像現在操作、應用環境中的口令保護一樣直接做進操作系統環境、應用、遠程訪問產品、信息傳遞系統及Internet防火牆中,像Netscape 支持X.509標準的Communicator 4.0Web客戶機軟件;Microsoft支持X.509的Internet Explorer 4.0客戶機軟件及支持對象簽名檢查的Java虛擬機等。

數字簽名的前景與專家的擔憂

數字簽名作爲電子商務的應用技術,越來越得到人們的重視,其中它涉及到的關鍵技術也很多,並且很多新的協議,如網上交易安全協議SSL、SET協議都會涉及到數字簽名,究竟使用哪種算法,哪種Hash函數,以及數字簽名管理、在通信實體與可能有的第三方之間使用協議等等問題都可以作爲新的課題。

同時,數字簽名也帶來專家們的擔憂,一位技術專家警告:運用越來越廣泛的網絡安全技術數字簽名,今後很可能導致毫無私密可言。在倫敦組織的國際監控論壇上,高級譯碼專家Dr StefanBrands在其發言中警告:數字簽名將擴大政府跟蹤和身份盜用的可能性。數字簽名是爲互聯網用戶提供的受密鑰保護的唯一身份證明,該密鑰向第三方證明文件、信息或交易對象的真實身份。雖然數字簽名能打消很多客戶的疑慮,Brand相信數字簽名同時也引發了"自由"問題。

Brands博士警告,今後,數字簽名使政府很容易跟蹤網絡用戶的在線活動。Brand說:"這些標識符號只會越來越危險,你所做的每一件事都能被自動跟蹤。相信不久以後這些標識你身份的符號就象安裝在你身上的一個類似電話和監視器的計算機。"

數字簽名的前景越來越廣闊,而由此引發的問題也越來越發人深思......
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章