使用带有 AES128 静态密钥和 IV 的 Windows cryptapi

问题描述 投票:0回答:1

我在使用 Windows 加密 API 编码/解码 AES-128 块时遇到问题。

系统似乎首先生成一个哈希,然后使用该哈希来设置密钥,即

CryptCreateHash
CryptHashData
CryptDeriveKey
。但没有说明如何使用空哈希,而只是使用原始数据来初始化密钥。

具体来说,我想使用固定的 128 位密钥和固定的 128 位 IV,通过安全通道共享到链路的每一端。

旁注:这是我找到如何制作

PROV_RSA_AES
而不是
PROV_RSA_FULL
的唯一方法。

如果我使用以下序列尝试设置密钥,则会收到错误

8009000a

CryptAcquireContext( &m_hCryptProv, 0, "Microsoft Enhanced RSA and AES Cryptographic Provider", PROV_RSA_AES, CRYPT_VERIFYCONTEXT );
CryptGenKey( m_hCryptProv, CALG_AES_128, 0, &m_hCryptKey );
CryptSetKeyParam( m_hCryptKey, KP_IV, IV, 0 );
CryptSetKeyParam( m_hCryptKey, KP_KEYVAL, key, 0 ) << FAIL
encryption aes wincrypt
1个回答
0
投票

我在这里找到了问题的答案:使用 WinCrypt 和 CryptImportKey 进行硬编码 AES-256 密钥

对于 AES-128,我只需要做一些调整,将大小更改为正确的即可。

您可以将

CryptGenKey
CryptImportKey
一起使用,而不是
PLAINTEXTKEYBLOB
,即

    struct aes128keyBlob
    {
        BLOBHEADER hdr;
        DWORD keySize;
        BYTE bytes[16];
    } blob;
    blob.hdr.bType = PLAINTEXTKEYBLOB;
    blob.hdr.bVersion = CUR_BLOB_VERSION;
    blob.hdr.reserved = 0;
    blob.hdr.aiKeyAlg = CALG_AES_128;
    blob.keySize = 16;
    memcpy( blob.bytes, raw_key_data, 16 );
    if( !CryptImportKey( m_hCryptProv, (BYTE *)&blob, sizeof( aes128keyBlob), 0, 0, &m_hCryptKey ) )
© www.soinside.com 2019 - 2024. All rights reserved.