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; }
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; }
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; }
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; }
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; }
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; }
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; }