Я новичок в 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
преобразуется в символы Юникода.Мне нужно хранить правильный ключ в реестре.Любая помощь приветствуется.