差异在Windows加密服务VC ++ 6.0和VS 2008间(Difference in Win

2019-10-30 09:28发布

我有一个类的加密在Microsoft的Visual C ++开发6.0,并且可以正常工作。 我迁移代码的Microsoft Visual Studio 2008中,这一类的工作,但有不同的行为。

当我通过一个特定的字符串进行加密,以在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);

提前致谢。

Answer 1:

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

这是一个杀手级投你到了那里。 CString的有一个转换操作符const TCHAR*而不是const unsigned char* 。 这往往是偶然的工作,但你会很容易耗尽运气。 你不能从一个字符串表示形式转换到另一个铸造。 例如,当CString的存储Unicode字符串。 它的默认VS2008的项目设置。 项目+属性,通用,字符集选项。 还要考虑wcstombs()或调用WideCharToMultiByte()做一个真正的转换。 代码页在转换为CAN,并会影响生成的字符串。



文章来源: Difference in Windows Cryptography Service between VC++ 6.0 and VS 2008