2024-04-01 18:26:14 +08:00

135 lines
2.2 KiB
C++

#include "key.h"
#include "../global.h"
#include "HardDriveSerialNumber.h"
#include "md5.h"
#include "aes.hpp"
key::key()
{
m_crypt = new uint8_t[48];
}
key::~key()
{
if (m_crypt)
delete m_crypt;
}
std::string key::gen_gts_sn(void)
{
return g_gno;
}
std::string key::gen_rtc_sn(void)
{
return std::to_string(g_ScanSerial);
}
std::string key::gen_hd_sn(void)
{
MasterHardDiskSerial* diskSerial = new MasterHardDiskSerial();
std::vector<char> Serial;
diskSerial->GetSerialNo(Serial);
delete diskSerial;
std::string sn;
sn.resize(8);
for (unsigned int i = 0; i < 8; i++)
sn[i] = Serial[i];
return sn;
}
void key::InitKey()
{
//#ifdef _DEBUG
m_gts_sn = "";
m_rtc_sn = "";
//#else
m_gts_sn = gen_gts_sn();
m_rtc_sn = gen_rtc_sn();
//#endif
m_hd_sn = gen_hd_sn();
}
std::string key::get_key(const uint8_t *crypt)
{
m_gts_sn.resize(16);
m_rtc_sn.resize(16);
m_hd_sn.resize(16);
if (crypt)
{
for (int i = 0; i < 48; i++)
m_crypt[i] = crypt[i];
struct AES_ctx ctx;
AES_init_ctx(&ctx, crypt_key);
AES_ECB_decrypt(&ctx, m_crypt);
AES_ECB_decrypt(&ctx, m_crypt + 16);
AES_ECB_decrypt(&ctx, m_crypt + 32);
for (int i = 0; i < 16; i++)
m_gts_sn[i] = m_crypt[i];
for (int i = 0; i < 16; i++)
m_rtc_sn[i] = m_crypt[i + 16];
for (int i = 0; i < 16; i++)
m_hd_sn[i] = m_crypt[i + 32];
}
m_key.resize(16);
for (int i = 0; i < 16; i++)
m_key[i] = m_gts_sn[i] ^ m_rtc_sn[i];
for (int i = 0; i < 16; i++)
m_key[i] ^= m_hd_sn[i];
m_key = md5(m_key);
return m_key;
}
uint8_t * key::get_crypt(void)
{
struct AES_ctx ctx;
m_gts_sn.resize(16);
m_rtc_sn.resize(16);
m_hd_sn.resize(16);
for (int i = 0; i < 16; i++)
m_crypt[i] = m_gts_sn[i];
for (int i = 16; i < 32; i++)
m_crypt[i] = m_rtc_sn[i - 16];
for (int i = 32; i < 48; i++)
m_crypt[i] = m_hd_sn[i - 32];
AES_init_ctx(&ctx, crypt_key);
AES_ECB_encrypt(&ctx, m_crypt);
AES_ECB_encrypt(&ctx, m_crypt + 16);
AES_ECB_encrypt(&ctx, m_crypt + 32);
return m_crypt;
}
void key::aes_encrypt(uint8_t *data)
{
struct AES_ctx ctx;
AES_init_ctx(&ctx, crypt_key);
AES_ECB_encrypt(&ctx, data);
}
void key::aes_decrypt(uint8_t *data)
{
struct AES_ctx ctx;
AES_init_ctx(&ctx, crypt_key);
AES_ECB_decrypt(&ctx, data);
}