Проблема с дешифрацией пакета Init и RequestAuthLogin
Добрый день.
Разбираюсь с протоколом обмена пакетами от логин сервера клиенту и от клиента логин серверу. Сервер Gracia Final. Опишу проблему:
Есть Init пакет от сервера
Код:
BA 00 54 9D 09 44 0C 5A 1C 20 26 16 C7 7B 3B DF
D5 1B 90 3D CD F9 9E FD C5 1E 4A A7 83 B1 A0 11
73 2C 7D 32 EC DD DC FA 20 84 B1 F9 74 DA 47 02
03 53 BB 37 6E 4D 82 24 B9 B8 E8 FB F1 43 2E 09
C1 42 9F FA 25 7E 87 E8 6C 1D 34 6F 0B FB 5A F5
F0 CD 4D 11 E2 A0 A2 82 35 78 1B 8F D0 12 7E F0
70 4A E8 AE 95 75 F0 C0 23 9B 5D E2 E4 D4 B6 E2
35 4A EA D0 12 9D 6E 35 4C 93 AB 24 B5 4C 7D 1F
21 BE 5E DA 43 1A D0 51 86 B3 7B D3 A1 45 59 8F
15 CF D3 96 6B 0F 56 D5 40 BA 35 21 CD 53 D3 95
B2 7A 22 79 67 31 94 77 3B F0 00 6D 38 3A 11 88
3E 6D AC 03 CB 3F 4D C7 87 F1
Расшифровали его, получили (раскидал по строчкам для удобства):
Код:
00
B8 58 00 00
21 C6 00 00
E4 FE 76 80 3B 52 53 27 A1 CD DD EC 57 B4 50 51 23 A3 5A 65 10 34 70 BE 20 04 2C AA 0F 77 14 0F 70 DA C8 35 07 1E 1F 53 50 E9 B3 A4 80 66 42 AD 90 BC 2D F9 AC 96 98 E1 CD 7F FF 75 90 5A 9F 6E 54 7C F7 CB 8B 68 F9 C3 98 55 85 9B E6 38 3A 67 85 00 81 38 01 BD 02 95 D9 C0 E4 F3 ED 30 AF EB BB 8F CE 61 A0 C6 EF C5 61 0C F8 00 DB 88 79 72 33 4A 15 15 F7 A0 10 06 61 91 F3 49 01 66 5E 9B
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
44 0E 96 F7 FB 9F 7B 66 29 66 D5 F8 C2 9E 5C 5E
14 E6 7F 1F 8F 67 82
FA DD AB FE
6C EA 53 54
Пакет от клиента RequestAuthLogin
Код:
B2 00 12 38 BF 78 4F 10 EF 89 E7 A4 78 A6 CB A1
4B 2E F4 4B FE 8C 9B B0 F0 F0 09 25 27 4E 58 D4
AD 90 02 B0 68 97 33 73 00 27 CC 0F B9 35 CB A2
26 FC 23 11 AA 4B 78 26 18 0F AB 13 A6 53 E2 3A
58 A5 B7 A5 E0 98 34 F5 B8 D1 A3 B0 C4 08 93 40
12 71 A1 06 86 F6 2A AA C9 93 48 4A 1E BF 37 6E
C4 84 2D 13 7B C6 96 BF 7C 50 F9 F2 37 24 F3 9E
B3 EA F1 B6 82 20 C8 69 A2 46 AF 32 A3 6A 78 C6
D9 F3 2C 14 42 E3 1D 43 91 14 9F ED 37 7D A3 B8
31 14 04 00 B3 29 AE 0C 50 26 9F ED 37 7D A3 B8
31 14 BE 24 61 A1 60 CB 7E 97 9F ED 37 7D A3 B8
31 14
Расшифровали его, получили (раскидал по строчкам для удобства):
Код:
00
12 C8 0E 6F AE B2 8A FF 3A 3A AC 35 06 41 DA 6F 8E 04 82 A7 86 7D 1B 74 A2 53 2C 50 D7 80 1D 70 0F 38 6F D9 FC 18 37 D7 17 C2 8B 85 DD 47 87 68 FA 3C 6C CF 69 75 F0 79 23 03 B8 75 01 CA 2F 0F 9D A6 A1 3C DF FA 61 07 33 41 C9 7B F6 AB FC 3A C7 B4 0A 60 44 83 F4 DF AF 85 D6 09 C2 DA 19 AB 09 BC D1 03 85 F2 6D A3 BF 77 24 06 AC B8 E1 B4 17 E4 9E AB 01 ED 2F FB 85 02 9A 56 B8 E8 9E 90
B8 58 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00
08
00 00 00 00 00 00 00 00
00 00
F5 18 6A 0D 00 00 00 00
00 00 00 00 00 00 00 00
Проблема состоит в том что не могу повторить зашифрованный участок RequestAuthLogin а именно:
Код:
12 C8 0E 6F AE B2 8A FF 3A 3A AC 35 06 41 DA 6F 8E 04 82 A7 86 7D 1B 74 A2 53 2C 50 D7 80 1D 70 0F 38 6F D9 FC 18 37 D7 17 C2 8B 85 DD 47 87 68 FA 3C 6C CF 69 75 F0 79 23 03 B8 75 01 CA 2F 0F 9D A6 A1 3C DF FA 61 07 33 41 C9 7B F6 AB FC 3A C7 B4 0A 60 44 83 F4 DF AF 85 D6 09 C2 DA 19 AB 09 BC D1 03 85 F2 6D A3 BF 77 24 06 AC B8 E1 B4 17 E4 9E AB 01 ED 2F FB 85 02 9A 56 B8 E8 9E 90
Участок который шифрую создавал по примеру:
Код:
[начало зашифрованного блока]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20
00 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Login (учтите, эта строка - массив из 14 символов)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...)
[конец зашифрованного блока]
Код:
vb Код:
Dim modulo As BigInteger = New BigInteger(modul)Dim res As BigInteger
DimexpAs BigInteger = "65537"Dim logpas(127)As Byte
logpas(95) = &H20
Array.Copy(Encoding.Default.GetBytes("&&&&&&&&&"), 0, logpas, 98, "&&&&&&&&&".Length)Array.Copy(Encoding.Default.GetBytes("&&&&&&&&&"), 0, logpas, 112, "&&&&&&&&&".Length)Dim lg As BigInteger = New BigInteger(logpas)
res = BigInteger.ModPow(lg, exp, modulo)
Подскажите, пожалуйста, какой будет RSA ключ.
Последний раз редактировалось xkor, 23.04.2010 в 18:58.
[начало зашифрованного блока]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 24 00 00
XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Login (учтите, эта строка - массив из 14 символов)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...)
00 00 00 00
[конец зашифрованного блока]
хотя по логике эт одно и то же, но на серверах на которых я был этот пакет выглядел так...
ЗЫ а ты уверен что тебе надо в точности воссоздать пакет от клиента?, думаю сервер и так скушает (хотя возможно не каждый сервер, у явы вроде жестко позиции логины и пароля заданы были в сборках в которых я сорци смотрел)
ЗЗЫ бэйсик.., какое отродье...)
Добавлено через 4 минуты
кстати алгоритму RSA на самом деле пох на нули в начале, так что в общем виде шифрованный блок выглядит так:
XX // размер блока
00 00 // а хрен его хнает шо это
XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Login (учтите, эта строка - массив из 14 символов)
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...)
00 00 00 00 // опять хрень какая то видать (возможно не обязательная)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Последний раз редактировалось xkor, 23.04.2010 в 19:09.
Причина: Добавлено сообщение
если я правильно понял то массив с логином и паролем это 128 байтное число которое возводим в степень 65537 и берем по модулю N. Вот это число 128 байт необходимо брать как оно есть, или приводить к другому виду, ну мол у нас есть «00 00 02 …» или нужно представить как «... 02 00 00». Так же ключ который я пытался дешифровать получался всегда непростым числом.
Вы можете мне сказать какой будет у меня RSA ключ при этих данных, если конечно это не займет у вас много времени?
если я правильно понял то массив с логином и паролем это 128 байтное число которое возводим в степень 65537 и берем по модулю N.
именно так
Цитата:
Сообщение от mr_green
Вот это число 128 байт необходимо брать как оно есть, или приводить к другому виду, ну мол у нас есть «00 00 02 …» или нужно представить как «... 02 00 00».
ну брать нужно так чтобы логин находился в более старших разрядах чем пароль, однако в памяти это скорее всего будет выглядеть в инвертированном виде от того как мы блок составили так как работа с большими числами производиться через разделение их на много маленьких (по 4 байта на 32битных системах), а в x86 процессорах используется обратный порядок байт (то есть в первом байте младший разряд, ибо так удобнее преобразовывать), ну и логично было бы ещё до разбиения на мелкие подчисла инвертировать порядок байт)
однако как надо подавать байты в New BigInteger(modul) я понятие не имею, я вообще про класс BigInteger не слышал, разве что в .Net 4.0, но его ещё вроде не выпустили)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Выпустили 12го числа . И только вчера я поставил новую студию. Про хранение в памяти я приблизительное понятие имею. Просто что 00 00 02 что 02 00 00 это число, но другое. Как задумывалось при шифрации в RSA я не знал. Спасибо.
Но у меня все еще есть проблема с расшифровкой ключа. У меня числа получаются непростые. В RSA именно простые необходимы.
Я встречал ваш код:
Код:
procedure RSAkeyDecode(var raw);
var
ab: array[0..127] of Byte absolute raw;
i: Word;
b: Byte;
begin
for i:=0 to $3f do ab[$40+i]:=ab[$40+i] xor ab[i];
for i:=0 to $03 do ab[$0d+i]:=ab[$0d+i] xor ab[$34+i];
for i:=0 to $3f do ab[i]:=ab[i] xor ab[$40+i];
for i:=0 to $03 do begin
b:=ab[i];
ab[i]:=ab[$4d+i];
ab[$4d+i]:=b;
end;
end;
В него подавать ключ в таком виде как он пришел или развернуть?
Оно как не крути непростое и отрицательное.
И своей прогой и вашим кодом дешефрует одинокого.
Код:
procedure RSAkeyDecode(var raw);
var
ab: array[0..127] of Byte absolute raw;
i: Word;
b: Byte;
begin
for i:=0 to $3f do ab[$40+i]:=ab[$40+i] xor ab[i];
for i:=0 to $03 do ab[$0d+i]:=ab[$0d+i] xor ab[$34+i];
for i:=0 to $3f do ab[i]:=ab[i] xor ab[$40+i];
for i:=0 to $03 do begin
b:=ab[i];
ab[i]:=ab[$4d+i];
ab[$4d+i]:=b;
end;
//showmessage('');
end;
procedure bfh(x:string; x2:string; var b:bb);
var i,l,ii:integer;
s,ss:string;
begin
l:=length(x);
if length(x) mod 2 <> 0 then x:='0'+x;
i:=0;
ii:=0;
while i<=l-1 do
begin
ss:='0x'+x[i+1]+x[i+2];
b[ii]:= StrToInt64(ss);
inc(ii);
i:=i+2;
end;
l:=length(x2);
i:=0;
while i<=l-1 do
begin
ss:='0x'+x2[i+1]+x2[i+2];
b[ii]:= StrToInt64(ss);
inc(ii);
i:=i+2;
end;
end;
procedure hfb(var x:string;var x2:string; b:bb);
var i,l,ii:integer;
s,ss:string;
h:integer;
begin
l:=100;
ii:=0;
x:='';
x2:='';
while ii<=l-1 do
begin
h:=b[ii];
s:=inttohex(b[ii],2);
x := x+s;
inc(ii);
end;
l:=128;
while ii<=l-1 do
begin
h:=b[ii];
s:=inttohex(b[ii],2);
x2 := x2+s;
inc(ii);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var b:bb;
ss,ss2:string;
begin
ss:='E4FE76803B525327A1CDDDEC57B4505123A35A65103470BE20042CAA0F77140F70DAC835071E1F5350E9B3A4806642AD90BC2DF9AC9698E1CD7FFF75905A9F6E547CF7CB8B68F9C39855859BE6383A678500813801BD0295D9C0E4F3ED30AFEBBB8FCE61A0C6EFC5610CF800DB887972334A1515F7A010066191F3490166';
ss2:='5E9B';
bfh(ss,ss2,b);
RSAkeyDecode(b);
hfb(ss,ss2,b);
Edit1.Text:=ss;
Edit2.Text:=ss2;
end;
Быть может что-то попортило ключ? Блоу фиш или ксор…
mr_green, еслиб чтот чтот попортило ключ то попортило бы и BF ключ которым ты удачно расшифровал пакет от клиента а значит он не порченый.
Отрицательное?, а кто сказал что оно должно быть простое и положительное??
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Спасибо за консультацию. Логин сервер я прошел. Ошибка при использовании RSA была в том что 1-й бит 128 байтного числа был 1 и Net класс BigInteger принимал это число за отрицательное. Сделав число 129 байтным добавив «00» в старшем регистре удалось «обмануть» BigInteger.
Теперь разбираюсь что поменялось в пакете InitKey (CryptInit) . в с4 ксор ключ был 8 байт, 4 шло в пакете CryptInit, 4 были константой. В новой версии
Код:
writeC(0x2e);
39 writeC(_id); //0 - wrong protocol, 1 - protocol ok
40 for (int i = 0; i < 8; i++)
41 {
42 writeC(_key[i]); // key
43 }
44 writeD(0x01);
45 writeD(0x01); // server id
46 writeC(0x01);
47 writeD(0x00); // obfuscation key
Но пакет пришел чуть другой:
Код:
19 00
2E
01
70 D9 A8 CF | 12 83 3D 5E
01 00 00 00
01 00 00 00
00
92 A3 C9 48
mr_green, начиная с интерлюда ключ 16 байт, 8 приходят от сервера, 8 - константа (но на некоторых серваках эт константа тож от сервака приходит), инкрементятся теперь не первые 4 байта ключа при приходе каждого пакета а 4 байта начиная с 8го, то есть те с которых константа начинается
__________________
Я здесь практически не появляюсь!, Skype - ikskor