【问题标题】:How to AES CBC encryption Using cryptoAPI如何使用 cryptoAPI 进行 AES CBC 加密
【发布时间】:2015-04-14 20:25:07
【问题描述】:

我想用AES CBC mode 加密文件,使用cryptoAPI 函数并从命令行设置我自己的密钥(这是我在代码中的更改)

我想密钥(更改后)将是 1a1dc91c907325c6 并以这种形式尝试:

HCRYPTPROV hProv  = NULL;
HCRYPTKEY hKey    = NULL;
DWORD dwBlobLen;
PBYTE pbKeyBlob = NULL;
pbKeyBlob = (PBYTE)"1a1dc91c907325c6";

if(!CryptAcquireContext(&hProv, NULL,NULL, PROV_RSA_AES,CRYPT_VERIFYCONTEXT))
{
    printf(" Error in AcquireContext 0x%08x \n",GetLastError());
}    
if (!CryptImportKey(hProv,pbKeyBlob,sizeof(pbKeyBlob),0,CRYPT_EXPORTABLE,&hKey ))
{
    printf("Error 0x%08x in importing the Des key \n",GetLastError());
}

CryptImportKey 失败

我不知道怎么用cryptoAPI functions和它的参数

我测试了一些其他代码并更改了参数或函数的调用顺序大约 2 周,但我无法做到这一点

请帮帮我[一个很大的帮助:)]

谢谢

【问题讨论】:

    标签: c++ cryptography aes cryptoapi


    【解决方案1】:

    你应该这样做:

    if( ::CryptAcquireContext( &m_hCryptoProvider, NULL, NULL/*Default*/, PROV_RSA_AES, CRYPT_VERIFYCONTEXT ) )
    {
        //Hash Password
        // CALG_SHA1 OK
        // CALG_AES_128 / CALG_AES_256 => error
        if( ::CryptCreateHash( m_hCryptoProvider, CALG_SHA1, 0, 0, &m_hHashPassword ) )
        {
            // Hash for the password. 
            if( ::CryptHashData( m_hHashPassword, (BYTE *)password, (DWORD) _tcslen(password) * sizeof(TCHAR), 0 ) )
            {
                // Session key from the hash
                if( ::CryptDeriveKey( m_hCryptoProvider, CALG_AES_256, m_hHashPassword, CRYPT_CREATE_SALT, &m_hCryptKey ) )
                {
                    TRACE( TEXT("Crypto-API OK\n") ); 
                    return ERROR_SUCCESS;
                }
                else
                {
                    TRACE( TEXT("Error in CryptDeriveKey\n") ); 
                }
            }
            else
            {
                TRACE( TEXT("Error in CryptHashData\n") ); 
            }
        }
        else
        { 
            TRACE( TEXT("Error in CryptCreateHash\n") );
        }
    }
    else
    {
        TRACE( TEXT("Error in CryptAcquireContext\n") );
    }
    

    之后你需要使用CryptEncrypt/CryptDecrypt来编码/解码数据。

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2015-09-16
      • 1970-01-01
      相关资源
      最近更新 更多