Возникла проблема с этим пакетом. Не могу понять как его зашифровать с помощью алгоритма шифрации RC4.
Использую эти алгоритмы:
C#:
Код:
using System;
namespace OOGLibrary.Cryptography
{
class RC4
{
public RC4()
{
for (int i = 0; i < 256; i++)
m_Table[i] = Convert.ToByte(i);
m_Shift1 = 0;
m_Shift2 = 0;
}
public void Shuffle(byte[] Key)
{
byte Shift = 0;
for (int i = 0; i < 256; i++)
{
byte A = Key[i % 16];
Shift += (byte)(A + m_Table[i]);
byte B = m_Table[i];
m_Table[i] = m_Table[Shift];
m_Table[Shift] = B;
}
}
public byte Encode(byte InPacket)
{
m_Shift1++;
byte A = m_Table[m_Shift1];
m_Shift2 += A;
byte B = m_Table[m_Shift2];
m_Table[m_Shift2] = A;
m_Table[m_Shift1] = B;
byte C = (byte)(A + B);
byte D = m_Table[C];
return (byte)(InPacket ^ D);
}
private byte m_Shift1;
private byte m_Shift2;
private byte[] m_Table = new byte[256];
}
}
Delphi:
Код:
type
TRC4 = class
private
S: array[0..255] of Byte;
x,y: Integer;
public
constructor Create; virtual;
procedure Init(Key: THexData);
procedure Swap(Index1,Index2: Integer);
function Encode(Data: THexData): THexData;
function Decode(Data: THexData): THexData;
function KeyItem: Byte;
end;
implementation
{ TRC4 }
constructor TRC4.Create;
begin
x:= 0;
y:= 0;
end;
function TRC4.Decode(Data: THexData): THexData;
begin
Result:= Encode(Data);
end;
function TRC4.Encode(Data: THexData): THexData;
var
cipher: THexData;
m: Integer;
begin
FillChar(cipher,SizeOf(cipher),0);
for m:= 0 to Data.Size-1 do
cipher.Bytes[m]:= Byte(Data.Bytes[m] xor KeyItem);
cipher.Size:= Data.Size;
Result:= cipher;
end;
procedure TRC4.Init(Key: THexData);
var
i,j: Integer;
begin
for i:= 0 to 255 do
begin
S[i]:= Byte(i);
end;
j:= 0;
for i:= 0 to 255 do
begin
j:= (j + S[i] + Key.Bytes[I mod Key.Size]) mod 256;
Swap(i,j);
end;
end;
function TRC4.KeyItem: Byte;
begin
x:= (x+1) mod 256;
y:= (y + S[x]) mod 256;
Swap(x,y);
Result:= S[(S[x] + S[y]) mod 256];
end;
procedure TRC4.Swap(Index1, Index2: Integer);
var
temp: Byte;
begin
temp:= s[index1];
s[Index1]:= s[index2];
s[Index2]:= temp;
end;
С начальными пакетами разобрался, где нет шифрации, 0x01 ServerInfo, 0x03 LogginAnnounce, 0x02 SMKey, все как надо выполняется. А вот шифрацию не могу понять. Помогите разобраться пожалуйста. Ответ напишите в личку или тут.
мда...опять никто помогать не хочет)) сам разобрался с шифровкой RC4)) пакет зашифровал, отправил. в ответ получил запакованный и зашифрованный пакет. может кто поможет с распаковкой разобраться? желательно бы на Delphi.
Немного забросил OOG разработку, но вот решил снова восстановить. На C# все работает, RC4 шифровка и расшифровка, распаковка пакетов тоже работает. Но вот чего не могу сказать про Delphi. На Delphi какая-то интересная ситуация получается. Пакет 0x02 CMKey зашифровал, отправил, в ответ получил зашифрованный и запакованный пакет. Расшифровываю пакет, получается белиберда, расшифровывается не правильно. Ключ для RC4 создаю с помощью такой функции:
function GetKey(login : AnsiString; key : TBArray) : TBArray;
var nhash : TBArray;
i : integer;
begin
SetLength(nhash, Length(hash) + Length(key));
for i := 0 to Length(hash)-1 do
begin
nhash[i] := hash[i];
end;
for i := 0 to Length(key)-1 do
begin
nhash[Length(hash)+i] := key[i];
end;
hash := AnsiStringToByteArray(HMAC_MD5(ByteArrayToAnsiString(nhash),login));
GetKey := hash;
end;
RC4 ключ для шифровки естественно создаю с помощью ключа из пакета 0x02 SMKey, а для расшифровки с помощью ключа созданного рандомно который передаю в пакете 0x02 CMKey.
Вот как я зашифровываю и расшифровываю на C#:
Код:
rc4enckey = GetKey(enckey,hash,tbLogin.Text);
rc4deckey = GetKey(deckey,hash,tbLogin.Text);
encoder = new RC4(rc4enckey);
decoder = new RC4(rc4deckey);
byte[] res = encoder.Encode(Send.ToArray(), (byte)Send.Count);
byte[] res2 = decoder.Decode(data, data.Length);
И как результат, на C# все работает, на Delphi только шифровка работает, расшифровка не работает. Реализацию RC4 использую такую же, какая написана в моем первом посте. А реализовать все это нужно на Delphi. Помогите пожалуйста разобраться, уже не знаю где моя ошибка. Функции правильные, так как шифровка проходит правильно, мой пакет 0x02 CMKey зашифрованный сервер принимает.
Ну естественно я читал про RC4, неужели я бы методом тыка стал бы что-то делать.
Разобрался сам, я по своей не внимательности допустил ошибку в функции генерации ключа для RC4. Видимо после праздников голова плохо соображала) Еще бы разобраться с распаковкой на Delphi.
Это я знаю... там надо составить один ключ хэшированием, другой получить рандомно... вот эти процессы бы в правильной последовательности увидеть. Не в виде кода, а так сказать логику понять.
Люди, подскажите или ткните носом, алгоритм без привязки к языку как составить сообщение СМ 0х02.
byte - тип пакета (02)
byte - длина пакета (12)
byte - длина хэша (10)
bytes[16] - рандомный хэш (DecHash), который нужно запомнить
byte - усиленный вход (00 или 01)
Получится примерно такое:
Код:
021210C8759613B8B13A580C49D92B848BB1EC00
EncHash получаем из пакета S02 (с 4-го до предпоследнего байта - хэш)
Перед тем, как отправить, получаем два ключа:
RC4_Key_CS = HMACMD5(Login){Hash + EncHash} ; используется для шифрации трафика C->S
RC4_Key_SC = HMACMD5(Login){Hash + DecHash} ; используется для шифрации трафика S->C
Затем полученный выше пакет шифруется RC4, используя в качестве ключа RC4_Key_CS. И отправляется.
Все принятые пакеты дешифруются RC4, используя RC4_Key_SC.
Логика вот в чём. Сервер в C02 получает тот ключ, которым ОН будет шифровать нам трафик, чтобы не было разногласий. Примерно так:
Цитата:
Клиент: Сервер, лови хэш, который я сделал
Сервер: отлично, поймал, сделал ключ. Теперь я буду тебе этим ключом шифровать трафик.
Клиент: ок, босс, я тогда буду его расшифровывать тем же ключом
________________
Больше не занимаюсь читами, ушёл в серверную часть. Новый ник - int 3.
P.S. Но я всё такой же добрый модератор раздела PW.
Последний раз редактировалось Smertig; 22.07.2013 в 15:20.