Как сохранить и получить ключ шифрования, используя BLOB-объект с cryptoApi

Я использую 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 ответ

Вы используете обменный ключ при экспорте ключа, поэтому вы получаете блоб, зашифрованный с помощью ключа hXchgKey. Во время импорта вам также необходимо указать ключ обмена для расшифровки 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, этот параметр может быть дескриптором ключа обмена ключами.

Другие вопросы по тегам