正在将明文AES 128密钥导出到缓冲区/文件Windows Crypto API c++
Exporting Plaintext AES 128 Key to buffer/file Windows Crypto API c++
我在理解和实现用于在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和密钥数据。
- 将整个二进制文件读入缓冲区,然后以特定格式解析
- 从缓冲区读取/写入文件
- 如何将文件的一部分读取到std::list缓冲区?
- CSV文件未从缓冲区获取数据
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 使用大磁盘文件的 C++ 循环缓冲区
- 文件大小和缓冲区过冲
- 从文件中读取原始压缩缓冲区.jpg使用 jpeglib
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- 如何在没有任何缓冲区的情况下将 stderr 重定向到文件?
- 使用平面缓冲区读取以前写入的二进制文件的数据
- 读取文件时字符缓冲区溢出
- 将随机数放入缓冲区以写入文件的有效方法是什么?
- 使用谷歌协议缓冲区 - 如何在.proto文件中定义字段
- 无法使用两种不同的频率填充 *.wav 文件的缓冲区
- 使用文件缓冲区循环加密文件
- 从导致AccessViolationException的线程访问文件缓冲区
- 读取文件缓冲区传递
- 将内存写入文件缓冲区如何使其发生变化?
- 将二进制文件缓冲区的块读取为不同类型的