線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1897
推到 Plurk!
推到 Facebook!

wincrypt 做 DES 的加密動作

尚未結案
cmjlls
一般會員


發表:2
回覆:2
積分:0
註冊:2002-11-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-03 13:20:31 IP:61.220.xxx.xxx 未訂閱
各位大大,我想用 wincrypt 做 DES 的加密動作,run 了 以下的 code 之後所得到的資料卻不是正榷的資料,可否 請大家指導一下,是不是哪邊的 flag 用錯了?    1. 塞入一個key = "aabbccdd"; 2. 將 pbBuffer = "ZZZZZZZZ" 加密    #include  void CMyDESDlg::OnHashBtn() { HCRYPTPROV hProv = 0; HCRYPTKEY hKey = 0; HCRYPTHASH hHash = 0; BYTE pKey[] = { 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd' }; BYTE pbBuffer[56]; ::ZeroMemory( pbBuffer, 56 ); // 歸零 pbBuffer[0] = 'Z'; pbBuffer[1] = 'Z'; pbBuffer[2] = 'Z'; pbBuffer[3] = 'Z'; pbBuffer[4] = 'Z'; pbBuffer[5] = 'Z'; pbBuffer[6] = 'Z'; pbBuffer[7] = 'Z'; // 欲壓碼的資料 DWORD dwCount = 8; CString strMsg; if ( ! CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0) ) { strMsg.Format( "CryptAcquireContext Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } if ( ! CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash) ) { strMsg.Format( "CryptCreateHash Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } if ( ! CryptHashData(hHash, pKey, 8, 0) ) { strMsg.Format( "CryptHashData Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } // 求 DES if ( ! CryptDeriveKey(hProv, CALG_DES, hHash, 0, &hKey) ) { strMsg.Format( "CryptDeriveKey Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } CryptDestroyHash(hHash); hHash = 0; if ( ! CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwCount, 56) ) { strMsg.Format( "CryptEncrypt Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } strMsg.Format( "Encrypt:ld ld ld ld ld ld ld ld", pbBuffer[0], pbBuffer[1], pbBuffer[2], pbBuffer[3], pbBuffer[4], pbBuffer[5], pbBuffer[6], pbBuffer[7] ); AfxMessageBox( strMsg ); if ( hKey ) CryptDestroyKey( hKey ); if ( hProv ) CryptReleaseContext( hProv, 0 ); }
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-03 13:43:17 IP:211.20.xxx.xxx 未訂閱
引言: 各位大大,我想用 wincrypt 做 DES 的加密動作,run 了 以下的 code 之後所得到的資料卻不是正榷的資料,可否 請大家指導一下,是不是哪邊的 flag 用錯了? 1. 塞入一個key = "aabbccdd"; 2. 將 pbBuffer = "ZZZZZZZZ" 加密 #include void CMyDESDlg::OnHashBtn() { HCRYPTPROV hProv = 0; HCRYPTKEY hKey = 0; HCRYPTHASH hHash = 0; BYTE pKey[] = { 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd' }; BYTE pbBuffer[56]; ::ZeroMemory( pbBuffer, 56 ); // 歸零 pbBuffer[0] = 'Z'; pbBuffer[1] = 'Z'; pbBuffer[2] = 'Z'; pbBuffer[3] = 'Z'; pbBuffer[4] = 'Z'; pbBuffer[5] = 'Z'; pbBuffer[6] = 'Z'; pbBuffer[7] = 'Z'; // 欲壓碼的資料 DWORD dwCount = 8; CString strMsg; if ( ! CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0) ) { strMsg.Format( "CryptAcquireContext Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } if ( ! CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash) ) { strMsg.Format( "CryptCreateHash Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } if ( ! CryptHashData(hHash, pKey, 8, 0) ) { strMsg.Format( "CryptHashData Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } // 求 DES if ( ! CryptDeriveKey(hProv, CALG_DES, hHash, 0, &hKey) ) { strMsg.Format( "CryptDeriveKey Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } CryptDestroyHash(hHash); hHash = 0; if ( ! CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwCount, 56) ) { strMsg.Format( "CryptEncrypt Error:%ld", GetLastError()); AfxMessageBox( strMsg ); } strMsg.Format( "Encrypt:ld ld ld ld ld ld ld ld", pbBuffer[0], pbBuffer[1], pbBuffer[2], pbBuffer[3], pbBuffer[4], pbBuffer[5], pbBuffer[6], pbBuffer[7] ); AfxMessageBox( strMsg ); if ( hKey ) CryptDestroyKey( hKey ); if ( hProv ) CryptReleaseContext( hProv, 0 ); }
cmjlls 你好: 有關 M$ Crypto API 的使用,這裡有範例可以參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=29414 -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
cmjlls
一般會員


發表:2
回覆:2
積分:0
註冊:2002-11-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-03 18:26:46 IP:61.220.xxx.xxx 未訂閱
大大:    那不是 DES... 那不是 DES... 那不是 DES...哇...哇...哇...    但是這個範例寫的不錯,簡單明瞭,真的是受教了,還是感謝    另外,我又用了下面這個方式,也是不行,在 CryptExportKey() 會 return FALSE,GetLastError()=87。    My OS:Win 2000(SP4) VC 6.0:(SP6)    #include  //安裝 VC 的原來本版 int main(int argc, char* argv[]) { BOOL cRtn; HCRYPTPROV hCryptProv = NULL; cRtn = CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0); HCRYPTKEY hKey = NULL; cRtn = CryptGenKey(hCryptProv, CALG_DES, CRYPT_EXPORTABLE, &hKey); BYTE exportedKey[20]; DWORD dwBlobLen; cRtn = CryptExportKey( hKey, 0, PLAINTEXTKEYBLOB, 0, exportedKey, &dwBlobLen); BYTE mackey[] = "aabbccdd"; memcpy(exportedKey 12, mackey, 8); cRtn = CryptImportKey(hCryptProv, exportedKey, dwBlobLen, 0, CRYPT_EXPORTABLE, &hKey); BYTE encryptData[100]; DWORD pdwDataLen; DWORD dwBufLen = sizeof(encryptData); char plainText[] = "ZZZZZZZZ"; memcpy(encryptData, plainText, 8); pdwDataLen = sizeof(plainText) - 1; cRtn = CryptEncrypt(hKey, 0, FALSE, 0, encryptData, &pdwDataLen, dwBufLen); cRtn = CryptDestroyKey(hKey); cRtn = CryptReleaseContext(hCryptProv, 0); return 0; }
系統時間:2024-11-22 10:28:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!