Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2013, 15:42   #1
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию XOR

Как настоящий кулхацкер решил побаловаться XORчиком.
Как бы мне криптостойкость измерять?
Код:
typedef unsigned char byte;

void endecrypt(void* data, int dSize, void* key, int kSize){
	long long* d = data;
	long long* k = key;
	int i, n;
		for(i = 0; i < dSize / 8; i++)
			for(n = 0; n < kSize / 8; n++)
				d[i] ^= k[(k[n] > kSize) ? k[n] % kSize : kSize % k[n]];
}
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 15.09.2013, 15:51   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

что есть kSize и dSize?
rrrFer вне форума Ответить с цитированием
Старый 15.09.2013, 19:25   #3
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
что есть kSize и dSize?
размеры d - data k - key
Я так на досуге прикинул, замахнулся на RSA, AES, ГОСТ-85...чототам... Короче играю с XORами и не выделываюсь лет до 30-ти
do not use your brain

Последний раз редактировалось Кащей; 15.09.2013 в 20:48.
Кащей вне форума Ответить с цитированием
Старый 15.09.2013, 21:10   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
размеры d - data k - key
т.е. количество байт, а не количество элементов массива, судя по коду.
Код:
for(i = 0; i < dSize / 8; i++)
а тут ты полагаешь что long long займет 8 байт и типа обходишь массив.
Есть ряд косяков. Самый незначительный в том, что long long гипотетически может не 8 байт занимать (http://ru.cppreference.com/w/cpp/language/types - стандарт гарантирует что там "не менее 8 байт").
Печальней то, что зашифровать твоим XOR, скажем, 7 байт я не смогу (он тупо ниче шифровать не будет), а тип void* аргумента функции как бы намекает (если оно шифрует только массив типа long long - нахрена функция количество байт, а не количество элементов массива принимает?)

Со мной че то не то, но этот кусок я реально не понял:
Код:
for(i = 0; i < dSize / 8; i++)
			for(n = 0; n < kSize / 8; n++)
				d[i] ^= k[(k[n] > kSize) ? k[n] % kSize : kSize % k[n]];
в первом цикле ты перебираешь шифруемые элементы, во вложенном - элементы ключа. Каждый элемент исходных данных ты шифруешь всеми элементами ключа, а в чем смысл? - эффективность это не повышает ниразу, защищенность от этого падает почти в ноль.

Ну и этот момент мне не ясен отдельно:
d[i] ^= k[(k[n] > kSize) ? k[n] % kSize

почему остаток от деления на длину ключа?

Цитата:
Как бы мне криптостойкость измерять?
если нормально написать алгоритм (чтобы длина ключа там не фигурировала и все байты кодировались) - то чем выше длина ключа - тем выше криптостойкость (все совсем идеально если длина ключа не меньше длины исходного сообщения {ну это очевидно}). А так,... этот алгоритм легко ломается (если известная длина ключа - то совсем легко).
rrrFer вне форума Ответить с цитированием
Старый 15.09.2013, 21:27   #5
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
стандарт гарантирует что там "не менее 8 байт
Окей.
Цитата:
тип void* аргумента функции как бы намекает (если оно шифрует только массив типа long long - нахрена функция количество байт, а не количество элементов массива принимает?)
Таким макаром она принимает всё(char, short, uchar, int и т.д.), а крыжыт как long long.
Цитата:
d[i] ^= k[(k[n] > kSize) ? k[n] % kSize
Шифруется элементами ключа с индексом равным остатку от деления большего на меньшее. Тоесть выбирается слегка случайный элемент ключа столько раз, сколько элементов в ключе.
Цитата:
почему остаток от деления на длину ключа?
Чтобы его длину не превысить..это было по идее, надо было использовать kSize / 8 <--- дописываю, манёвр не удался, а так хотелось...
Цитата:
этот алгоритм легко ломается
По етому я хочу как сучка *бли ето изучить.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 15.09.2013, 21:40   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
Код:
d[i] ^= k[(k[n] > kSize) ? k[n] % kSize
Шифруется элементами ключа с индексом равным остатку от деления большего на меньшее. Тоесть выбирается слегка случайный элемент ключа столько раз, сколько элементов в ключе.
Чтобы выбрать "слегка случайный элемент ключа"... Мб надо так поправить?
k[n % kSize/8]
Иначе элемент ключа ты выбираешь вполне определенный (n-ный), а потом уже что-то непонятное делаешь с его значением (и шифруешь фактически не ключем, а чем-то образованным от ключа и его длины)
Но в любом случае, никакой стойкости это не добавит алгоритму, но это уже будет другой алгоритм (а это плохо, ИМХО, в общем случае).

Цикла там вложенного быть не должно.
rrrFer вне форума Ответить с цитированием
Старый 15.09.2013, 22:04   #7
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Цикла там вложенного быть не должно.
Ето я знаю.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 15.09.2013, 23:15   #8
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

И тут я наткнулся на замечательную статью, более подробно описывающую этот ГОСТ-28147
И меня тут же заинтересовало, как реализуется основной шаг, а именно там где подставка замены происходит.
Цитата:
typedef struct{
unsigned K[8];//Ключ
byte H[8][16];//Таблица замены по 4 бита на элемент, без повторений (в статье H) типа 0bffff0000 0b0000ffff

}KZN;

unsigned step(unsigned* N, unsigned* X, KZN* kzh){//N это 2 блока по 32 бита, Х 1 элемент ключа
unsigned S = N[0] + (X[0] - 1) + 1;//Сложение по модулю (N[0] + X[0])mod(2^32)
int m;
for(m = 0; m < 8; m++){//шаг шифрования
S[m] &= kzh.H[m][S[m]];//подставка замены из таблицы(S надо разбить)
}
S = (S << 11) | (S >> (11-1));//циклический сдвиг на 11 бит
S ^= N[1];
N[0] = N[1];
N[1] = S;

return *N;
}
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 16.09.2013, 18:50   #9
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

В продолжение. по мотивам какихто там исходников наваял реализацию алгоритма ГОСТ 28147-89, но не работает, помогите разобраться.
Ошибка была в циклах шифрования - расшифрования, я пропустил где было написано 0..7 и 7...0.

Внимание вопрос - оно в режиме простой замены так и должно местами буквы менять или может преобразовывать ещё их?

Вывод программы:
Цитата:
Data:
Simple string 12

Byte data:
83 105 109 112 108 101 32 115 116 114 105 110 103 32 49 50


Encrypted string:
le sSimpg 12trin

encrypted data:
108 101 32 115 83 105 109 112 103 32 49 50 116 114 105 110


Decrypted string:
Simple string 12

decrypted data:
83 105 109 112 108 101 32 115 116 114 105 110 103 32 49 50
do not use your brain

Последний раз редактировалось Кащей; 16.09.2013 в 21:24.
Кащей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c Xor frommars Общие вопросы C/C++ 4 03.10.2012 18:30
Алгоритм XOR SOUR47 Общие вопросы C/C++ 16 15.06.2011 03:14
вопрoс по XOR whystr Общие вопросы Delphi 1 08.01.2011 18:05
xor-шифрование Halyna Помощь студентам 0 06.12.2010 17:24