每次从同一明文获得相同的密文

时间:2013-04-04 18:01:51

标签: cryptoapi

我使用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);

2 个答案:

答案 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());
            }
    }

}