Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Шифрование трафика - Простенький метод


Автор: MuForum 18.7.2009, 22:25
Доброе время суток.
Мне необходимо осуществить шифрование трафика между клиентом и сервером игрового сервера.
Так как речь идёт о Online Игре, то передача данных осуществляется в больших объёмах. Количество передаваемых пакетов в секунду достигает в среднем ~15 пакетов длиной в ~2 кбайта (2048 байт).
Естественно такой длины данные дефрагментируются и на другую сторону приходят кусками.
По началу я пробовал использовать симметричный алгоритм, шифровал блоками по 16 байт. Если длина данных не была кратной 16, то наращивал нулями.
Проблема встала в том, что когда наращиваешь нулями, а на другую сторону приходят склеенные, обрывочные пакеты, то нормально разобрать их не представляется возможности.
В связи с этим мне пришлось отказаться от симметричного метода шифрования.
Решил попробовать ассиметричный метод шифрования, но тут резко встал вопрос в производительность. Так как речь идёт об Online игре, а количество играков переваливает за 1000 пользователей, то нагрузка на компьютер более чем существенная.
Я решил для начала попробовать самую элементарную шифровку, XOR, тремя байтам.
Код

void EncryptDecryptBuf(byte *bufIn, byte *bufOut, int bSize)
{
    int index = 0;
    byte MASK[] = { 0xA2, 0x1B, 0xD8 };
    // ----
    for (int i = 0; i < bSize; i++, index++)
    {
        if (index > 2) index = 0;
        // ---
        bufOut[i] = bufIn[i] ^ MASK[index];
    }
}

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

# Вопрос №1: Что не правильно я делаю, что данный метод не корректно в некоторых случаях отрабатывает?

# Вопрос №2: Какой метод/алгоритм вы можете посоветовать в данной ситуации? (Только не симметричный...)

Автор: triclosan 18.7.2009, 22:31
Цитата(MuForum @  18.7.2009,  22:25 Найти цитируемый пост)
как бы это не смешно звучало. (На сколько я понял, Это случается когда сталкиваются два одинаковых значения)


обнуляем регистр только одной атомарной опирацией:
Код

xor ebx, ebx


или:
Код

int x = 42;
x=x^x; //x=0


Цитата(MuForum @  18.7.2009,  22:25 Найти цитируемый пост)
Какой метод/алгоритм вы можете посоветовать в данной ситуации? (Только не симметричный...)

Ваш по-вашему не симметричный?

Автор: MuForum 18.7.2009, 22:41
#2, triclosan - Я допустил маленькою оплошность, имелось ввиду не блочный алгоритм.
Код

int x = 42;
int z = -1, z2 = -1;
z = x ^ x; // z = 0;
z2 = z ^ x; // z2 = 42;

- На данном примере обе операции проходят успешно.

Автор: andrew_121 19.7.2009, 06:59
Цитата(MuForum @  18.7.2009,  22:25 Найти цитируемый пост)
дефрагментируются и на другую сторону приходят кусками

Скорее "фрагментируются".

Не понятно для чего изобретать велосипед? Используй http://www.openssl.org/. И протокол, и шифрование.
Если это слишком много, попробуй http://www.iolib.org/. У нее есть возможно устанавливать свои кодеки для шифровки/дешифровки.

Автор: GrayCardinal 19.7.2009, 10:30
MuForum
Код 100% рабочий. Проблема может быть в том, что пакеты фрагментируются. Т.е. Вы шифранули буфер, а он пришел как два. В результате второй начинает декодироваться с первого байта маски. Что не верно. Необходимо просто контролировать размер пакетов...

Добавлено через 1 минуту и 11 секунд
andrew_121
Не потянет openSSL тыщу клиентов  smile 

Автор: andrew_121 19.7.2009, 10:51
GrayCardinal, Гы... Не принял во внимание.

Автор: W4FhLF 19.7.2009, 11:02
Цитата(MuForum @  18.7.2009,  22:25 Найти цитируемый пост)
# Вопрос №2: Какой метод/алгоритм вы можете посоветовать в данной ситуации? (Только не симметричный...)


Симметричный и ассиметричный тут не причём. Тебе нужен потоковый алгоритм.

Добавлено через 4 минуты и 19 секунд
http://en.wikipedia.org/wiki/Stream_cipher


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)