2012-03-22 97 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()来进行真正的转换。您转换为的代码页可以并将影响结果字符串。