PDA

Просмотр полной версии : Помогите разобраться с шифровкой дешифровкой трафика


Deadly
05.03.2010, 01:36
помогите разобраться с этим делом допустим как из "чистого" трафика где все время случайные байты сделать уже привычный трафик л2 и обратно читал тут все статьи ничего не нашел.

dmitry501
05.03.2010, 13:11
байты трафика xor-ятся с байтами ключа, потом ключ меняется и все повторяется по кругу. Подробности в поиске, в гугле и т.д.

QaK
05.03.2010, 19:21
читал тут все статьи ничего не нашел.
ой пиндеж, причем весьма нахальный ...

alexteam
05.03.2010, 21:39
мне бы ваши проблемы ©

Deadly
06.03.2010, 01:06
ну хз есдинственное что я понял это то что вначале с 1 пакетом приходит ключ потом каждый пришедший пакет имеет тож свой хор ключ и как то из этих 2 ключей дщелается 1 и понему расшифровывается пакет я правильно понял?

Добавлено через 11 минут
а конкретно меня интересует шифрация гейм сервера :

1)Сервер проверяет, можно ли подключится к выбранному GS, если да - сервер присылает пакет PlayOk, содержащий SessionKey2. Иначе, сервер присылает пакет PlayFail, содержащий информацию почему нельзя подключится.

ну тут все понятно

2)Сервер присылает пакет FirstKey, содержащий первые 4 байта ключа XorKey

это 1 ключ?

Добавлено через 2 минуты
а дальше мне вобще понравилось :

1.2. Шифрация пакетов GameServer'a:
Чтобы не загружать ваши и без того замученные головы, вместо алгоритмов, я дам готовые исходники (немного измененные для наглядности):
(лучшебы алгоритм блин дал я ничего непонял)

char key_sc[8];
char key_cs[8];

void Encrypt(char *raw, int size)
{
int temp = 0;
for (int i=0; i<size; i++)
{
int temp2 = raw &0xff;
raw[i] = (char)(temp2 ^ (key_cs[i&7] &0xff) ^ temp);
temp = raw[i];
}
int old = key_cs[0] &0xff;
old |= key_cs[1] << 8 &0xff00;
old |= key_cs[2] << 0x10 &0xff0000;
old |= key_cs[3] << 0x18 &0xff000000;
old += size;
key_cs[0] = (char)(old &0xff);
key_cs[1] = (char)(old >> 0x08 &0xff);
key_cs[2] = (char)(old >> 0x10 &0xff);
key_cs[3] = (char)(old >> 0x18 &0xff);
}


void Decode(char *input, int size)
{
int i = 0;
int j = 0;
for(int k=0; k < size; k++)
{
int i1 = input[k] & 0xFF;
input[k] = (char)(i1 ^ key_sc[j++] & 0xFF ^i);
i = i1;
if(j>7) j=0;
}
long l = key_sc[0] & 0xFF;
l |= key_sc[1] << 8 & 0xFF00;
l |= key_sc[2] << 16 & 0xFF0000;
l |= key_sc[3] << 24 & 0xFF000000;
l += size;
key_sc[0] = (char)(l & 255L);
key_sc[1] = (char)(l >> 8 & 255L);
key_sc[2] = (char)(l >> 16 & 255L);
key_sc[3] = (char)(l >> 24 & 255L);
}


void Key(char* packet, int len)
{
key_sc[0] = packet[4];
key_sc[1] = packet[5];
key_sc[2] = packet[6];
key_sc[3] = packet[7];
key_sc[4] = (char)0xA1;
key_sc[5] = (char)0x6C;
key_sc[6] = (char)0x54;
key_sc[7] = (char)0x87;
for(i=0;i<8;i++) {key_cs[i]=key_sc[i];}
}

void add_ckecksum(unsigned char *raw, int count) //вычисляет чексумму и вставляет её в пакет
{ //как пользоватся: add_ckecksum(CelyjPaket+2, DlinaPaketa-(2+4+4));
unsigned long chksum = 0;
unsigned long ecx;
int i = 0;
for(i = 0; i < count; i += 4)
{
ecx = (unsigned long)raw[i];
ecx |= (unsigned long)raw[i + 1]<<8;
ecx |= (unsigned long)raw[i + 2]<<16;
ecx |= (unsigned long)raw[i + 3]<<24;
chksum ^= ecx;
}
memcpy(raw+count, (char *)&chksum, 4);
}

Во первых заметьте, что после каждой шифрации или дешифрации ключ которым мы пользовались, будет изменен! И обратите особое внимание, у нас два ключа!!! Одним мы шифруем пакеты, которые мы отправляем серверу, вторым мы дешифруем пакеты которые сервер присылает нам. Процедура Key из данных пакета FirstKey устанавливает нам оба ключа (изначально ключи равны друг-другу).

Да, и забыл сказать - и Blowfish, и Xor-шифрация шифруют пакет начиная с третего байта! (т.е. первые два байта, означающие размер пакета - НЕ ШИФРУЮТСЯ НИКОГДА!!!)

может кто прокоментировать этот скрипт что как в нем делается.
к моему сожелению я знаю только делфи и паскаль) в с++ я почти не шарю.

[I]Добавлено через 12 минут
1 ключ я выделил вот он
21002E01A15F865EDD485A31C8279301A16C31970100000000 0000000000000000
(все время не меняется а дальше после него чуш идет)
а вот что дальше делать пока хз надеюсь на вашу помощ