этот пакет ты взял из Пх ? так вот это расшифрованный пакет.
из сылки которую постил ты же
Цитата:
RequestGGAuth
Формат:
22 00 // Длина
07 // Тип
XX XX XX XX // ID сессии
23 92 90 4d
18 30 b5 7c
96 61 41 47
05 07 96 fb
00 00 00
f2 12 ba a9 // чексумма
00 00 00 00
если по русски то пакет(42байта) состоит из 2 байта размер, 36 байт дата (1 байт ид пакета, 4 байта сесион ид, 3 по 4 байта это для ГГ, 4 байта ноль), 4байта чек сумма.
сначало собирается пакет потом этот пакет без размера (помни длинна пакета -2) отдается блоуфишу.
этот пакет ты взял из Пх ? так вот это расшифрованный пакет.
из сылки которую постил ты же
если по русски то пакет(42байта) состоит из 2 байта размер, 36 байт дата (1 байт ид пакета, 4 байта сесион ид, 3 по 4 байта это для ГГ, 4 байта ноль), 4байта чек сумма.
сначало собирается пакет потом этот пакет без размера (помни длинна пакета -2) отдается блоуфишу.
Этот пакет который должен быть , а это пакет который я собрал
вся проблема в том что я не знаю где брать последние 2 байта у меня 00 00 а должно быть 1C FC но оно почему то постоянно меняется, я не знаю почему, и откуда брать эти 2 последних байта...
Ты меня не совсем понимаешь) я делаю перевожу с la2_client_emu (Исходник авторизации на Delphi) вся проблема в том что там откуда не возьмись берутся нужные байты...
Во вторых я посылаю на функцию Encode
Вот скрипт функции
Код:
public static byte[] Encode(byte[] data, int _len)
{
int i, len;
byte[] DBuff = new byte[8];
len = _len ;
for (i = 0; i < len / 8; i++)
{
Array.Copy(data, i * 8, DBuff, 0, 8);
DBuff = EncodeBlock(DBuff);
//Debug.Log("Encode : " + BitConverter.ToString(DBuff).Replace("-"," ")) ;
Array.Copy(DBuff, 0, data, i * 8, 8);
}
return data;
}
//Запись в банк всеми символами их всего 42
Array.Copy(send_buff, 0, temp_buff, 0, Len);
//Декорируем
BlowFish.Encode(temp_buff,Len);
//И записываем где было со второго символа и без последних 2-х...
первые 2 байта это размер пакета они не шифруются именно поэтому Array.Copy(temp_buff, 0, send_buff, 2, Len-2); //пропускаем 2 байта и длинну уменьшаем -2
БФ он блочный поэтому если шифровать "не с того" символа получится не то что надо...
Последний раз редактировалось lamo386, 31.12.2012 в 19:23.
первые 2 байта это размер пакета они не шифруются именно поэтому Array.Copy(temp_buff, 0, send_buff, 2, Len-2); //пропускаем 2 байта и длинну уменьшаем -2
БФ он блочный поэтому если шифровать "не с того" символа получится не то что надо...
И весь остальной код, неправельный это из за того что последних 2 символа не те?
Добавлено через 6 минут
так в том то и дело что те символы я отправляю
Добавлено через 17 минут
В чем вопрос откуда берутся этих 2 последних символа?
И откуда их брать мне, потому что сейчас тут уже B8 00
Последний раз редактировалось zAvaTARz, 31.12.2012 в 20:51.
Причина: Добавлено сообщение
мож я чот не понял, но так он ж написал - чек сумма размер и чек сумма это несколько разные вещи. размер - по сути длинна, а чек сумма это что-то типа срс у файла. она нужна на случай повреждения информации. типа пакет пришел, размер совпадает те-же 5 символов к примеру, но к примеру четвертый символ пришел не верный - пришла двойка вместо тройки из-за глюка где-то в сети. вот чек сумма и должна этот момент проверить, типа на случай если пакет битый - то попросить прислать этот пакет еще раз.
//Стартовый ключ инцилизации
bf_key = HexToStr("6B60CB5B82CE90B1CC2B6C556C6C6C6C");
//Инцилизируем ключ
BlowFish.Init(bf_key) ;
//Хекс преобразуем в байты, а байты это строки
public string HexToStr (string s) {
int i;
result = "" ;
Debug.Log("hex " + s + " " + s.Length) ;
//for i:=1 to (Length(s) div 2) do begin
for (i=0; i < (s.Length/2); i++) {
//Преобразуем символы
result = result + Convert.ToChar(Convert.ToInt32("" + s[i*2] + s[(i*2)+1],16)) ;
}
//Debug.Log("MyFunc : " + result);
i = 0 ;
return result;
}
Код:
public static void Init(string Key1)
{
long i, j;
long data, datal, datar;
long Size;
byte[] Key = new byte[Key1.Length];
//Key = BitConverter.GetBytes(Key1);//(byte[])Funcs.DeepClone(Key1);
//for i:=0 to Size-1 do key[i]:=Ord(key1[i+1]);
Size = Key1.Length;
for (int _i = 0; _i < Size; _i++)
{
Key[_i] = Convert.ToByte(Key1[_i]) ;
}
for (i = 0; i < 18; i++)
PArray[i] = BlowFishConsts.bf_P[i];
for (i = 0; i < 4; i++)
{
for (j = 0; j < 256; j++)
{
SBoxes[i, j] = BlowFishConsts.bf_S[i, j];
}
}
j = 0;
for (i = 0; i < 18; i++)
{
data = ((Key[j] & 0xFF) << 24) | ((Key[(j+1) % Size] & 0xFF) << 16) | ((Key[(j+2) % Size] & 0xFF) << 8) | (Key[(j+3) % Size] & 0xFF);
PArray[i] = PArray[i] ^ data;
j = (j + 4) % Size;
}
datal = 0;
datar = 0;
for (i = 0; i < 9; i++)
{
Blowfish_encipher(ref datal, ref datar);
PArray[i*2] = datal;
PArray[i*2 + 1] = datar;
}
for (i = 0; i < 4; i++)
for (j = 0; j < 128; j++)
{
Blowfish_encipher(ref datal, ref datar);
SBoxes[i, j*2] = datal;
SBoxes[i, j*2 + 1] = datar;
}
}
Не знаю что может такое и быть, не знал что с конечной шифрайцией будут такие проблемы...
Пакет верный, почему не шифрует так как надо, есть у кого скрипты на C#?