我在加密应用程序中使用blob来存储加密密钥。
我是MFC的初学者。我正在使用CryptExportKey()
将密钥导出到Blob。我将以下代码放入了Encrypt()
函数中。请参见下面的Encrypt()
函数中的代码,
if (CryptGetUserKey(
m_hCryptProv,
AT_KEYEXCHANGE,
&hXchgKey))
{
printf("The key exchange key has been acquired. \n");
}
else
{
printf("Error during CryptGetUserKey exchange key.");
}
if (CryptExportKey(
m_hKey,
hXchgKey,
SIMPLEBLOB,
0,
NULL,
&dwBlobLen))
{
_tprintf(
TEXT("The key BLOB is %d bytes long. \n"),
dwBlobLen);
}
if (pbKeyBlob = (BYTE*)malloc(dwBlobLen))
{
printf("Memory has been allocated for the BLOB. \n");
}
if (CryptExportKey(
m_hKey,
hXchgKey,
SIMPLEBLOB,
0,
pbKeyBlob,
&dwBlobLen))
{
printf("Contents have been written to the BLOB. \n");
}
我还将下面的代码放入Decrypt()
函数中以导入密钥。
if (!CryptImportKey(
m_hCryptProv,
pbKeyBlob,
dwBlobLen,
0,
0,
&m_hKey))
{
//success
}
导出成功,但是导入失败。
加密后,我的文件将关闭。加载应用程序时,由于密钥未成功导入,因此解密也失败。在加密和解密期间,m_hCryptProv
具有不同的值。在这种情况下重要吗?我在加密工作上花了更长的时间。任何帮助表示赞赏。
答案 0 :(得分:0)
您在导出密钥时使用交换密钥,因此会得到一个用 hXchgKey 加密的Blob。在导入期间,您还需要指定交换密钥来解密blob:
if (!CryptImportKey(
m_hCryptProv,
pbKeyBlob,
dwBlobLen,
hXchgKey,
0,
&m_hKey))
{
//success
}
来自MSDN:
BOOL CryptImportKey( HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey );
hPubKey:
如果密钥BLOB已用密钥交换密钥加密 对,例如SIMPLEBLOB,此参数可以是 密钥交换密钥。