利用CryptoAPI實現(xiàn)Hash算法_第1頁
利用CryptoAPI實現(xiàn)Hash算法_第2頁
利用CryptoAPI實現(xiàn)Hash算法_第3頁
利用CryptoAPI實現(xiàn)Hash算法_第4頁
利用CryptoAPI實現(xiàn)Hash算法_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、利用 Crypto API 實現(xiàn) Hash 算法之前偶爾看到了一篇論文里面提到微軟的 Crypto API 庫,可以實現(xiàn)加解密、 Hash運算、密鑰交換、證書認證等功能,于是就萌生了用該庫實現(xiàn) DES、AES、 RSA、MD5等算法的想法(以前都是人工實現(xiàn),太麻煩了 )。這里先介紹各種Hash算法的實現(xiàn)方法:Step0:環(huán)境配置,我這里用的是VS2010,貌似只需要添加#inelude <wincrypt.h>頭文 件和#pragma comment(lib, "Crypt32.lib")代碼就可以使用這些API 了,不需要進行 額外的工程設(shè)置。Step1:首先

2、我們先看看這個函數(shù),Cry ptHashData(看起來很靠譜的樣子,其實只算 一個中間函數(shù)吧。)BOOL WINAPI CryptHashData(HCRYPTHASH hHash,BYTE *pbData,/帶哈希數(shù)據(jù)首地址DWORD dwDataLen,/ 待哈希數(shù)據(jù)長度 DWORD dwFlags);參數(shù):hHashin哈希對象句柄pbDatain指向要加入到哈希對象的數(shù)據(jù)指針dwDataLenin數(shù)據(jù)長度dwFlagsin標志CRYPT_USERDATA 所有微軟CSP都忽略此參數(shù)。所有其他CSP都不能忽 略此參數(shù),如果置此參數(shù), CSP 提示用戶直接傳入數(shù)據(jù)。函數(shù)功能:此函數(shù)把一段

3、數(shù)據(jù)加入到指定的哈希對象中去。e.g.CryptHashData(hCryptHash, (BYTE*)hash_data, data_len, 0);好吧,為了調(diào)用這個函數(shù),我們需要一個 HCRYPTHASH 類型的哈希句柄, 那么這個句柄怎么來呢Step2:不難發(fā)現(xiàn),生成哈希句柄的函數(shù)為CryptCreateHash同樣看看他的參數(shù)說明: BOOL WINAPI CryptCreateHash(HCRYPTPROV hProV,ALG_ID Algid, / 想使用的哈希算法 HCRYPTKEY hKey,DWORD dwFlags, HCRYPTHASH *phHash /獲得的哈希句柄

4、);參數(shù):hProvinCSP 句柄Algidin哈希算法的標示符。hKeyin如果哈希算法是密鑰哈希,如HMAC、MAC算法,就用此密鑰句柄傳 遞密鑰。對于非密鑰算法,此參數(shù)為 NULL 。dwFlagsin 保留。必須為 0。phHashout哈希對象的句柄。功能:此函數(shù)初始化哈希數(shù)據(jù)流。 它創(chuàng)建并返回了一個 CSP 哈希對象的句柄。 此句柄由 Cryp tHashData 和 Cryp tHashSessio nKey 來調(diào)用。e.g.CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hCryptHash)這里可以通過 Algid 參數(shù)設(shè)置你需要的

5、哈希算法對應(yīng)的預(yù)編譯常量, 就可以獲 取哈希句柄。但是獲取哈希句柄需要傳入一個CSP句柄(密鑰容器),所以 需要一個獲取該句柄的函數(shù)。Step3:直接利用函數(shù)CryptAcquireContext就可以獲取HCRYPTPROV類型的密鑰容 器句柄了,該函數(shù)參數(shù)聲明如下:BOOL WINAPI CryptAcquireContext( HCRYPTPROV *phProv,/ 返回的 CSP 句柄LPCTSTR pszContainer,LPCTSTR pszProvider,DWORD dwProvType,DWORD dwFlags);參數(shù):phProvout CSP 句柄指針pszCont

6、ainerin 密鑰容器名稱, 指向密鑰容器的字符串指針。如果 dwFlags 為CRYPT_VERIFYCONTEXT,pszContainer 必須為 NULL。 pszProviderin指向CSP名稱的字符串指針。如果為NULL,就使用卻省的CSP。dwProvTypeinCSP 類型。dwFlagsin 標志。CRYPT_VERIFYCONTEXT 此選項指出應(yīng)用程序不需要使用公鑰 /私鑰對,如程序只執(zhí)行哈希和對稱加密。 只有程序需要創(chuàng)建簽名和解密消息時才需要訪問私鑰。CRYPT_NEWKEYSET 使用指定的密鑰容器名稱創(chuàng)建一個新的密鑰容器。如果 pszContainer 為 NU

7、LL ,密鑰容器就使用卻省的名稱創(chuàng)建。CRYPT_MACHINE_KEYSET 由此標志創(chuàng)建的密鑰容器只能由創(chuàng)建者本人或有系統(tǒng)管理員身份的人使用。CRYPT_DELETEKEYSET刪除由PszContainer指定的密鑰容器。如果pszContainer為NULL,卻省名稱 的容器就會被刪除。此容器里的所有密鑰對也會被刪除。CRYPT_SLIENT 應(yīng)用程序要求 CSP 不顯示任何用戶界面。CSP 密鑰容器句柄, 以后的任何加密操作就是針對dwProvType 和 pszProvider 指定的 CSP,如果找到CSP 指定的密鑰容器。由適當?shù)?dwFlags 標志,這功能: 這個函數(shù)是用來

