powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная криптостойкость
25 сообщений из 137, страница 1 из 6
Пятничная криптостойкость
    #39790298
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возвращаюсь периодически к теме UDP-передачи. Кто не в курсе - неважно, это просто подзадача, условия ниже.

Задача: зашифровать пакет на отправителе, на получателе расшифровать и убедиться что верно расшифровано.

Сначала была классическая мысль посчитать хэш нешифрованных данных и добавить к данным, по получении после расшифровки снова посчитать и сравнить. Потом появилась мысль как-то совместить шифрование и подсчет хэша. Зачем четыре прохода делать вместо двух?

Шифрование CBC , т.е. данные влияют на то что в итоге получится. Ключ шифрования не обсуждаем, он передан безопасным способом.

В итоге пришел к выводу что достаточно в конец дописать пару байт константы (0x5AA5) и после дешифрования проверить. Вроде все отлично, но есть сомнения: не создал ли я дыру, через которую все расшифруют?

Исходники
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
// CBC xor дешифрование буфера buf ключем key
void cbc_decrypt(const void* key, size_t key_len, void* buf, size_t buf_len) {
	const uint8_t* k = (const uint8_t*)key;
	uint8_t* b = (uint8_t*)buf;
	uint8_t* end = b + buf_len;
	uint8_t x = 0;
	uint8_t y = 0;
	size_t i = 0;
	while (b < end) {
		x = *b;
		*b ^= k[i] ^ y;
		y = x;
		i++;
		if (i == key_len) {
			i = 0;
		}
		b++;
	}
}

// CBC xor шифрование буфера buf ключем key
void cbc_encrypt(const void* key, size_t key_len, void* buf, size_t buf_len) {
	const uint8_t* k = (const uint8_t*)key;
	uint8_t* b = (uint8_t*)buf;
	uint8_t* end = b + buf_len;
	uint8_t y = 0;
	size_t i = 0;
	while (b < end) {
		*b ^= k[i] ^ y;
		y = *b;
		i++;
		if (i == key_len) {
			i = 0;
		}
		b++;
	}
}

void test(const char* text) {
	int len = strlen(text), size = len + 2;
	char key[] = "secretkey"; // Ключ шифрования
	// Заполнение буфера
	char* buf = new char[size];
	char* p = buf;
	memcpy(p, text, len);
	uint16_t *check = (uint16_t *)(p + len); // Последние два байта контрольное значение
	*check = 0x5AA5;  // Контрольное значение
	// Шифрование
	cbc_encrypt(key, sizeof(key), buf, size);
	printf("%04X ", *check);
	// Дешифрование
	cbc_decrypt(key, sizeof(key), buf, size);
	if (*check != 0x5AA5) printf("ERROR\n"); // Проверка
	printf("  %s\n", text);

	delete[] buf;
}

int main()
{
	test("12345");
	test("1234567890");
	test("abcde");
	return 0;
}



Результат
Код: plaintext
1.
2.
B382   12345
89B6   1234567890
E3D2   abcde
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790299
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В твоём протоколе все UDP пакеты независимые? Или образуют Stream?
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790300
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ твоём протоколе все UDP пакеты независимые? Или образуют Stream?
Образуют Stream, в котором контролируется правильность полученного, это вложенный уровень, его не обсуждаем.
В данном случае надо просто понять что пакет был зашифрован тем же симметричным ключом, которым расшифрован, при этом не ослабить шифрование.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790301
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каждый конец открытого текста пакета дописываются 0x5AA5 ?
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790302
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ каждый конец открытого текста пакета дописываются 0x5AA5 ?
Да.

Результат выполнения кода
Код: plaintext
1.
2.
B382   12345
89B6   1234567890
E3D2   abcde
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790303
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат это то во что трансформировалось 0x5AA5
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790304
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юзай спокойно. При правильном использовании CBC тебе ничего не угрожает. В интрернетах
ходит миллиард пакетов с стандартной шапкой <html

И ничо.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790305
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мне кажется, что зная что последние байты всегда константа, должно быть очень легко востановить часть пароля (2 байта пароля)

