我正在使用 Microsoft CryptoAPI 来加密密码。使用来自 Microsoft Enhanced Cryptographic Provider 的 3DES。我注意到的是,我似乎每次都从相同的明文中得到完全相同的密文。据我所知,这不应该发生在 CBC 模式下,根据 MSDN,CALG_3DES 正在其中运行。我知道 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);