Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   TERA (https://forum.zone-game.info/forumdisplay.php?f=182)
-   -   Разработка Tera JAVA (Part 1) (https://forum.zone-game.info/showthread.php?t=31796)

Gattsu 11.10.2013 22:11

Разработка Tera JAVA (Part 1)
 
Приветствую Вас многоуважаемые жители zg!

Клиент:
Свернуть ↑Развернуть ↓


Посмотрев на обстановку эмуляторов, ровным счетом увидел только одну толковую разработку на C#, занимается ею один человек.

Давайте делиться и разрабатывать вместе.

В данный момент изучаю исходники на предмет сетевого взаимодействия.

Что понял:(в контексте пиратского сервера)


Структуры:
Свернуть ↑Развернуть ↓

ЭТАП 0
1. Сервер посылает ServerInitPacket

ЭТАП 1
2. Этап обмена ключами
2.1 Клиент отвечает посылая первый ключ(ckey1) ClientKeyPacket размером 128 байт
2.2 Сервер отвечает посылая первый ключ(skey1) ServerKeyPacket размером 128 байт
2.3 Клиент отвечает посылая второй ключ(ckey2) ClientKeyPacket размером 128 байт
2.4 Сервер отвечает посылая второй ключ(skey2) ServerKeyPacket размером 128 байт

Проходит установка состояния для чтения, клиент и сервер обрабатывают полученные ключи, подготавливают криптографию.

ЭТАП 2
3. Этап авторизации
3.1 Клиент посылает 96 байт

На пункте 3.1 не могу расшифровать уперся лбом в проблему.
Не могу разобрать алгоритм криптографии, особо тесный опыт с криптографией не имел, так что буду благодарен за подсказки.

Перенес алгоритм с C# на Java, проблема в многих местах, c SHA-1(160 бит хэш) там не понятная история, реализован не по RFC, тк выходные результат получаются разные и на C#, он выдает digest масива 5 uint32, но в общем худо бедно перенес на Java. Потом загвоздка в функциях криптографии, там используется без знаковые числа(проблема происходит при приведении типа). Одно завязано на другом, дебаг в двух средах, на двух языках, туго все идет.

Структуры:
Свернуть ↑Развернуть ↓


Обмен данными между клиентом и сервером.
ЭТАП 0 и ЭТАП 1 на прямую посылаются данные.
ЭТАП 2 данные зашифровываются.
Клиент-сервер посылает последовательность байт EncryptData.
При расшифровке выделяется структура DecryptData .

То-есть отправляя/получая, зашифровка/расшифровка происходит в один цикл, все данные обрабатываются одним проходом.

Концепцию четко вижу уже, расписал видение лаунчера, сервера авторизации и игрового.

ПС Написал пока пару строчек кода. Не вижу пока смысла, что-то выкладывать.

ПС Сетевая модель, модель работы с бд, потоками, я реализовал свою, никаких mmocore(l2j) и тому подобного. Ориентация идет на распределенные вычисления.

Дерзаем дамы и господа.

Добавлено через 31 минуту
Подготовка сервера для чтения.

Структуры:
Свернуть ↑Развернуть ↓


После получения ключей вызывается метод Crypto.init(key)

<< , >> - циклический сдвиг массива (побайтовый).

!Проблема с proccess.

DiagoD 11.10.2013 23:10

Re: Разработка Tera JAVA (Part 1)
 
Цитата:

Сообщение от Gattsu (Сообщение 327407)
На пункте 3.1 не могу расшифровать уперся лбом в проблему.
Не могу разобрать алгоритм криптографии, особо тесный опыт с криптографией не имел, так что буду благодарен за подсказки.

Перенес алгоритм с C# на Java, проблема в многих местах, c SHA-1(160 бит хэш) там не понятная история, реализован не по RFC, тк выходные результат получаются разные и на C#, он выдает digest масива 5 uint32, но в общем худо бедно перенес на Java. Потом загвоздка в функциях криптографии, там используется без знаковые числа(проблема происходит при приведении типа). Одно завязано на другом, дебаг в двух средах, на двух языках, туго все идет.

В разделе теры, возьми сорсы которые я шарил и вытяните с них криптор:)
Он полностью рабочий:)

Gattsu 11.10.2013 23:18

Re: Разработка Tera JAVA (Part 1)
 
Цитата:

