Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Пятничная криптостойкость / 25 сообщений из 137, страница 1 из 6
22.03.2019, 20:02
    #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
22.03.2019, 20:13
    #39790299
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная криптостойкость
В твоём протоколе все UDP пакеты независимые? Или образуют Stream?
...
Рейтинг: 0 / 0
22.03.2019, 20:18
    #39790300
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная криптостойкость
maytonВ твоём протоколе все UDP пакеты независимые? Или образуют Stream?
Образуют Stream, в котором контролируется правильность полученного, это вложенный уровень, его не обсуждаем.
В данном случае надо просто понять что пакет был зашифрован тем же симметричным ключом, которым расшифрован, при этом не ослабить шифрование.
...
Рейтинг: 0 / 0
22.03.2019, 20:30
    #39790301
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная криптостойкость
В каждый конец открытого текста пакета дописываются 0x5AA5 ?
...
Рейтинг: 0 / 0
22.03.2019, 20:31
    #39790302
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная криптостойкость
maytonВ каждый конец открытого текста пакета дописываются 0x5AA5 ?
Да.

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

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

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

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

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

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

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

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

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

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

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

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

Можно после первой пары байт давать смещение второй пары, что-б никто не догадался (с).
Отличная идея. У меня первый байт и так случайный, можно его дважды в конце повторить.
...
Рейтинг: 0 / 0
23.03.2019, 19:08
    #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
24.03.2019, 12:55
    #39790574
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пятничная криптостойкость
Dima TПервый байт случайный, перебрал все варианты кратные 8-ми, он не шифруется
Ну тогда может его не первым слать? А первым - просто случайный байт, ни от чего не зависящий и ни на что не влияющий, и пусть его все читают.

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

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


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