cmjlls
一般會員
發表:2 回覆:2 積分:0 註冊:2002-11-26
發送簡訊給我
|
各位大大,我想用 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
發送簡訊給我
|
引言:
各位大大,我想用 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
發送簡訊給我
|
大大: 那不是 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;
}
|