正在将明文AES 128密钥导出到缓冲区/文件Windows Crypto API c++

Exporting Plaintext AES 128 Key to buffer/file Windows Crypto API c++

本文关键字:文件 缓冲区 Windows Crypto c++ API 明文 AES 密钥      更新时间:2023-10-16

我在理解和实现用于在c++中导入和导出密钥的Windows Crypto API时遇到了很多困难。

尽管我读了很多次MSDN文档,但我似乎无法让它以我想要的方式工作。

下面是我正在研究的代码片段

if(CryptAcquireContext(&CryptoHandle,NULL,provPointer, PROV_RSA_AES, 0xF0000000))
{
    HCRYPTKEY aesKey;
    //We now have context on Enhanced AES
    if(CryptGenKey(CryptoHandle,CALG_AES_128,CRYPT_EXPORTABLE,&aesKey))
    {
            DWORD dwBlobLen;
            BYTE* pbKeyBlob;
            CryptExportKey(aesKey,0,PLAINTEXTKEYBLOB,0,NULL,&dwBlobLen);
            if(pbKeyBlob=new BYTE[dwBlobLen])
            {
                if(CryptExportKey(aesKey, NULL,PLAINTEXTKEYBLOB, 0,pbKeyBlob, &dwBlobLen))
                {
                    //Blah Blah
                }
            }
    }
}

*(其中provPointer是指向增强型加密api字符串的指针。

从这个片段中可以看出,我正试图将AES 128密钥导出为纯文本。

在调试器中,它执行得很好(没有可见的错误),但我根本不理解结果。

对CryptExportKey的第一个调用将dwBlobLen填充为"28"(这意味着什么?为什么?)

在第二个CryptExport密钥之后,我尝试将pbKeyBlob(我认为它指向密钥)写入文件,但我最终得到了一组不变的字节(每次尝试都相同),然后是一组每次都不同的字节(我认为这是密钥的一部分)(总共增加了28个字节)

如果有人能认出我哪里出了问题,我将不胜感激。我对整个加密语言(会话、机器密钥、斑点等)一无所知

将来,我希望能够生成AES密钥,使用它,并将其导出到一个文件中,以便以后再次导入。

提前谢谢。

我不是Windows Cryptography API(或一般密码学)方面的专家,但我相信我可以对这里发生的事情有所了解。

对CryptExportKey的第一个调用将28放入dwBlobLen中,因为这是导出密钥时将创建的blob的大小。这在MSDN文档中:http://msdn.microsoft.com/en-us/library/windows/desktop/aa379931%28v=vs.85%29.aspx

至于你做错了什么。你没有做错什么。您要求CryptExportKey导出具有以下布局的明文blob:

typedef struct _PLAINTEXTKEYBLOB {
  BLOBHEADER hdr;
  DWORD      dwKeySize;
  BYTE       rgbKeyData[];
} PLAINTEXTKEYBLOB, *PPLAINTEXTKEYBLOB;

正如您所看到的,blob以一个标头和一个密钥大小(这是您报告的恒定字节集,应为12字节长)开始,然后是密钥数据(这是每次更改的数据,应为16字节长)。请记住,您正在生成一个128位密钥(即16字节)。

BLOBHEADER具有以下布局:

typedef struct _BLOBHEADER {
    BYTE bType;
    BYTE bVersion;
    WORD Reserved;
    ALG_ID aiKeyAlg;
} BLOBHEADER;

顺便说一句,从CryptImportKey函数的文档中,不能直接导入PLAINTEXTBLOB,因为传递给CryptImportKey的BYTE数组不包括keysize。您需要传递一个缓冲区,该缓冲区后面跟有BLOBHEADER和密钥数据。