При разных длинах пакетов, будем востанавливать разные части пароля. Т.ч. накопив передачи с разной длиной пакетов, в какой-то момент можно будет реконструировать пароль

Хотя, возможно, мне это только кажется, C++ под руокй нет. т.ч. код не запустить и зашифрованные пакет не посмотреть.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790306
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРезультат это то во что трансформировалось 0x5AA5
кроме того, во что трансфорировалось 0x5AA5 нужно еще и предыдущий байт(ы) видеть.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790307
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЮзай спокойно. При правильном использовании CBC тебе ничего не угрожает. В интрернетах
ходит миллиард пакетов с стандартной шапкой <html

И ничо.
У меня должен быть полный хаос в том что уходит в сеть, чтобы не было этого

PS на дату глянул, пять лет уже пишу, юбилей ))))
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790311
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevлегко востановить часть пароля (2 байта пароля)
Чтобы узнать 2 байта пароля надо знать исходные (шифруемые) данные. Я двумя байтами (вместо 4-х) ограничился из-за трафика, но как понимаю 2 байта приписки имеют выше криптостойкость по сравнению с 4-мя.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790314
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ итоге пришел к выводу что достаточно в конец дописать пару байт константы (0x5AA5) и после дешифрования проверить. Вроде все отлично, но есть сомнения: не создал ли я дыру, через которую все расшифруют?
А шифрование то реально такое, как в приведенном исходнике? Я бы скорее не за пару байт в конце беспокоился.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790317
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю как Дима распространяет ключи. Вручную. ? На флешке?
Но я бы позаботился о периодическом их обновлении.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790362
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima TВ итоге пришел к выводу что достаточно в конец дописать пару байт константы (0x5AA5) и после дешифрования проверить. Вроде все отлично, но есть сомнения: не создал ли я дыру, через которую все расшифруют?
А шифрование то реально такое, как в приведенном исходнике? Я бы скорее не за пару байт в конце беспокоился.
Шифрование реально такое, но ключ разовый на сессию, т.е. отправитель в начале отправки файла/сообщения генерит ключ и передает его в первом пакете. Собственно проблема из-за того что ключей много, и т.к. используется UDP, то может прилететь кусок предыдущей сессии и надо его распознать и проигнорировать.

Первый пакет содержит ключ сессии, он шифруется мастер-ключом (он постоянный), вот тут надо подумать чтобы по сессионному невозможно было мастер-ключ восстановить.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790384
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут старик Керхгофс бы неодобрительно нахмурил брови.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790400
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ну хотя бы RC4 реализовали. Несмотря на известные слабые места, он гораздо лучше, чем такое.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790409
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ итоге пришел к выводу что достаточно в конец дописать пару байт константы (0x5AA5) и после дешифрования проверить. Вроде все отлично, но есть сомнения: не создал ли я дыру, через которую все расшифруют?
Если сообщение xor-ить случайной (псевдо) последовательностью, то ни разу не страшно. Главное последовательность не повторять, или повторять как-то очень редко, со сдвигами и т.д.

Если шифрование двуступенчатое (сначала асимметричное, потом симметричное), тогда первый этап, наверное, лучше без двух байт.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790431
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо ничего xor-ить. Xor на фоне шифрования - это бесполезная трата ваших ресурсов.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790456
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм:

Передаём в начале сообщения пару случайных байт и затем в конце сообщения ту же пару. Получатель сверяет и удостоверяется в дешифровании.

Можно после первой пары байт давать смещение второй пары, что-б никто не догадался (с).
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790459
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneDima T, ну хотя бы RC4 реализовали. Несмотря на известные слабые места, он гораздо лучше, чем такое.
RC4 это потоковое шифрование, а у меня не поток, а фрагменты потока (UDP пакеты), которые будут частично теряться по дороге и надо будет их высылать повторно, следовательно придется их хранить до подтверждения доставки. Но это не самое страшное, пакет может не дойти никогда из-за рубки пакетов по сигнатуре 15824799 . Если я буду шифровать отдельно каждый пакет, то добавив в начало один случайный байт я эту проблему решаю. По этой причине выбран CBC, чтобы сменой первого байта изменить весь пакет до неузнаваемости.

