Всем привет!
Пытаюсь внутри кода выполнить дешифровку строк, в которых прописаны пути до ключей реестра. Код следующий:
На выходе получаю такую лажу:
Путём небольших экспериментов понимаю что функция дешифровки нормально отрабатывает только первый раз. Потом начинает гнать тарабарщину. Такое чувство как-будто что то не очищаю перед повторным использованием. Только не могу понять что именно.
Для шифровки использую AES с режимом CBC на таком сервисе: https://tophix[.]com/ru/development-tools/encrypt-text
Подскажите, куда копнуть?
Пытаюсь внутри кода выполнить дешифровку строк, в которых прописаны пути до ключей реестра. Код следующий:
C++:
#include <windows.h>
#include <bcrypt.h>
#include <iostream>
#include <vector>
#include <ntstatus.h>
#pragma comment(lib, "bcrypt.lib")
void handleError(NTSTATUS status, const wchar_t* msg) {
if (status != STATUS_SUCCESS) {
std::cerr << "Error: " << std::hex << status << std::endl;
std::wcout << msg;
exit(1);
}
}
std::vector<BYTE> aesDecrypt(const std::vector<BYTE>& ciphertext, const std::vector<BYTE>& key, const std::vector<BYTE>& iv) {
BCRYPT_ALG_HANDLE hAlg = nullptr;
BCRYPT_KEY_HANDLE hKey = nullptr;
DWORD cbData = 0;
NTSTATUS status;
// Создание алгоритма AES
handleError(BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_AES_ALGORITHM, nullptr, 0), L"Create algoritm AES decr");
// Создание ключа
handleError(BCryptGenerateSymmetricKey(hAlg, &hKey, nullptr, 0, (PUCHAR)key.data(), key.size(), 0), L"Create keys decr");
// Установка IV
handleError(BCryptSetProperty(hKey, BCRYPT_INITIALIZATION_VECTOR, (PUCHAR)iv.data(), iv.size(), 0), L"Setup IV decr");
// Подготовка буфера для расшифровки
std::vector<BYTE> plaintext(ciphertext.size());
// Расшифровка
handleError(BCryptDecrypt(hKey, (PUCHAR)ciphertext.data(), ciphertext.size(), nullptr, (PUCHAR)iv.data(), iv.size(),
plaintext.data(), plaintext.size(), &cbData, BCRYPT_BLOCK_PADDING), L"Decryptus");
plaintext.resize(cbData);
// Освобождение ресурсов
BCryptDestroyKey(hKey);
BCryptCloseAlgorithmProvider(hAlg, 0);
return plaintext;
}
int main() {
std::string key_str = "01234567890123456789012345678901";
std::string iv_str = "0123456789012345";
std::vector<BYTE> key(key_str.begin(), key_str.end());
std::vector<BYTE> iv(iv_str.begin(), iv_str.end());
// Environment
std::vector<BYTE> subKey_crt = {
0xb3, 0x0c, 0xf7, 0x52, 0x66, 0x6c, 0x35, 0x6b, 0xb7, 0x21, 0x16, 0xec, 0x6f, 0x60, 0xbf, 0xf2
};
// UserinitMprLogonScript
std::vector<BYTE> valueName_crt = {
0x5c, 0xff, 0xb7, 0xba, 0xac, 0x38, 0x72, 0xae, 0xac, 0x65, 0x9f, 0x69, 0x45, 0x1e, 0x04, 0xac, 0x07, 0xaf, 0x3e, 0xe0, 0x65, 0x18, 0x02, 0x79, 0xc6, 0x63, 0x9b, 0x10, 0xc1, 0xec, 0xfa, 0x1e
};
// C:\\folder\\mobsync.exe
std::vector<BYTE> valueData_crt = {
0x7a, 0xf6, 0xf6, 0x66, 0xf9, 0x41, 0x77, 0x21, 0xed, 0x77, 0xca, 0xd3, 0xb1, 0xfc, 0x31, 0xe4, 0x9a, 0x91, 0x0e, 0x71, 0x98, 0x49, 0x04, 0x4f, 0x8a, 0x6d, 0xe5, 0x2e, 0xdd, 0xd0, 0x8a, 0xa6
};
// Расшифровка
std::vector<BYTE> subKey = aesDecrypt(subKey_crt, key, iv);
std::cout << "Decrypted: \n";
for (BYTE b : subKey) {
std::wcout << (wchar_t)b;
}
std::cout << std::endl;
std::vector<BYTE> valueName = aesDecrypt(valueName_crt, key, iv);
for (BYTE b : valueName) {
std::wcout << (wchar_t)b;
}
std::cout << std::endl;
std::vector<BYTE> valueData = aesDecrypt(valueData_crt, key, iv);
for (BYTE b : valueData) {
std::wcout << (wchar_t)b;
}
std::cout << std::endl;
return 0;
}
На выходе получаю такую лажу:
Путём небольших экспериментов понимаю что функция дешифровки нормально отрабатывает только первый раз. Потом начинает гнать тарабарщину. Такое чувство как-будто что то не очищаю перед повторным использованием. Только не могу понять что именно.
Для шифровки использую AES с режимом CBC на таком сервисе: https://tophix[.]com/ru/development-tools/encrypt-text
Подскажите, куда копнуть?