|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|||||||||||
Взломать детский шифр17.12.2018, 17:21. Показов 5819. Ответов 58
Метки cryptandcod (Все метки)
Всем доброго времени суток, товарищи программеры. Перед тем, как приступить непосредственно к делу, мне хотелось бы поведать небольшую предысторию. Учусь в общеобразовательной школе в 11-м классе (физмат). Со мной есть еще несколько типов, с которыми мы по фанчику постепенно учим криптографию и называем друг друга нумерологами
Мы решили составить свой шифр (на программной основе), который имел бы достаточную стойкость (на уровне 11 класса). (ДЛЯ ЕДКИХ - Я ПРЕКРАСНО ПОНИМАЮ, ЧТО НЕ НАДО ПРИДУМЫВАТЬ НИЧЕГО ИЗ ОБЛАСТИ КРИПТОГРАФИИ, ПОКА У ТЕБЯ НЕТ ХОТЯ БЫ ДОКТОРСКОЙ СТЕПЕНИ ПО МАТЕМАТИКЕ) Но суть в том, чтобы придумать самим, а не использовать уже готовые решения (что-то вроде развития мозгов). Это задание решили отдать мне, т.к. я представляю, как работает сеть Фейстеля. Что касается ключа, было решено, что он должен обладать небольшой длиной, но все же достаточной для того, чтобы малолетки его не перебрали. В качестве идеального варианта взяли 64 бита. Дальше я уже додумывал сам. Это должна быть функция, желательно вызываемая из dll-библиотеки. Шифровать она должна линейный массив байтов, т.к. любой тип данных можно представить массивом байтов. Выдавать для удобства тоже желательно массив байтов. Ключ, как ни странно тоже проще задавать массивом байтов. И для приличия ввел нечто напоминающее iv - массив байтов , равный размеру блока, который тупо ксорится с первым блоком, публикуется открыто и не дает возможности понять, что одним и тем же ключом 2 раза шифровался один и тот же открытый текст. Длина блока 8 байт (как у ключа), шифр целиком представляет собой сеть Фейстеля "в лоб", и с этими мыслями приступил к кодингу (на паскале). Получил следующий код:
- скорость на моем пентиуме порядка 18 Кб/с в обе стороны, что позволяет шифровать текст адекватного размера, но и фотку сожрать тоже может, однако придется подождать - время обработки данных как функция от длины массива возрастает +- линейно, как и должно быть Для самой непосредственной реализации шифрования начеркал такой код (особо не заморачивался):
- шифротекст архиватор не сжимает вообще (так я проверил его на избыточность) - в среднем всех байтов в шифротексте примерно поровну (нормальное распределение) - после шифрования размер массива не увеличивается больше, чем на длину блока (просто разметка дополняет открытый текст нулями до длины, кратной 8, а при расшифровке их выбрасывает) - изменение хотя бы одного байта шифротекста в любой позиции губит весь открытый текст при расшифровке (избыточность каждого байта открытого текста перераспределяется на весь шифротекст) - изменение хотя бы одного байта ключа, как ни странно тоже сказывается плачевноЭтот шифр приняли. Исходник служит одновременно релизом и описанием. Если релиз написан нерационально, прошу не пинать, т.к. писал с нуля и не исключаю, что что-то сделал криво (багов там вроде нет). Пока никто из наших его не взломал. Лично я тоже не представляю, как это можно сделать на практике, и пишу это все для того, чтобы узнать, что по этому поводу скажут прошаренные бородатые дядьки-программеры. Для того, чтобы не вызывать каких-то абстрактных рассуждений, предлагаю дешифровать конкретный файл (зашифрованная фотография .jpg - файл binarnik.bin - прикрепляю в архиве вместе со всеми исходниками). Если кому-то надо, там и SHA256 для расшифрованного файла. iv тоже прилагается. И на всякий случай, фотки в интернете нету - она отснята моим фотоаппаратом и после дешифровки, разумеется, становится общественным достоянием. На адекватные вопросы обязательно отвечу. Всем заранее спасибо.
0
|
|||||||||||
| 17.12.2018, 17:21 | |
|
Ответы с готовыми решениями:
58
Взломать шифр двойной перестановки Взломать шифр Виженера методом частотного анализа |
|
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
|
|||
| 24.12.2018, 17:34 | |||
|
Картинка в jpg:
0
|
|||
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
||||||
| 24.12.2018, 19:57 [ТС] | ||||||
|
Добавлено через 15 минут https://ru.wikipedia.org/wiki/ГОСТ_28147-89 Там вроде тоже все довольно просто. Кстати, функция для сети фейстеля оттуда нормальная? Если взять что-то на нее похожее? А если имеют место небезосновательные опасения, что из организаций https://www.veracrypt.fr/en/Downloads.html Добавлено через 2 минуты Ну а если очень хочется самому кодить, то в .NET - платформе есть System.Security.Cryptography
0
|
||||||
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
||||||
| 26.12.2018, 16:02 [ТС] | ||||||
|
Вот вчера слепил такое:
Работает быстрее, чем предыдущий, но насколько именно - не проверял. (для On18 - кроме сложения 32-битных чисел по разным модулям там ничего и нету ). На баги особо не проверял, но по крайней мере запустилось. Тест нулей прошел нормально. Кто что может сказать по этому коду?Архив с исходниками:
0
|
||||||
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 26.12.2018, 16:04 [ТС] | |
|
И еще блоки брались случайные, так чтобы 1 байт встречался ровно 1 раз, и чтобы значение каждого байта не совпадало с его индексом в таблице.
0
|
|
|
461 / 201 / 80
Регистрация: 14.12.2017
Сообщений: 433
|
|
| 27.12.2018, 18:36 | |
|
Выглядит на много лучше.
Сойдет.
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 27.12.2018, 20:12 [ТС] | |
|
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|||||||||||
| 29.12.2018, 17:19 [ТС] | |||||||||||
|
хотя рано радоваться....
![]() нашел потенциальную какашку:
Добавлено через 3 минуты есть еще идея увеличить для ЧСВ размер ключа и блока до 128 бит. стоит?
0
|
|||||||||||
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 01.01.2019, 21:24 [ТС] | |
|
С новым годом!
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
||||||||||||
| 03.01.2019, 14:08 [ТС] | ||||||||||||
|
К стати, функцию расширения ключа
Добавлено через 1 час 34 минуты ![]() к случайному ключу [67, 58, 109, 198, 22, 192, 208, 39] у меня вручную получилось вычислить эквивалентный: [73, 64, 115, 204, 16, 186, 202, 33] правда стоит заметить, что этот ключ эквивалентный только для 1 блока, и судя по всему не будет работать для шифра целиком, т.к. там идет цепочка перексориваний, но этого достаточно для того, чтобы функцию без раздумий кинуть в топку ![]() Добавлено через 2 минуты код для проверки чтоб другие не писали себе заново:
вот собсно расчет: берем случайный ключ: [67, 58, 109, 198, 22, 192, 208, 39] выбрасываем подстановку из массива и перексоривания, т.к. там биекция и один хрен ничего не поменяется. разбиваем исходный ключ на 2 таблицы: [67, 58, 109, 198] [22, 192, 208, 39] и для более общего вида нумеруем эти числа: [A, B, C, D] [E, F, G, H] составляем таблицу подстановок: [A + E] [A + F] [A + G] [A + H] [B + E] [B + F] [B + G] [B + H] [C + E] [C + F] [C + G] [C + H] [D + E] [D + F] [D + G] [D + H] [E + A] [E + B] [E + C] [E + D] [F + A] [F + B] [F + C] [F + D] [G + A] [G + B] [G + C] [G + D] [H + A] [H + B] [H + C] [H + D] теперь берем любое число из этого списка и присваиваем ему любое значение: A = 73 отсюда уже ясно, что эквивалентных ключей может быть дохера. теперь считаем: (a + e) mod 256 = (67 + 22) mod 256 = 89 (e + 73) mod 256 = 89 e = (89 + 256 - 73) mod 256 = 16 это у нас число под номером e в эквивалентном ключе. аналогично получаем: (b + e) mod 256 = (22 + 58) mod 256 = 80 (b + 16) mod 256 = 80 b = (80 + 256 - 16) mod 256 = 64 (c + e) mod 256 = (22 + 109) mod 256 = 131 (c + 16) mod 256 = 131 c = (131 + 256 - 16) mod 256 = 115 (d + e) mod 256 = (22 + 198) mod 256 = 220 (d + 16) mod 256 = 220 d = (220 + 256 - 16) mod 256 = 204 (a + f) mod 256 = (67 + 192) mod 256 = 3 (f + 73) mod 256 = 3 f = (3 + 256 - 73) mod 256 = 186 (d + g) mod 256 = (198 + 208) mod 256 = 150 (g + 204) mod 256 = 150 g = (150 + 256 - 204) mod 256 = 202 (d + h) mod 256 = (198 + 39) mod 256 = 237 (d + 204) mod 256 = 237 h = (237 + 256 - 204) mod 256 = 33 вот и выходит эквивалентный ключ: [73, 64, 115, 204, 16, 186, 202, 33]
0
|
||||||||||||
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
||||||||||||||||
| 06.01.2019, 16:45 [ТС] | ||||||||||||||||
|
вот немного помозговал и сделал так:
Еще заметил, что раундовые ключи и результаты образующей функции нет смысла передавать в виде чисел - в самом деле, вот мы в образующей функции все делаем, делаем, делаем над массивом из байтов, переводим его в беззнаковое целое... НАХ?!! чтобы перексорить его с правым блоком и в следующем раунде обратно разложить на 8 байт? так проще сразу передать его массивом. ну а что до сложения по модулю 2^64 можно просто попарно складывать байты по модулю 256, один хер ничего не поменяется. результат вычислений конечно поменяется но суть - нисколько. с раундовыми ключами то же самое. для функции расширения ключа вроде получилось показать, что эквивалентных ключей у нее нет, и что для каждого ключа не существует такого второго, что при расширении этого второго получится тот же ключ, что и для первого, только в обратном порядке.Кто что может сказать по этому коду? Какие перспективы его стойкости? архив с исходниками:
0
|
||||||||||||||||
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 06.01.2019, 16:52 [ТС] | |
|
байты для табличек брал отсюда:
https://www.random.org опять же каждая табличка содержит 1 байт только 1 раз и значение каждого байта не совпадает с его индексом в таблице. больше никакие критерии к табличкам не предъявлялись
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
||||||||||||||||
| 14.01.2019, 16:32 [ТС] | ||||||||||||||||
|
вот еще напоследок составил такой код (по ходу самый нормальный)
таблица подстановок для него:
архив:
0
|
||||||||||||||||
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 15.01.2019, 17:16 [ТС] | |
|
вы что, уснули все?
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 21.01.2019, 17:01 [ТС] | |
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 26.01.2019, 16:10 [ТС] | |
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 29.01.2019, 19:02 [ТС] | |
интересно, сколько здесь будет смайликов?
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 09.02.2019, 17:56 [ТС] | |
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 19.02.2019, 17:19 [ТС] | |
0
|
|
|
23 / 20 / 4
Регистрация: 15.12.2018
Сообщений: 152
|
|
| 11.04.2019, 21:11 [ТС] | |
0
|
|
| 11.04.2019, 21:11 | |
|
Составить программу шифрования и расшифровки в Delphi по соответствующему заданию: шифр Атбаш + шифр Цезеря Шифр Полибия. Программа выводит шифр в разной последовательности.
Детский сад Детский вопрос: Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|