function RSAEncrypt(a,p,rsakey:string):string;
var
sD,sR,sM:string;
m,e,d,r:TFGInt;
begin
if length(a)>14 then setlength(a,14);
while length(a)<14 do a:=a+#0;
if length(p)>16 then setlength(p,16);
while length(p)<16 do p:=p+#0;
sD:=a+p+#0#0#0#0;
sM:=rsakey;
Base10StringToFGInt('65537',e);
Base256StringToFGInt(sD,d);
Base256StringToFGInt(sM,m);
FGIntMontgomeryModExp(d,e,m,r);
FGIntToBase256String(r,sR);
result:=sR;
end;
как переписать отделавшись легким испугом?? Лучше конечно использовать ява функции.
Тут получатся, что шифруется блок "логин+пароль", или отдельно каждое потом записываются в соответствующие места?
Наверное самое трудно переносимое из одного языка в другой =) Потому что используется тут большие числа и в каждом языке разные модули для этого. Конкретно что делает процедура:
Код:
function RSAEncrypt(a,p,rsakey:string):string;
var
sD,sR,sM:string;
m,e,d,r:TFGInt; //это переменные для работы с большими числами
begin
if length(a)>14 then setlength(a,14); //если логин > 14 символов обрезаем
while length(a)<14 do a:=a+#0; //доводим логин до 14 символов
if length(p)>16 then setlength(p,16); //если пароль > 16 символов, обрезаем
while length(p)<16 do p:=p+#0; //доводим пароль до 16 символов
sD:=a+p+#0#0#0#0; //записывается логин+пароль+4 нулевых байт для нужного размера
sM:=rsakey;
Base10StringToFGInt('65537',e); //инициализируем e числом 65537
Base256StringToFGInt(sD,d); //инициализируем d "числом" sD
Base256StringToFGInt(sM,m); //аналогично
FGIntMontgomeryModExp(d,e,m,r); //выполняется операция r = (d^e) mod m
FGIntToBase256String(r,sR); //переводится r в sR
result:=sR; //PROFIT
end;
т.е. получается что да, шифруется сразу блок логин + пароль.
Последний раз редактировалось Kilatif, 10.02.2012 в 01:51.
Переводится каким способом? Или просто копируется?
sR - массив байт
допустим r = 0xAABBCCDDEEFF11223344
тогда sR = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x11, 0x22, 0x33, 0x44} (порядок записи в массив может будет задом наперед, я точно не помню)
Tin-moon, тебе в конечном итоге должен был придти пакет PlayOk. Когда он пришел, берешь оттуда нужные данные, закрываешь соединение с логин сервером и открываешь соединение с GameServer-ом, к которому тебе нужно подключиться. IP и порты GameServer-ов тебе приходили в пакете ServerList. Какие пакеты тебе нужно отсылать и принимать после установки соединения, можешь посмотреть, зайдя в игру с включенным l2phx. Нужные тебе пакеты для входа в мир начинаются с ProtocolVersion и заканчиваются EnterWorld.
Что касается шифрации.
Первые 2 пакета не шифруются (ProtocolVersion(Client->GS) и KeyInit(GS->Client)).
Пакеты после KeyInit шифруются xor-шифрованием со сменой ключа. Первый ключ берется в пакете KeyInit, остальные берутся из следующих пакетов.
Во вложении класс для работы с этим xor-шифрованием