Наверное самое трудно переносимое из одного языка в другой =) Потому что используется тут большие числа и в каждом языке разные модули для этого. Конкретно что делает процедура:
Код:
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-шифрованием
закрываешь соединение с логин сервером и открываешь соединение с GameServer-ом, к которому тебе нужно подключиться.
Возник вопрос по реализации логики открытия и закрытия сокетов.
Суть:
Написал абстрактный класс для работы с сокетом (с общей логикой) унаследованный от потока. Создал 2 класса для реализации Логики работы с логин сервером и для работы с гейм сервером. Логин часть отрабатывает, а запустить гейм часть не получается.... Или ошибки или закрывается полностью приложение....
Мб какой совет есть (по структуре приложения).
Tin-moon, у меня с сокетами тоже не все впорядке, поэтому врятли тебе в этом помогу) Что касается ProtocolVersion. Я посылаю первый вариант, т.е. с константой, просто потому что так делает клиент, хотя прокатывает и второй.