基於VC++2010實現哈希簽名與驗證
分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net
數字簽名即如何給一個計算機文件進行簽字。數字簽字可以用對稱算法實現,也可以用公鑰算法實現。但前者除了文件簽字者和文件接受者雙方,還需要第三方認證,較麻煩;通過公鑰加密算法的實現方法,由於用秘密密鑰加密的文件,需要靠公開密鑰來解密,因此這可以作為數字簽名,簽名者用秘密密鑰加密一個簽名(可以包括姓名、證件號碼、短信息等信息),接收人可以用公開的、自己的公開密鑰來解密,如果成功,就能確保信息來自該公開密鑰的所有人。
公鑰密碼體制實現數字簽名的基本原理很簡單,假設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簽名中的函數與算法。
單向函數
單向函數的概念是公開密鑰密碼的核心。盡管它本身並不是一個協議,但對大多數協議來說卻是一個基本結構模塊。
單向函數的概念是計算起來相對容易,但求逆卻非常困難。也就是說,已知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簽名與認證的Vc++實現,請參考下列代碼與代碼註釋
本文作者專著《Visual C++2010開發權威指南》即將推出,敬請關註,Visual C++2010最近技術,Windows7開發最新技術!
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net
基於VC++2010實現哈希簽名與驗證