2

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

2 回答 2

1

这个问题从来没有得到充分的回答。对于支持 IV 的任何加密算法,您可以以相同的方式设置 IV。Microsoft CryptoAPI 处理调用HCRYPTKEY与密钥交互的变量。HCRYPTKEY 没有什么特别之处,它只是一个包含作为键句柄的数值的变量。当您使用此 HCRYPTKEY 句柄时,加密服务提供程序 (CSP) 可以查找密钥并与之交互。在您的情况下,请致电CryptSetKeyParam(hDecEncKey, KP_IV, the_IV_Bytes, 0);. 有关文档,请参见此处

于 2014-04-09T02:35:17.000 回答
0

而不是以下行:

CryptAcquireContext(&hProvider, NULL,  MS_ENH_RSA_AES_PROV, PROV_RSA_AES,     CRYPT_VERIFYCONTEXT);

使用以下代码行:(相应地更改您的参数)

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

}

于 2013-10-12T09:09:49.070 回答