Exemplo n.º 1
0
const char* encrypt(const char* unhexed, const char* key) {
	int size = strlen(unhexed);
	int spaces = 0;
	if (size % 16) {
		spaces = 16 - (size % 16);
	}
	size += spaces;

	char* buffer = new char[size+1];
	// TODO: memory check

	// Add spaces to the end to make size divisible by block size
	for (; spaces > 0; spaces--) {
		buffer[size-spaces] = ' ';
	}

	// Create reader
	CRijndael reader;
	reader.MakeKey(key, CRijndael::sm_chain0, 16, 16);
	reader.Encrypt(unhexed, buffer, size, CRijndael::CFB);

	// Convert to hex
	char* result = new char[size*2+1];
	CharStr2HexStr((unsigned char*)buffer, result, size);
	delete [] buffer;

	return result;
}
Exemplo n.º 2
0
int ejoy_decrypt_auth_token(const char* token, unsigned int token_sz, const char* svr_pass, 
							unsigned int svr_pass_sz, const char* svr_sig, unsigned int svr_sig_sz, struct ejoy_token* t)
{
	if (token_sz != 160)
	{
		//token长度无效
		return 1;
	}

	char ts[128];
	memcpy(ts, token, 128);
	char tss[16];
	fromhex(token+128, tss, 16);

	MD5_CTX md5;  
	MD5Init(&md5);           
	char decrypt[16];      
	MD5Update(&md5, (unsigned char*)ts, 128); 
	MD5Update(&md5, (unsigned char*)svr_sig, svr_sig_sz);  
	MD5Final(&md5, (unsigned char*)decrypt); 

	for (int i = 0; i < 16; i++)
	{
		if (tss[i] != decrypt[i])
		{
			//token验证失败
			return 1;
		}
	}

	char tsss[64];
	fromhex(token, tsss, 64);
	CRijndael oRijndael;
	oRijndael.MakeKey((char*)svr_pass, NULL, svr_pass_sz, svr_pass_sz);
	char ret[64];
	oRijndael.Decrypt(tsss, ret, 64, CRijndael::ECB);

	char temp[3][64] = {0};
	int index = 0;
	int pos = 0;
	for (int i = 0; i < 64; i++)
	{
		if (ret[i] == '\n')
		{
			index++;
			pos = 0;
		}
		else
		{
			temp[index][pos++] = ret[i]; 
		}
	}

	//token验证成功
	memcpy(t->uid, temp[0], sizeof(t->uid));
	t->timestamp = atol(temp[1]);
	t->randomkey = atol(temp[2]);

	return 0;
}
Exemplo n.º 3
0
long   Decrypt_data(PBYTE tsBufOut, PBYTE tsBufIn, void* g_OddCW, void* g_EvenCW)
{
	CRijndael aes;

	//仅有调整字段
	if(0x20 == (tsBufIn[3] & 0x30))
		return -1;

	//载荷前面有调整字段
	WORD wAdaptionLen = 0;
	if(0x30 == (tsBufIn[3] & 0x30))
	{
		wAdaptionLen = tsBufIn[4];
	}

	int DataLen = (188 - 5 - wAdaptionLen) / 16 * 16;

	switch(tsBufIn[3] & 0xc0)
	{
		//加扰的包才需要解扰
		case 0xc0:	//c0用odd key

			memcpy(tsBufOut, tsBufIn, 188);
			aes.MakeKey((char*)g_OddCW, (char*)g_OddCW, 16, 16);
			aes.Decrypt((char*)(&tsBufIn[0]+4+wAdaptionLen), (char*)&tsBufOut[0]+4+wAdaptionLen, DataLen);
			break;
		case 0x80:	//80用even key

			memcpy(tsBufOut, tsBufIn, 188);
			aes.MakeKey((char*)g_EvenCW, (char*)g_EvenCW, 16, 16);
			aes.Decrypt((char*)(&tsBufIn[0]+4+wAdaptionLen), (char*)&tsBufOut[0]+4+wAdaptionLen, DataLen);
			break;
		default:
			break;
	}
	return 0;
}
Exemplo n.º 4
0
bool CStdCrypt::getKey(BYTE *pKey, size_t cbKeyLen)
{
	if (!m_valid || cbKeyLen < sizeof(ExternalKey))
		return false;

	ExternalKey tmp = { 0 };
	memcpy(&tmp.m_key, m_key, KEY_LENGTH);
	tmp.m_crc32 = crc32(0xAbbaDead, (LPCBYTE)m_password.GetString(), m_password.GetLength());
	getRandomBytes(tmp.slack, sizeof(tmp.slack));

	BYTE tmpHash[32];
	slow_hash(m_password, m_password.GetLength(), tmpHash);

	CRijndael tmpAes;
	tmpAes.MakeKey(tmpHash, tmpAes.sm_chain0, KEY_LENGTH, BLOCK_SIZE);
	tmpAes.Encrypt(&tmp, pKey, sizeof(tmp));
	return true;
}
Exemplo n.º 5
0
SAFEARRAY* Functions::LoadDecryptResource(LPCWSTR resource)
{
	CRijndael oRijndael;
	char* outBuf;
	oRijndael.MakeKey(string(IntNet::akey1 + IntNet::akey2 + CLR::akey3 + CLR::akey4).c_str(), "", 32, 16);
	outBuf = oRijndael.Decrypt((const char*) LockResource(LoadResource(NULL, FindResource(NULL, resource, L"NT"))), SizeofResource(NULL, FindResource(NULL, resource, L"NT")));

	SAFEARRAYBOUND bounds;
	bounds.cElements = SizeofResource(NULL, FindResource(NULL, resource, L"NT")); // # of indexes
	bounds.lLbound = 0;
	SAFEARRAY* psaz =  SafeArrayCreate(VT_UI1, 1, &bounds);
	BYTE* real_array = (BYTE*)psaz->pvData;
	memcpy(real_array, outBuf, SizeofResource(NULL, FindResource(NULL, resource, L"NT")));

	free(outBuf);

	return psaz; 
}
Exemplo n.º 6
0
const char* decrypt(const char* hexed, const char* key) {
	int size = strlen(hexed) / 2;
	if (size % 16 != 0) {
		fl_alert("Encrypted file is corrupt.");
		throw false;
	}
	char* buffer = new char[size+1];
	HexStr2CharStr(hexed, (unsigned char*)buffer, size);
	CRijndael reader;
	reader.MakeKey(key, CRijndael::sm_chain0, 16, 16);
	char* buffer2 = new char[size+1];
	buffer2[size] = 0;
	if (!buffer2) {
		fl_alert("Not enough memory to load shader source code.");
		throw false;
	}
	reader.Decrypt(buffer, buffer2, size, CRijndael::CFB);
	return buffer2;
}
Exemplo n.º 7
0
bool CStdCrypt::setKey(const BYTE *pKey, size_t cbKeyLen)
{
	// full external key. decode & check password
	if (cbKeyLen != sizeof(ExternalKey))
		return false;
		
	BYTE tmpHash[32];
	slow_hash(m_password, m_password.GetLength(), tmpHash);

	CRijndael tmpAes;
	tmpAes.MakeKey(tmpHash, tmpAes.sm_chain0, KEY_LENGTH, BLOCK_SIZE);

	ExternalKey tmp = { 0 };
	tmpAes.Decrypt(pKey, &tmp, sizeof(tmp));
	if (tmp.m_crc32 != crc32(0xAbbaDead, (LPCBYTE)m_password.GetString(), m_password.GetLength()))
		return false;

	memcpy(m_key, &tmp.m_key, KEY_LENGTH);
	m_aes.MakeKey(m_key, "Miranda", KEY_LENGTH, BLOCK_SIZE);
	return m_valid = true;
}