Шифрование AES в клиенте/сервере игрового сервера

Я запускаю игровой сервер, у меня есть главный сервер, который обрабатывает все пакеты, отправленные игроками (клиентами).

Я хочу зашифровать свои пакеты через AES, чтобы каждый пакет был уникальным (я думаю, здесь мне нужен IV), и этот сервер должен принимать каждый зашифрованный пакет только один раз, так что, если кто-то попытается пронюхать пакет, он не сможет отправить его снова.

Как мне это сделать?

P.S. я кодирую сервер и клиент на c++


person user3356751    schedule 09.03.2014    source источник
comment
Просто используйте SSL, эта проблема уже решена эффективнее, чем вы можете надеяться.   -  person meagar    schedule 09.03.2014
comment
Поверьте, ваши тщетные попытки защитить свою игру ничем вам не помогут. В некотором смысле я игровой хакер. Шифрование важно только для атак «человек посередине», чтобы (внешние) злоумышленники не могли просто перехватить пароли ваших пользователей. Однако это никак не поможет вам против регистратора пакетов или пользовательских клиентов. Лучше сосредоточьтесь на защите на стороне сервера (например, регистрируйте неправильно сформированные пакеты, которые никогда бы не были отправлены клиентом из-за утверждений). Но если кто-то действительно хочет отменить ваше заявление, вы ничего не можете с этим поделать.   -  person Sebastian Hoffmann    schedule 09.03.2014
comment
Также обратите внимание, что очень важным критерием должна быть производительность: если вы получаете тысячи пакетов в секунду, вы должны иметь возможность быстро шифровать и расшифровывать их. Например: очень недавняя и известная MMORPG (1,5 года назад) использует DHKE в сочетании с RC4.   -  person Sebastian Hoffmann    schedule 09.03.2014
comment
Небольшое дополнение к тому, почему ваши попытки тщетны: злоумышленник, я говорю о ком-то, кто хочет испортить вашу игру, например, написать ботов или взломать, сосредоточится на реверсировании игрового клиента. Обычно он начинается с сетевого уровня. В какой-то части вашей игры у вас должна быть функция, которая принимает незашифрованные пакеты, поэтому ваши уровни абстракции обычно будут выглядеть так: логика игры --unencrypted--› сетевой уровень --encrypted--› собственная сеть. Видите ли: когда злоумышленник минует сетевой уровень, он сможет отправлять пакеты artbitrary, просто вызвав один из ваших методов.   -  person Sebastian Hoffmann    schedule 09.03.2014
comment
Ну, моя основная проблема заключается в отправке одного и того же пакета дважды, потому что есть очень распространенный хак, который используется, когда кто-то нюхает пакет и отправляет его повторно.   -  person user3356751    schedule 09.03.2014
comment
Если его интересует больше, он может сейчас просто начать реверсировать ваш сетевой слой, выяснять, какие методы отвечают за шифрование, какие за дешифрование. В конце концов, он будет знать точный алгоритм, который вы используете для шифрования, и сможет реализовать его заново. Это не имеет большого значения.   -  person Sebastian Hoffmann    schedule 09.03.2014
comment
Поверьте мне, что ваша лучшая защита — это те, которые реализованы в компонентах, недоступных для хакера, которым обычно является сервер. Самое основное эмпирическое правило: никогда не доверяйте клиенту, проверяйте правильность каждого значения, которое он вам отправляет.   -  person Sebastian Hoffmann    schedule 09.03.2014
comment
да, я знаю, но это, по крайней мере, замедлит работу хакеров, потому что 99% хакеров едва ли могут написать сниффер для отправки/получения пакетов   -  person user3356751    schedule 09.03.2014
comment
@ user3356751 Нет, это совершенно неправильное предположение. Вам не нужно бояться детишек-скриптеров (они почти ничего не могут сделать без взрослых). Вы должны бояться тех, кто способен на большее. И что я пытаюсь вам объяснить: неважно, как сильно вы стараетесь, опытный хакер всегда найдет способ. Сетевое шифрование обычно не представляет собой никаких препятствий. Однако я знаю о 4 (критических) эксплойтах в различных онлайн-играх, которые основаны на простой подмене идентификаторов некоторых предметов, потому что некоторые разработчики просто забыли проверить, действительно ли идентификатор правильный.   -  person Sebastian Hoffmann    schedule 09.03.2014
comment
Бесполезно использовать AES для игровых целей, особенно потому, что у вас будут проблемы с производительностью, например: отставание. Если вы действительно хотите зашифровать трафик, вам лучше разработать собственный алгоритм, который будет все время случайным и будет очень быстрым для шифрования/дешифрования. Если вы все еще заинтересованы в этом, свяжитесь со мной по электронной почте, и я помогу вам.   -  person Norbert Boros    schedule 03.07.2017
comment
@Paranaix мы можем связаться?   -  person Norbert Boros    schedule 29.01.2018


Ответы (1)


Вы можете использовать какой-нибудь SSL API, такой как OpenSSL, но это может быть излишним в вашем сценарии, так как вам нужно будет использовать сертификаты и т. д. Существует Rijndael с открытым исходным кодом (алгоритм, который использует AES) реализация C++ здесь.

Вот пример его использования:

void testEncryptBlock()
{
    const int nCharacters = 16;
    char szHex[33];
    char *EncryptedData = new char[nCharacters + 1];
    CRijndael rijndael;
    int result = rijndael.MakeKey("abcdefghabcdefghabcdefghabcdefgh");

    // Add some dummy data for the sake of the demo
    EncryptedData = (char*)memset(EncryptedData, 255, nCharacters); // 0xfffff...

    result = rijndael.EncryptBlock(EncryptedData);

    ... // Do something with the data

    delete [] EncryptedData;
}
person Community    schedule 09.03.2014