我在使用 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
我在这里找到了问题的答案:使用 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 ) )