1、3DES演算法
3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標准),加密演算法,其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的密鑰,M代表明文,C代表密文,這樣:
3DES加密過程為:C=Ek3(Dk2(Ek1(M)))
3DES解密過程為:M=Dk1(EK2(Dk3(C)))
2、Blowfish演算法
BlowFish演算法用來加密64Bit長度的字元串。
BlowFish演算法使用兩個「盒」——unsignedlongpbox[18]和unsignedlongsbox[4,256]。
BlowFish演算法中,有一個核心加密函數:BF_En(後文詳細介紹)。該函數輸入64位信息,運算後,以64位密文的形式輸出。用BlowFish演算法加密信息,需要兩個過程:密鑰預處理和信息加密。
分別說明如下:
密鑰預處理:
BlowFish演算法的源密鑰——pbox和sbox是固定的。我們要加密一個信息,需要自己選擇一個key,用這個key對pbox和sbox進行變換,得到下一步信息加密所要用的key_pbox和key_sbox。具體的變化演算法如下:
1)用sbox填充key_sbox
2)用自己選擇的key8個一組地去異或pbox,用異或的結果填充key_pbox。key可以循環使用。
比如說:選的key是"abcdefghijklmn"。則異或過程為:
key_pbox[0]=pbox[0]abcdefgh;
key_pbox[1]=pbox[1]ijklmnab;
…………
…………
如此循環,直到key_pbox填充完畢。
3)用BF_En加密一個全0的64位信息,用輸出的結果替換key_pbox[0]和key_pbox[1],i=0;
4)用BF_En加密替換後的key_pbox,key_pbox[i+1],用輸出替代key_pbox[i+2]和key_pbox[i+3];
5)i+2,繼續第4步,直到key_pbox全部被替換;
6)用key_pbox[16]和key_pbox[17]做首次輸入(相當於上面的全0的輸入),用類似的方法,替換key_sbox信息加密。
信息加密就是用函數把待加密信息x分成32位的兩部分:xL,xRBF_En對輸入信息進行變換。
3、RC5演算法
RC5是種比較新的演算法,Rivest設計了RC5的一種特殊的實現方式,因此RC5演算法有一個面向字的結構:RC5-w/r/b,這里w是字長其值可以是16、32或64對於不同的字長明文和密文塊的分組長度為2w位,r是加密輪數,b是密鑰位元組長度。
(1)dss簽名演算法源代碼擴展閱讀:
普遍而言,有3個獨立密鑰的3DES(密鑰選項1)的密鑰長度為168位(三個56位的DES密鑰),但由於中途相遇攻擊,它的有效安全性僅為112位。密鑰選項2將密鑰長度縮短到了112位,但該選項對特定的選擇明文攻擊和已知明文攻擊的強度較弱,因此NIST認定它只有80位的安全性。
對密鑰選項1的已知最佳攻擊需要約2組已知明文,2部,2次DES加密以及2位內存(該論文提到了時間和內存的其它分配方案)。
這在現在是不現實的,因此NIST認為密鑰選項1可以使用到2030年。若攻擊者試圖在一些可能的(而不是全部的)密鑰中找到正確的,有一種在內存效率上較高的攻擊方法可以用每個密鑰對應的少數選擇明文和約2次加密操作找到2個目標密鑰中的一個。
B. 簽名演算法怎麼來的
數字簽名演算法分析與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 Key Cryptography Standards)、DSA(Digital Signature Algorithm)、x.509、PGP(Pretty Good Privacy)。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 finger print)。它與RSA數字簽名是單獨的簽名不同,該數字簽名方法是將數字簽名與要發送的信息緊密聯系在一起,它更適合於電子商務活動。將一個商務合同的個體內容與簽名結合在一起,比合同和簽名分開傳遞,更增加了可信度和安全性。下面我們將詳細介紹Hash簽名中的函數與演算法。
C. 12 簽名演算法
簽名演算法是公鑰密碼學的「消息認證碼」,它主要包括3個部分:
簽名演算法可以在加密演算法的基礎上構建。使用一個私鑰,可以對一個消息產生一個值,通常是使用hash演算法來生成。任何人都可以用公鑰來檢查這個值,計算該值是否由消息計算得到,然後將兩者進行驗證。和公鑰加密演算法一個明顯的不同是,使用私鑰來產生消息(這個情形下就是簽名),使用公鑰去解析它,這個和加密的過程是反過來的。
上面的說明是對後面很多重要細節的概述。本文將繼續討論一些細節。
數字簽名演算法(Digital Signature Algorithm DSA)是英國聯邦政府的一個數字簽名標准。它由NIST(National Institute of Standards and Technology)在1991年第一次提出,用來作為數字簽名的標准(Digital Signature Standard DDS)。該演算法由NSA的技術顧問David W.Kravitz發布。
DSA的密鑰生成分為兩步:第一步,選擇在用戶中共享的參數。第二步,為每一個用戶生成一份公私鑰對。
首先需要挑選一個被推薦的密碼hash函數H,密鑰長度L和一個素數長度N。原始的DSS中推薦L的長度為512和1024之間,現在NIST推薦密鑰的長度為3072位這樣密鑰的安全生命周期就可以到2030年。隨著L的增長,N也需要增長。
接下來選擇素數q,其長度為N位。N需要小於或者等於hash輸出的長度。再選擇一個L位長度的素數p,使得p-1是q的倍數。
最後一部分是最容易讓人困惑的。需要找到一個數字g,它的乘法序模p是q。最簡單的方法是設
也可以嘗試其他比2大,比p-1小的數。
一旦確定了(p,q,g),可以將其在用戶中共享。
有了參數,就該來位用戶計算公鑰和私鑰了。首先,選擇隨機數x (0<x<q), 接下來計算y y=g^x(mod p).這樣私鑰就是x,公鑰為(p,q,g,y)。
為了對消息進行簽名,簽名者在0-q之間挑選一個隨機數k。如何挑選k是一個很敏感和相關的過程,這個在之後進行討論。當k選定後,可以計算消息m的簽名的兩部分r和s:
如果兩者中任意一個是0(罕見時間),再重新選擇一個k。
驗證簽名需要一個復雜的計算。給定消息m和簽名(r,s):
如果簽名是有效的,那麼v就會等於r,也就是簽名的第二部分。
雖然目前DSA演算法自身沒有什麼問題,但是它卻很容易出錯。進一步說,DSA是非常敏感的,僅僅是一個很小的實現上的錯誤就可以毀掉整個機制。
特殊來看,簽名參數k的選擇是非常嚴格的。可以說是密碼系統中對於隨機數選擇中最嚴格的。例如,很多演算法需要一個nonce值。nonce值僅僅需要唯一,它不需要私密。它也不需要不可預測。nonce值通常可以使用簡單的計數器或者時鍾。很多其他演算法例如CBC模式,需要一個初始化向量。它不需要是唯一的,只需要是不可預測的。它也不需要是私密的:初始化向量通常和密文一起。但是DSA演算法的隨機數k是以上的組合:
如果沒有滿足這些特性,攻擊者可以嘗試從一定數量的簽名中得到你的私鑰。例如,攻擊者只要知道k的一些位,和比較多的有效簽名,就可以恢復出私鑰。[NS00]
實際中DSA的很多實現都不能保證唯一性,愉快地重用隨機數k。這就使得只需要使用簡單的數學就可以恢復密鑰。因為這個攻擊很容易理解,應用非常廣泛並且可以造成非常嚴重的影響,本節將討論它的細節。
假設攻擊者看到了很多對於不同消息mi的簽名(ri,si),它們使用了相同的k。攻擊者可以挑選出兩個簽名(r1,s1)和(r2,s2),假設它們的原消息位m1和m2.s1和s2的是通過如下計算得到的
攻擊者可以推斷出r1和r2是相同的,因為
重用了相同的k,而r僅僅依賴於k,所以r是相同的。另外由於簽名者使用的是同一個密鑰,兩個公式中的x也是相同的。
將兩個s相減,得到一下的計算:
可以得到k
兩個hash值H(m1)和H(m2)很容易計算。它們並沒有加密,被簽名的消息是公開的。簽名的兩個s1和s2是簽名的組成部分,攻擊者都可以看到。所以攻擊者可以計算得到k。目前它還沒有得到私鑰x,然後用私鑰去偽造簽名。
再次看下s的計算過程,這次把k當作是已知項,x作為需要解決的變數。
所有有效的簽名都滿足這個等式,所以可以嘗試任意一個簽名。來解出x
同樣的H(m)是公開的,攻擊者可以計算出k。假設他們已經計算出了k,s本身就是簽名的一部分。現在只需要計算r^(-1)(mod q)(也就是r相對於模q的逆元),這個同樣也可以計算出來。(更多信息可以查看附錄中有關於現代數學,記住q是個素數,所以這個模的逆元是可以直接計算的)。這也就意味著攻擊者,只要發現了任何簽名的k,就可以得到私鑰的值。
目前為止,本節中假設的是簽名者一直使用的同一個隨機數k。更糟的是,簽名者只要在攻擊者可以看到的簽名中,有兩個簽名復用k一次。如上,k重復了,r就會重復。而r是簽名的一部分,簽名者的這個錯誤非常容易被觀察到。這樣即便簽名者只是很罕見地重用了k(比方說隨機數生成器的問題),只一次,攻擊者就可以打破這個DSA系統。
簡而言之,在DSA簽名演算法中重用參數k就意味著攻擊者可以破解出私鑰。
TODO:
和一般的DSA相同,k的選擇是極為嚴格的。攻擊者可以使用幾千個簽名,這些簽名的nonce僅僅有一些位泄漏,攻擊者便可以破解出簽名的私鑰。
本章描述的簽名演算法有一個特點被稱為:不可抵賴性。簡單說,它意味著不可以否認自己就是簽名消息的發送者。任何人都可以驗證你用私鑰簽署的簽名。但是簽名只有你可以做。
這通常並不是一個有用的特性,只有少數接受者可以驗證簽名可能更加謹慎。這種演算法通常需要只有接受者才可以計算出這個特殊的值。
這些消息是可以拒絕的,例如一種通常被稱為「可以否認的消息認證」。一個發送者認證一條消息給接收者,發送者之後可以否認它發送了這條消息。接收者也無法向任何人證明發送者給他發送了特定的消息。
D. 怎樣用公開密鑰演算法實現數字簽名要實現具有保密性的數字簽名呢
發送方A用自己的秘密密鑰簽名並用接受者B的公開密鑰加密,B收到報文後用自己的秘密密鑰解密,再用A的公開密鑰核實簽名