2012-03-22 96 views
0

我有一個在Microsoft Visual C++ 6.0中開發的加密類,它工作正常。我將代碼遷移到Microsoft Visual Studio 2008,這個類正在工作,但具有不同的行爲。VC++ 6.0和VS 2008之間的Windows加密服務差異

當我傳遞一個特定的字符串進行加密時,Visual C++ 6.0中編譯代碼中生成的加密結果與Visual Studio 2008中不同,它不應該發生。

任何人都可以幫助我理解爲什麼會發生這種情況嗎?使用Windows服務的

加密功能:

HCRYPTPROV hProv; 
HCRYPTHASH hHash; 
HCRYPTHASH hKey; 
CString strDataKey; 
DWORD dwSize; 
DWORD dwSizeEncrypted; 
BYTE * aszEncryptedBuffer; 

.........(其它代碼.....).......

CryptAcquireContext (& hProv, NULL, MS_STRONG_PROV, PROV_RSA_FULL, 0); 

CryptCreateHash (hProv, CALG_MD5, 0, 0, & hHash); 

CryptHashData (hHash, (const unsigned char *) strDataKey, dwSize, 0); 

CryptDeriveKey (hProv, CALG_RC2, hHash, CRYPTDERIVEKEY_FLAG, & hKey); 

aszEncryptedBuffer = new BYTE[dwSizeEncrypted]; 

memcpy(aszEncryptedBuffer,"Data to be encrypted",dwSize); 

CryptEncrypt (hKey, 0, TRUE, 0, aszEncryptedBuffer, & dwSize, dwSizeEncrypted); 

提前致謝。

回答

2
CryptHashData (hHash, (const unsigned char *) strDataKey, dwSize, 0); 

這是一個殺手,你已經到了那裏。 CString有一個轉換運算符const TCHAR*,但不是const unsigned char*。這往往是偶然的工作,但你會很容易失去運氣。你不能用一個轉換從一個字符串表示轉換到另一個字符串表示。例如,當CString存儲一個Unicode字符串。它使用默認的VS2008項目設置。項目+屬性,常規,字符集選項。還要考慮wcstombs()或WideCharToMultiByte()來進行真正的轉換。您轉換爲的代碼頁可以並將影響結果字符串。