С помощью RC4 можно растянуть ключ до размера пакета, станет немного получше.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790460
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex55555Алгоритм:

Передаём в начале сообщения пару случайных байт и затем в конце сообщения ту же пару. Получатель сверяет и удостоверяется в дешифровании.

Можно после первой пары байт давать смещение второй пары, что-б никто не догадался (с).
Отличная идея. У меня первый байт и так случайный, можно его дважды в конце повторить.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790471
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОтличная идея. У меня первый байт и так случайный, можно его дважды в конце повторить.
Посмотрел что получится, получилось не очень: Предпоследний байт всегда одинаковый после шифрования, потестил на разных строках. Какая-то особенность алгоритма. Добавил искажение предпоследнего байта.

В итоге вот что получается:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
00 73 65 63 72 65 74 6B 65 79 69 7A 6D 6E 6F 67 61 62 75 6B 61 76  Ключ 
00 6D 65 73 73 61 67 65 20 6C 61 2D 6C 61 2D 6C 61 2E 2E 2E 00 00  Данные нешифрованные "message la-la-la..."
Шифрованные
00 1E 1E 0E 0F 0B 18 16 53 46 4E 19 18 17 55 5E 5E 12 49 0C 6D 1B
08 16 16 06 07 03 10 1E 5B 4E 46 11 10 1F 5D 56 56 1A 41 04 E5 13
10 0E 0E 1E 1F 1B 08 06 43 56 5E 09 08 07 45 4E 4E 02 59 1C 7C 0B
18 06 06 16 17 13 00 0E 4B 5E 56 01 00 0F 4D 46 46 0A 51 14 F4 03
20 3E 3E 2E 2F 2B 38 36 73 66 6E 39 38 37 75 7E 7E 32 69 2C 4F 3B
28 36 36 26 27 23 30 3E 7B 6E 66 31 30 3F 7D 76 76 3A 61 24 C7 33
30 2E 2E 3E 3F 3B 28 26 63 76 7E 29 28 27 65 6E 6E 22 79 3C 5E 2B
38 26 26 36 37 33 20 2E 6B 7E 76 21 20 2F 6D 66 66 2A 71 34 D6 23
40 5E 5E 4E 4F 4B 58 56 13 06 0E 59 58 57 15 1E 1E 52 09 4C 29 5B
48 56 56 46 47 43 50 5E 1B 0E 06 51 50 5F 1D 16 16 5A 01 44 A1 53
50 4E 4E 5E 5F 5B 48 46 03 16 1E 49 48 47 05 0E 0E 42 19 5C 38 4B
58 46 46 56 57 53 40 4E 0B 1E 16 41 40 4F 0D 06 06 4A 11 54 B0 43
60 7E 7E 6E 6F 6B 78 76 33 26 2E 79 78 77 35 3E 3E 72 29 6C 0B 7B
68 76 76 66 67 63 70 7E 3B 2E 26 71 70 7F 3D 36 36 7A 21 64 83 73
70 6E 6E 7E 7F 7B 68 66 23 36 3E 69 68 67 25 2E 2E 62 39 7C 1A 6B
78 66 66 76 77 73 60 6E 2B 3E 36 61 60 6F 2D 26 26 6A 31 74 92 63
80 9E 9E 8E 8F 8B 98 96 D3 C6 CE 99 98 97 D5 DE DE 92 C9 8C E5 9B
88 96 96 86 87 83 90 9E DB CE C6 91 90 9F DD D6 D6 9A C1 84 6D 93
90 8E 8E 9E 9F 9B 88 86 C3 D6 DE 89 88 87 C5 CE CE 82 D9 9C F4 8B
98 86 86 96 97 93 80 8E CB DE D6 81 80 8F CD C6 C6 8A D1 94 7C 83
A0 BE BE AE AF AB B8 B6 F3 E6 EE B9 B8 B7 F5 FE FE B2 E9 AC C7 BB
A8 B6 B6 A6 A7 A3 B0 BE FB EE E6 B1 B0 BF FD F6 F6 BA E1 A4 4F B3
B0 AE AE BE BF BB A8 A6 E3 F6 FE A9 A8 A7 E5 EE EE A2 F9 BC D6 AB
B8 A6 A6 B6 B7 B3 A0 AE EB FE F6 A1 A0 AF ED E6 E6 AA F1 B4 5E A3
C0 DE DE CE CF CB D8 D6 93 86 8E D9 D8 D7 95 9E 9E D2 89 CC A1 DB
C8 D6 D6 C6 C7 C3 D0 DE 9B 8E 86 D1 D0 DF 9D 96 96 DA 81 C4 29 D3
D0 CE CE DE DF DB C8 C6 83 96 9E C9 C8 C7 85 8E 8E C2 99 DC B0 CB
D8 C6 C6 D6 D7 D3 C0 CE 8B 9E 96 C1 C0 CF 8D 86 86 CA 91 D4 38 C3
E0 FE FE EE EF EB F8 F6 B3 A6 AE F9 F8 F7 B5 BE BE F2 A9 EC 83 FB
E8 F6 F6 E6 E7 E3 F0 FE BB AE A6 F1 F0 FF BD B6 B6 FA A1 E4 0B F3
F0 EE EE FE FF FB E8 E6 A3 B6 BE E9 E8 E7 A5 AE AE E2 B9 FC 92 EB
F8 E6 E6 F6 F7 F3 E0 EE AB BE B6 E1 E0 EF AD A6 A6 EA B1 F4 1A E3

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

