Ⅰ 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僅僅有一些位泄漏,攻擊者便可以破解出簽名的私鑰。
本章描述的簽名演算法有一個特點被稱為:不可抵賴性。簡單說,它意味著不可以否認自己就是簽名消息的發送者。任何人都可以驗證你用私鑰簽署的簽名。但是簽名只有你可以做。
這通常並不是一個有用的特性,只有少數接受者可以驗證簽名可能更加謹慎。這種演算法通常需要只有接受者才可以計算出這個特殊的值。
這些消息是可以拒絕的,例如一種通常被稱為「可以否認的消息認證」。一個發送者認證一條消息給接收者,發送者之後可以否認它發送了這條消息。接收者也無法向任何人證明發送者給他發送了特定的消息。
Ⅱ 電子合同中,對稱加密、非對稱加密、哈希演算法、CA、時間戳、數字簽名這些是什麼,有什麼用,你們知道嗎
演算法,因為只要你有足夠的時間,完全可以用窮舉法來進行試探,如果說一個加密演算法是牢固的,一般就是指在現有的計算條件下,需要花費相當長的時間才能夠窮舉成功(比如100年)。一、主動攻擊和被動攻擊數據在傳輸過程中或者在日常的工作中,如果沒有密碼的保護,很容易造成文件的泄密,造成比較嚴重的後果。一般來說,攻擊分為主動攻擊和被動攻擊。被動攻擊指的是從傳輸信道上或者從磁碟介質上非法獲取了信息,造成了信息的泄密。主動攻擊則要嚴重的多,不但獲取了信息,而且還有可能對信息進行刪除,篡改,危害後果及其嚴重。 二、對稱加密基於密鑰的演算法通常分為對稱加密演算法和非對稱加密演算法(公鑰演算法)。對成加密演算法就是加密用的密鑰和解密用的密鑰是相等的。比如著名的愷撒密碼,其加密原理就是所有的字母向後移動三位,那麼3就是這個演算法的密鑰,向右循環移位就是加密的演算法。那麼解密的密鑰也是3,解密演算法就是向左循環移動3位。很顯而易見的是,這種演算法理解起來比較簡單,容易實現,加密速度快,但是對稱加密的安全性完全依賴於密鑰,如果密鑰丟失,那麼整個加密就完全不起作用了。比較著名的對稱加密演算法就是DES,其分組長度位64位,實際的密鑰長度為56位,還有8位的校驗碼。DES演算法由於其密鑰較短,隨著計算機速度的不斷提高,使其使用窮舉法進行破解成為可能。三、非對稱加密非對稱加密演算法的核心就是加密密鑰不等於解密密鑰,且無法從任意一個密鑰推導出另一個密鑰,這樣就大大加強了信息保護的力度,而且基於密鑰對的原理很容易的實現數字簽名和電子信封。比較典型的非對稱加密演算法是RSA演算法,它的數學原理是大素數的分解,密鑰是成對出現的,一個為公鑰,一個是私鑰。公鑰是公開的,可以用私鑰去解公鑰加密過的信息,也可以用公鑰去解私鑰加密過的信息。比如A向B發送信息,由於B的公鑰是公開的,那麼A用B的公鑰對信息進行加密,發送出去,因為只有B有對應的私鑰,所以信息只能為B所讀取。牢固的RSA演算法需要其密鑰長度為1024位,加解密的速度比較慢是它的弱點。另外一種比較典型的非對稱加密演算法是ECC演算法,基於的數學原理是橢圓曲線離散對數系統,這種演算法的標准我國尚未確定,但是其只需要192 bit 就可以實現牢固的加密。所以,應該是優於RSA演算法的。優越性:ECC > RSA > DES
Ⅲ 簽名演算法怎麼來的
數字簽名演算法分析與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簽名中的函數與演算法。
Ⅳ 數字簽名的原理
數字簽名是附加在數據單元上的一些數據,或是對數據單元所作的密碼變換。這種數據或變換允許數據單元的接收者用以確認數據單元的來源和數據單元的完整性並保護數據,防止被人(例如接收者)進行偽造。
它是對電子形式的消息進行簽名的一種方法,一個簽名消息能在一個通信網路中傳輸。基於公鑰密碼體制和私鑰密碼體制都可以獲得數字簽名,主要是基於公鑰密碼體制的數字簽名。包括普通數字簽名和特殊數字簽名。
(4)時間簽名演算法擴展閱讀:
實現方法
數字簽名演算法依靠公鑰加密技術來實現的。在公鑰加密技術里,每一個使用者有一對密鑰:一把公鑰和一把私鑰。公鑰可以自由發布,但私鑰則秘密保存;還有一個要求就是要讓通過公鑰推算出私鑰的做法不可能實現。
普通的數字簽名演算法包括三種演算法:
1.密碼生成演算法;
2.標記演算法;
3.驗證演算法。