我正在使用Microsoft CryptoAPI来加密密码。使用来自Microsoft Enhanced Cryptographic Provider的3DES。我注意到,我似乎每次都从相同的明文获得完全相同的密文。据我所知,这不应该发生在CBC模式下,CALG_3DES根据MSDN运行。我知道3DES是旧的,我应该使用AES,但这是一个遗留代码,我想避免改变算法。难道我做错了什么?我想我可能需要提供IV,但我不明白如何使用CryptoAPI来完成3DES。没有任何MSDN示例显示它。下面是显示CryptoAPI调用序列的编辑代码片段。每次从相同的明文获取相同的密文
这是到目前为止我的代码:
CryptAcquireContext(&hProvider, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
/// key acquired by some means and stored in pszTempData
CryptCreateHash(hProvider, CALG_SHA_256, 0, 0, &hHash);
CryptHashData(hHash, (BYTE *)pszTempData, wcslen(pszTempData), 0);
CryptDeriveKey(hProvider, CALG_3DES, hHash, CRYPT_EXPORTABLE, &hDecEncKey);
// some buffer manipulation to ensure buffer size is of correct size
CryptEncrypt(hDecEncKey, 0, TRUE, 0, pbBuffer, &dwCount, dwBufferLen);
CryptBinaryToString(pbBuffer, dwCount, CRYPT_STRING_BINARY, wsTempOut, &dwStrLen);