Приветствую Вас многоуважаемые жители zg!
Свернуть ↑
SrcRegVer: 247703
ReleaseName: LIVE-22.04 EME #13
Version: LIVE-22.04 EME #13
ReleaseDate: 2013-08-30 오후 7:05:33
ShareRevision: 247322
ClientRevision: 247601
ServerRevision: 247703
ReleaseDataRevision: 69115
WebAppRevision: 247080
TeraReleaseName: LIVE-22.04 EME #13
Свернуть ↑Развернуть ↓
Посмотрев на обстановку эмуляторов, ровным счетом увидел только одну толковую разработку на C#, занимается ею один человек.
Давайте делиться и разрабатывать вместе.
В данный момент изучаю исходники на предмет сетевого взаимодействия.
Что понял

в контексте пиратского сервера)
Свернуть ↑
PHP код:
struct ServerInitPacket {
byte[] data = {1,0,0,0};
}
struct ClientKeyPacket {
byte[128] key;
}
struct ServerKeyPacket {
byte[128] key;
}
Свернуть ↑Развернуть ↓
ЭТАП 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. Потом загвоздка в функциях криптографии, там используется без знаковые числа(проблема происходит при приведении типа). Одно завязано на другом, дебаг в двух средах, на двух языках, туго все идет.
Свернуть ↑
PHP код:
struct EncryptData{
byte[] raw;
};
struct Packet {
short length;
short opcode;
byte[length-4] data;
};
struct DecryptData {
Packet packet1;
Packet packet2;
...
Packet packetN;
};
Свернуть ↑Развернуть ↓
Обмен данными между клиентом и сервером.
ЭТАП 0 и ЭТАП 1 на прямую посылаются данные.
ЭТАП 2 данные зашифровываются.
Клиент-сервер посылает последовательность байт
EncryptData.
При расшифровке выделяется структура
DecryptData .
То-есть отправляя/получая, зашифровка/расшифровка происходит в один цикл, все данные обрабатываются одним проходом.
Концепцию четко вижу уже, расписал видение лаунчера, сервера авторизации и игрового.
ПС Написал пока пару строчек кода. Не вижу пока смысла, что-то выкладывать.
ПС Сетевая модель, модель работы с бд, потоками, я реализовал свою, никаких mmocore(l2j) и тому подобного. Ориентация идет на распределенные вычисления.
Дерзаем дамы и господа.
Добавлено через 31 минуту
Подготовка сервера для чтения.
Свернуть ↑
PHP код:
struct SessionKey {
byte[128] skey1;
byte[128] skey2;
byte[128] ckey1;
byte[128] ckey2;
}
class Engine{
public void init(byte[128] key);
public void process(byte[] data);
}
class Crypto {
private Engine encryptor;
private Engine decryptor;;
public void init(SessionKey key)
{
byte[128] (dkey , ekey);
dkey = ((key.skey1 >> 31) ^ key.ckey1) ^ (key.ckey2 << 17);
decryptor.init(dkey);
ekey = key.skey2 >> 79;
decryptor.process(ekey);
encryptor.init(ekey);
}
public void encrypt(byte[] data)
{
encryptor.process(data):
}
public void decrypt(byte[] data)
{
decryptor.process(data);
}
}
Свернуть ↑Развернуть ↓
После получения ключей вызывается метод
Crypto.init(key)
<< , >> - циклический сдвиг массива (побайтовый).
!Проблема с
proccess.