8、取得指定 此CSP句 柄而言。函數(shù)首先查找由 了 CSP,函數(shù)就查找由此個函數(shù)就可以創(chuàng)建和銷毀密鑰容器,如果不要求訪問私鑰的話,也可以提供 對CSP臨時密鑰容器的訪問。e.g.CryptAcquireContext(&hCryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)這樣如果從第三步出發(fā)到第一步,我們已經(jīng)成功地把哈希結(jié)果添加到了 哈希句柄中,考慮到CryptHashData并沒有直接返回哈希結(jié)果,我們需要使用 Cryp tGetHash Param取出哈希句柄中的哈希結(jié)果。Step4:Cryp tGetH

9、ash Paran函數(shù)可以通過哈希句柄,獲得剛剛哈希出來的結(jié)果,其聲 明如下:BOOL WINA PI Cryp tGetHash Param(HCR YP THASH hHash,/ 剛剛的哈希句柄 DWORD dwP aram,/你需要的結(jié)果類型 BYTE *p bData,/存儲結(jié)果的緩沖區(qū)指針 DWORD *pdwDataLen, /最大緩沖區(qū)長度DWORD dwFlags);參數(shù):hHashi n哈希對象的句柄dwP arami n查詢類型。可以是下列:HP_ALGID 哈希算法HP_HASHSIZE哈希值長度HP_HASHVAL哈希值,由hHash指定的哈希值或者消息哈希 功能:此

10、函數(shù)得到指定哈希對象的數(shù)據(jù)。e.g.Cryp tGetHash Param(hCry ptHash, HP_ HASHVAL, (BYTE*)hash_data, & hash_le n, 0)f.jb W帀灑扌懿扌馬丫帀-兩 洌iHi 活亍議辛:辛訪 灑辛耳 再 滿 琴b隸1W楠5傭 猜扌為-隔扌為 爲¥菇帝苗辛誌 済-i為 誦(前 潮禪1輾?, 摻翹蠹繼巍fl魏f藜勲筋癱魏魏連龍巍癖農(nóng)癮藜 謬tstttlgatsttttt尊®sg蠶隨窿®廣簸後瞼錢翹舷塗董謹a®®21232f2?7A57f fff ff aSf f ff ffa74

11、3ff£fffg?4ag4affffffSa:Lff£ffff&3ai2 32f27A5 7A5A743a94aae4A8aif c3Ste p5:分別取一個BYTE的前四位和后四位,然后放到int里面,再用16進制輸出 即可,這里使用了一個itoa做int到hex字串的轉(zhuǎn)換。代碼如下:int hash_bit = hash_datai;int first = (hash_bit & OxfO) >> 4; / 取前四位int seco nd = hash_bit & 0x0f;取后四位char tmp 10;itoa(first, tm

12、p ,16); cout << tmp;itoa(sec ond, tmp ,16);cout << tmp;這樣就可以獲得正確的32位結(jié)果了,對應(yīng)16位結(jié)果取中間16位即可,如” admin”1232f297a57a5a743894a0e4a801fc316 位結(jié)果為 7a57a5a743894a0e 最后試試實現(xiàn)一些其他的哈希算法吧:Hash計算小工具伽希原袤MD5C32fn>:待哈希朋文:I血a121232f297iJ57a5a7*l3a(Ha0flaG01ftJHDX16te:7a57a5a743&54sOeMD232te:pe3'e6t)

13、0e5clc6S644fc5ce3cfO6O211cMD432|:I f9d4O49d d 6a4d c3 5d452 63 954b 3a46SHAl【鋤立;|d033e22ae348aeb5660fc2140aec35e50c4da997刑疣算濟空結(jié)果退出程序P.S最后不要忘記使用CryptDestroyHash和CryptReleaseContex釋放哈希句柄 和CSP句柄。核心代碼:bool CCryptoApiHashDlg:GetHash(int hash_type, CString& hash_result, static CStri ng hash_message) &

14、quot;HCR YPTP ROV hCry ptP rov;HCR YP THASH hCry ptHash;MS_DEF _P ROV,if(!Cry ptAcquireCo ntext(&hCry ptP rov,NULL,P ROV_RSA_FULL, CRYP T_VERIFYCONTEXT)int e = GetLastError();CStri ng str;str.Format("創(chuàng)建CSP容器出錯!錯誤代碼為:d! ", e); MessageBox(str, '出 錯啦!", MB_OK | MB_ICONERROR); ret

15、urn false;if (!CryptCreateHash(hCryptProv, hash_type, 0, 0, &hCryptHash)int e = GetLastError();CString str;str.Format("創(chuàng)建哈希句柄出錯!錯誤代碼為:%d! ", e);MessageBox(str, "出錯啦!", MB_OK | MB_ICONERROR); return false;(!CryptHashData(hCryptHash, (BYTE*)hash_message.GetBuffer(),ifhash_messa

16、ge.GetLength(), 0)int e = GetLastError();CString str;str.FormatC計算哈希值出錯!錯誤代碼為:d! ", e); MessageBox(str, "出錯啦!", MB_OK | MB_ICONERROR); return false;char hash_data512;DWORD hash_len = 512;if (!CryptGetHashParam(hCryptHash, HP_HASHVAL, (BYTE*)hash_data, &hash_len, 0)int e = GetLastError();CString str;str.Format("獲取哈希值出錯!錯誤代碼為:d! ", e);MessageBox(str, "出錯啦!", MB_OK | MB_ICONERROR);return false;char hash_hex512;for (int i=0; i<=hash_len-1; i+)int hash_bit = hash_datai;int first = (hash_bit & 0xf0) >> 4;int second = hash_b

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論