2013-04-04 113 views
2

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

回答

1

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

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

}

相关问题