cryptography - 带有 WinCrypt 和 CryptImportKey 的硬编码 AES-256 key

标签 cryptography aes cryptoapi

我需要让 Win32 应用程序加载硬编码的 AES-256 key ,最好使用 WinCrypt.h 方法。我的 key 是无符号字符 [32],但我找不到要传递给 CryptImportKey 的 key blob 的正确格式。一切似乎都给了我无效的参数错误。有没有办法做到这一点?

(同样重要的是如何在 WinCrypt 中设置 IV。我根本看不到如何做到这一点)

最佳答案

解决了。我使用了错误的 bType,并且将 256 用于 keySize 而不是 32。

BYTE myPrivateKey[] = 
    {1,2,3,4,5,6,7,8,9,10,
    11,12,13,14,15,16,17,18,19,20,
    21,22,23,24,25,26,27,28,29,30,
    31,32};
BYTE myIV[] = 
    {1,2,3,4,5,6,7,8,9,10,
    11,12,13,14,15,16};

struct aes256keyBlob
{
    BLOBHEADER hdr;
    DWORD keySize;
    BYTE bytes[32];
} blob;

blob.hdr.bType = PLAINTEXTKEYBLOB;
blob.hdr.bVersion = CUR_BLOB_VERSION;
blob.hdr.reserved = 0;
blob.hdr.aiKeyAlg = CALG_AES_256;
blob.keySize = 32;
memcpy(blob.bytes, myPrivateKey, 32);

HCRYPTKEY hKey;
if (CryptImportKey(hCryptProv, (BYTE*)&blob, sizeof(aes256keyBlob), NULL, 0, &hKey))
{
    if(CryptSetKeyParam(hKey, KP_IV, myIV, 0))
    {
        //do decryption here
    }
    else{/*error*/}

    CryptDestroyKey(hKey);
}
else{/*error*/}

关于cryptography - 带有 WinCrypt 和 CryptImportKey 的硬编码 AES-256 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/842357/

相关文章:

c - 是否有库或其他方法可以进行 128 位数学运算?

java - 在 Java/grails 中使用 AES 128 加密字符串

c# - 使用 AesCryptoServiceProvider 在没有 IV 的情况下解密

java - 如何使用 Java 访问需要 SafeNet eToken 证书的 URL

c++ - CryptGenRandom 和 CNG BCryptGenRandom API 之间的区别

c# - 如何使用仅给定 keystore 的 C# 对哈希进行签名和加密

java - 如何从 AsymmetryCipherKeyPair 创建 PGP 公钥和私钥?

Go dev.boringcrypto 分支 - x/crypto 库 FIPS 140-2 合规性

PHP方法逐 block 执行AES加密以节省内存使用

node.js - 在 Node.js 中生成和验证密码哈希值与 Python 的 werkzeug 相同