VC ++ 6.0和VS 2008之间Windows密码服务的差异

时间:2012-03-22 10:27:37

标签: visual-studio visual-studio-2008 visual-c++

我有一类在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);

提前感谢。

1 个答案:

答案 0 :(得分:2)

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

这是一个杀手,你已经到了那里。 CString有const TCHAR*的转换运算符,但const unsigned char*没有。这往往是偶然的,但你很容易失去运气。您无法使用强制转换从一个字符串表示转换为另一个。例如,当CString存储Unicode字符串时。它与默认的VS2008项目设置有关。项目+属性,常规,字符集选项。还要考虑使用wcstombs()或WideCharToMultiByte()进行实际转换。您转换为的代码页可以影响生成的字符串。