Как сохранить ключ шифрования в реестре в CryptoAPI? - PullRequest
0 голосов
/ 12 декабря 2018

Я новичок в MFC и CryptoAPI.Я хочу зашифровать файлы трассировки в моем приложении.Ключ успешно получен с использованием пароля, и я могу зашифровать данные.Зашифрованные данные записываются в файл.При повторном открытии файла ключ становится равным 0, поскольку я его нигде не сохранил.

Я планирую сохранить сгенерированный ключ в реестре.

bool CCrypto::DeriveKey(CString strPassword)
{
    //  Return failure if we don't have a context or hash.
    if(m_hCryptProv == NULL || m_hHash == NULL)
        return false;

    //  If we already have a hash, trash it.
    if(m_hHash)
    {
        CryptDestroyHash(m_hHash);
        m_hHash = NULL;
        if(!CryptCreateHash(m_hCryptProv, CALG_MD5, 0, 0, &m_hHash)) 
            return false;
    }

    //  If we already have a key, destroy it.
    if(m_hKey)
    {
        ::CryptDestroyKey(m_hKey);
        m_hKey = NULL;
    }

    //  Hash the password. This will have a different result in UNICODE mode, as it
    //  will hash the UNICODE string (this is by design, allowing for UNICODE passwords, but
    //  it's important to be aware of this behaviour.
    if(!CryptHashData(m_hHash, (const BYTE*)(LPCSTR)strPassword, strPassword.GetLength() * sizeof(TCHAR), 0)) 
        return false;

    //  Create a session key based on the hash of the password.
    if(!CryptDeriveKey(m_hCryptProv, CALG_RC2, m_hHash, CRYPT_EXPORTABLE, &m_hKey))
        return false;

    HKEY subKey;
    char data[256] = "";
    unsigned long length = 255;
    DWORD disposition;
    char main_key[256] = "Software\\HFS Internal Interface";
    if (RegCreateKeyEx(HKEY_CURRENT_USER, main_key, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &subKey, &disposition) == ERROR_SUCCESS) {
        RegSetValueEx(subKey, "Encryption", 0, REG_SZ, (unsigned char *)m_hKey, length);
    }
    //  And we're done.
    return true;
}

Но когда m_hKeyтипа HCRYPTKEY преобразуется в символы Юникода.Мне нужно хранить правильный ключ в реестре.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 15 января 2019

вы сериализуете дескриптор ключа, а не данные ключа, вероятно, вы должны экспортировать ключ после шифрования через CryptExportKey и импортировать его в дешифровании через CryptImportKey

Более того, если вы получаете ключ из хеша, почему бы несохранить хэш в реестре, а затем снова извлечь его из этого хеша

...