如何使用带有cryptoApi的Blob存储和检索加密密钥

时间:2019-01-28 13:04:15

标签: encryption visual-c++ blob cryptoapi vc6

我在加密应用程序中使用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具有不同的值。在这种情况下重要吗?我在加密工作上花了更长的时间。任何帮助表示赞赏。

1 个答案:

答案 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,此参数可以是   密钥交换密钥。