Я так понял, что в описанном алгоритме шифрации/дешифрации подразумевается 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;
Правильно? Или я что-то недопонял в сишной реализации алгоритма?