Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 14.10.2011, 10:38   #1
Новичок
 
Регистрация: 14.10.2011
Сообщений: 14
Сказал Спасибо: 5
Имеет 0 спасибок в 0 сообщенях
andrewcik пока неопределено
По умолчанию

Кстати мне функция send возвращает результат своей работы в виде - 50, что это я немогу понять? в описании ошибок нет цифр 50, есть 10000, 10050, 10051 и т.д.
andrewcik вне форума   Ответить с цитированием
Старый 14.10.2011, 14:28   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Цитата:
Сообщение от andrewcik Посмотреть сообщение
Кстати мне функция send возвращает результат своей работы в виде - 50, что это я немогу понять?
функция send возвращает количество отправленных байт, в случае ошибки она возвращает -1
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился спасибкой от:
Старый 14.10.2011, 16:25   #3
Пользователь
 
Регистрация: 17.12.2010
Сообщений: 37
Сказал Спасибо: 13
Имеет 1 спасибку в 1 сообщении
glukmaker пока неопределено
По умолчанию

Я так понял, что в описанном алгоритме шифрации/дешифрации подразумевается 16-байтный ключ. Но сервер присылает нам только 4 байта.

Где брать остальные 12 байтов?

Добавлено через 1 час 0 минут
Вроде понял. Вроде взял не то описание.
нашел такое (8-байтный ключ. младшие 4 байта получаем от сервера, старшие как я понял фиксированные $87546CA1 (или их еще предварительно вычислить нужно?)):

Код:
   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[i] &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);
   }

С учетом вышеприведенного, я перевел это на Дельфи так:

Код:
TXorKeyData=packed array[1..8] of byte;

type TXorKey=packed record
   case boolean of
   true: (KeyArray:TXorKeyData;);
   false: (First_Key:cardinal;
           SecondKey:cardinal;);
   end;

...

procedure XOREncrypt(var data;len:integer;var key:TXorKey);
var
i:integer;
S:Pchar;
temp,temp2:char;
old:Cardinal;
begin
 S:=Pchar(@data);
 temp:=Char(0);
 for i:=0 to len-1 do
   begin
     temp2:=S[i];
     s[i]:=char(ord(temp2) xor key.KeyArray[i and 7] xor ord(temp));
     temp:=s[i];
   end;
   key.First_Key:=Key.First_Key+len;
end;
Правильно? Или я что-то недопонял в сишной реализации алгоритма?

Последний раз редактировалось glukmaker, 14.10.2011 в 16:25. Причина: Добавлено сообщение
glukmaker вне форума   Ответить с цитированием
Старый 14.10.2011, 17:31   #4
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

glukmaker, http://l2ph.coderx.ru/wsvn/filedetai...%2Fuencdec.pas
тебя там интересуют L2Xor.DecryptGP, L2Xor.EncryptGP и L2Xor.InitKey
в методе L2Xor.InitKey параметр Interlude для твоего сервера будет равен 0

Добавлено через 2 минуты
а хотя вот более оптимальный вариант:
delphi Код:
unit CryptXOR; interface type   TxorCrypt = object   public     GKeyS,GKeyR:array[0..15] of Byte;     isInit: Boolean;     keyLen: integer;     procedure InitKey(const XorKey; Interlude: Boolean = False);     procedure DecryptGP(var Data; const Size: Word);     procedure EncryptGP(var Data; const Size: Word);   end; implementation procedure TxorCrypt.DecryptGP(var Data; const Size: Word); var   k:integer;   pck:array[0..0] of Byte absolute Data; begin   if not isInit then Exit;   for k:=size-1 downto 1 do     pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];   if size<>0 then pck[0]:=pck[0] xor GKeyR[0];   Inc(PCardinal(@GKeyR[keyLen-7])^,size); end; procedure TxorCrypt.EncryptGP(var Data; const Size: Word); var   i:integer;   pck:array[0..0] of Byte absolute Data; begin   if not isInit then Exit;   if size<>0 then pck[0]:=pck[0] xor GKeyS[0];   for i:=1 to size-1 do     pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];   Inc(PCardinal(@GKeyS[keyLen-7])^,size); end; procedure TxorCrypt.InitKey(const XorKey; Interlude: Boolean = False); const   KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);   KeyConstInterlude: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97); begin   if Interlude then begin     keyLen:=15;     Move(XorKey,GKeyS,8);     Move(KeyConstInterlude,GKeyS[8],8);   end else begin     keyLen:=7;     Move(XorKey,GKeyS,4);     Move(KeyConst,GKeyS[4],4);   end;   Move(GKeyS,GKeyR,16);   isInit:=True; end; end.
__________________
Я здесь практически не появляюсь!, Skype - ikskor

Последний раз редактировалось xkor, 14.10.2011 в 17:31. Причина: Добавлено сообщение
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился спасибкой от:
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:16.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!