Исходник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
void print(const uint8_t* buf, int size) {
	for (int i = 0; i < size; i++) printf("%02X ", buf[i]);
	printf("\n");
}

void test2(const char* text) {
	int len = strlen(text), size = len + 3;
	uint8_t key[] = "\0secretkeyizmnogabukav"; // Ключ шифрования
	print(key, size);
	uint8_t* buf = new uint8_t[size];
	uint8_t *check = (buf + size - 2); // Последние два байта контрольное значение
	for (int i = 0; i < 256; i += 8) {
		// Заполнение буфера
		*buf = (uint8_t)i;
		memcpy(buf + 1, text, len);
		check[0] = (i >> 4) | ((i << 4) & 0xF0);
		check[1] = check[0];
		if(i == 0) print(buf, size); // Вывод нешифрованного
		// Шифрование
		cbc_encrypt(key, sizeof(key), buf, size);
		print(buf, size);
		// Дешифрование для проверки
		cbc_decrypt(key, sizeof(key), buf, size);
		if (check[0] != ((i >> 4) | ((i << 4) & 0xF0)) || check[1] != check[0]) printf("ERROR\n"); // Проверка
	}
	delete[] buf;
}


int main()
{
	test2("message la-la-la...");
	return 0;
}

...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790574
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПервый байт случайный, перебрал все варианты кратные 8-ми, он не шифруется
Ну тогда может его не первым слать? А первым - просто случайный байт, ни от чего не зависящий и ни на что не влияющий, и пусть его все читают.

Так же и про последний, если и он влияет. Опять же про случайное смещение второго не забываем - тоже вариант.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790646
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на number used once.
...
Рейтинг: 0 / 0
Пятничная криптостойкость
    #39790652
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размышлял про RC4. Хотелось бы задействовать, но резко усложняется решение в целом, т.к. невозможно зашифровать произвольное место потока. Пришел к выводу что даже если кто-то подслушивающий расшифрует несколько сессионных ключей - это не критично. Это будет достаточно сложно если с помощью RC4 нарастить ключ до размера пакета.

Главная проблема в том чтобы не засветить мастер-ключ (МК), который шифрует сессионные. Он постоянный и его расшифровка сводит все шифрование к нулю.
Как вариант рассматриваю добавление соли: посчитать MD5(МК+соль) и полученный хэш использовать для шифрования сессионного ключа. Соответственно передавать соль + шифрованный сессионный.
...
Рейтинг: 0 / 0
25 сообщений из 137, страница 1 из 6
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная криптостойкость
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]