我使用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);
答案 0 :(得分:1)
这个问题从未得到充分回答。您可以为支持IV的任何加密算法以相同的方式设置IV。 Microsoft CryptoAPI处理名为HCRYPTKEY
的变量,用于与密钥进行交互。 HCRYPTKEY没什么特别的,只是一个包含一个数字值的变量,它是一个键的句柄。当您使用此HCRYPTKEY句柄时,加密服务提供程序(CSP)可以查找并与键进行交互。在您的情况下,请致电CryptSetKeyParam(hDecEncKey, KP_IV, the_IV_Bytes, 0);
。有关文档,请参阅here。
答案 1 :(得分:0)
而不是以下行:
CryptAcquireContext(&hProvider, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
使用以下代码行:(相应地更改你的args)
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)==0){
//Prateek 12-10-13
printf("\n crytpAcquireContext failed..%x.\n",GetLastError());
if(GetLastError()==NTE_BAD_KEYSET){
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)==0){
printf("\n crytpAcquireContext again failed..%x.\n",GetLastError());
}
}
}