Сообщение от DiagoD (Сообщение 327413)
В разделе теры, возьми сорсы которые я шарил и вытяните с них криптор:)
Он полностью рабочий:)

я бы рад, но кто-то бы перезалил бы:)

n3k0nation 12.10.2013 01:46

Re: Разработка Tera JAVA (Part 1)
 
Спасибо за информацию, может быть когда-нибудь воспользуюсь :)

Немного обсуждения.
Signed/unsigned
u-типы данных ничем по структуре не отличаются от signed типов в джаве. Во всяком случае они представляются в таком же количестве байтов, что и оригинальная структура.
Зачастую, в шарпах unsigned типы используются для исключения "хрен пойми, что за хрень в переменной", так что можно не беспокоится о переполнении, но лучше всего оттестировать, как это все воспроизводится на клиентской стороне, чтобы не получилось такого: взял деньгу и сервер упал.
И да, для того, чтобы превратить signed в unsigned и наоборот достаточно в правильном порядке сложить байты из которых этот тип состоит.

SHA
На счет хеширования SHA. Полистайте мелкомягкую доку по их дигестам, возможно там есть какие-то... ммм... недокументированные возможности, если можно так сказать :D А вообще, мне кажется, что тут косяк с вашей стороны, а с алгоритмикой отпечатков все впорядке.

Network
Что за распределенная модель сети? Подробнее пожалуйста, если можно.
В любом случае Вы используете NIO или какой-нибудь нетворк-фреймворк, так что это мало будет отличаться от ммогоря, за исключением, что Вы возможно сможете это все правильно спроектировать и реализовать.

Троллинг: спасибо, что открыли глаза на сдвиги :redlol:

Aquanox 12.10.2013 06:23

Re: Разработка Tera JAVA (Part 1)
 
Кто сказал что нет проектов? :D

Проекты есть. Я вот до сих пор понемногу обновляю сборку которую мы разрабатывали с командой разработчиков (активный сервер правда уже закрыт из-за неприбыльности после F2P). 1-40lv Spawnzones, crafting, enchanting, gathering, mounts, most of skills etc...

Всю сеть можно прекрасно "уложить" с netty, добавить хендлеры ответственный за шифрование/дешифрование данных, да и маршаллинг макетов заодно (вот только сейчас идея появилась).

Есть ещё проект на Scala (гдето видел тут на форуме), не думаю что жив, но от туда можно взять пару наработок.
upd: http://forum.zone-game.info/showthread.php?t=24741

Gattsu 12.10.2013 06:45

Re: Разработка Tera JAVA (Part 1)
 
SHA
"Ошибка" не понятная мне реализованная разработчиком, хэш реализованный по стандартам, использовал встроенный алгоритм в java, для теста, выдает разный хэш, то-есть хэш разработчика отличается от стандарта и разработчик выдает выходной результат не массивом байт, а массивом без знаковых чисел, почему так, это действительно придется читать документацию вникать в алгоритм, и смотреть на чужой код, проводить анализ...

Работает не трогай, а то работать не будет :)

Это оставить так нельзя, надо понимать с чем работаешь, как оно работает, потом как улучшать, то что не знаешь

Алгоритм криптографии надо улучшать в первую очередь, он увеличит быстродействие, уменьшить задержку вычислений.
Улучшение в потреблении памяти, в меньшем количестве операции...

Меня мозолит эта криптография :) Не дает спокойно спать :D

Не смысла делать, то что выдает разный хэш...

Сдвиг мог быть побитовый :)

Network
Как отработаю конечный вариант, выложу

YK_Sirius 12.10.2013 10:35

Re: Разработка Tera JAVA (Part 1)
 
Ошибок там нет. В Тере используется странная имплементация SHA, которая по особому выравнивает (padding) байты если входной массив очень большой (а там по 300 вроде бы байтов?). В яве этот алгоритм "правильно" реализовывается в GNU Crypto. В C# - работает по умолчанию. В С++ я писал вручную (OpenSSL не подходил, а тянуть ради хеша здоровенную крипто-либу не хотелось).

n3k0nation 18.10.2013 10:05

Re: Разработка Tera JAVA (Part 1)
 
Бамп во славу Ozzy! Ибо интересно: есть ли какие-нибудь продвижения у ТСа :)
Ну и ессесно все еще интересно посмотреть на реализацию сети.


Текущее время: 05:17. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot