В духе конкурса « Поднятый C» я начинаю конкурс «Подпольный код». Целью этого конкурса является прямая реализация некоторого кода, при этом незаметно скрывая в нем гнусную ошибку.
Конкурс
Вы секретный русский крот, работающий в отделе информационных технологий американского шпионского агентства. Ваш американский начальник только что попросил вас внедрить алгоритм хеширования паролей для шифрования секретных сообщений.
Ваш начальник хочет, чтобы вы реализовали следующую функцию:
f: String -> byte[16]
который преобразует пароль в 16-байтовое количество, подходящее для использования в качестве ключа AES. Ваш начальник хочет иметь безопасную функцию, которая в этом контексте означает, что разные строки пароля должны давать разные результаты с подавляющей вероятностью. Например, возврат хеша md5 для ввода будет простой реализацией f
.
Конечно, ваш настоящий начальник в российском шпионском агентстве хотел бы, чтобы вы сорвали этот процесс. Ваша задача - реализовать f
так, чтобы россияне могли расшифровать все секретные сообщения, зашифрованные с помощью ключей, возвращаемых f
.
Для этого необходимо реализовать f
так, чтобы он возвращал только небольшое подмножество из 2 ^ 128 возможных выходных данных. В частности, вы f
должны вернуть не более 2 ^ 16 разных результатов, чтобы русские могли легко и просто перебрать правильный ключ для каждого зашифрованного сообщения, которое они хотят расшифровать.
Имейте в виду, однако, что шпионаж несет смертную казнь. Чтобы не быть пойманным, ваша функция f
должна генерировать как минимум 2 ^ 8 различных результатов, так что беглый осмотр нескольких выходных данных f
вряд ли обнаружит дубликат. И самое главное, код, который вы вводите для ограничения диапазона, f
должен выглядеть непреднамеренно, а не преднамеренно. Если вас когда-либо вытащили в зал суда, должны быть некоторые разумные сомнения относительно того, преднамеренно или случайно вы внесли ошибку.
судейство
Я и двое других, которых я найму, будут судить записи (напишите мне, если хотите судить). Я предлагаю награду в 200 репутаций за победу. Материалы должны быть загружены до 1 мая.
Судейство будет учитывать следующие критерии:
- Есть ли
f
прилипают к спецификации, то есть делает его генерировать между 2 ^ 8 и 2 ^ 16 возможных выходов. Не думайте, что это жесткие ограничения, но мы будем вычитать очки, если вы слишком далеко за пределами диапазона. - Является ли ошибка вероятным результатом непреднамеренной ошибки?
- Выходы
f
выглядят случайными? - Чем короче ваша реализация
f
, тем лучше. - Чем яснее ваша реализация
f
, тем лучше.
Заметки
Вы можете использовать любой язык для реализации своего кода. Вы пытаетесь скрыть ошибку на виду, поэтому запутанный код не рекомендуется.
Возможно, вы захотите взглянуть на некоторых из предыдущих победителей конкурса «Подхохлое С», чтобы понять, что делает хорошую подачу.
Входные строки будут напечатаны в формате ascii (от 32 до 126 включительно). Вы можете принять разумную максимальную длину, если хотите.
источник
Ответы:
С
2 ^ 16 возможных выходов (или 2 ^ 8 раз количество используемых символов).
Использует Linux-реализацию MD5, что, AFAIK, отлично. Но это дает тот же хеш, например, для «40» и «42».
РЕДАКТИРОВАТЬ: переименован
bcopy
вmemcpy
(поменялся параметрами конечно).РЕДАКТИРОВАТЬ: преобразованы из программы в функции, чтобы лучше соответствовать требованиям.
источник
bcopy
шаге ... это немного ошибочно, так как фактическаяbcopy
функция BSD здесь будет работать правильно.bcopy
глючит. Я изменю это наmemcpy
, и тогда та же самая реализация станет действительной.С
Возможно, это не самая яркая запись в конкурсе, но я думаю, что следующий тип хеш-функции мог бы быть сделан любым программистом, слишком умным для своего блага, с неопределенным представлением о типе операций, которые вы видите в хеш-функциях:
На самом деле хеш-функция может возвращать не более L * 2048 разных результатов, где L - количество разных длин входной строки, которые могут возникнуть. На практике я протестировал код на 1,85 миллиона уникальных строк ввода со страниц справочника и HTML-документов на своем ноутбуке и получил только 85428 различных уникальных хэшей.
источник
Scala:
Проверьте, если результат не похож на аналогичный вход:
Ошибка использует только простые числа для кодирования. Вместо того
ценности, мы заканчиваем
так как есть 54 простых числа ниже 256.
источник
5.22e27 >> 2^16
, Там нет способа грубой силы, что много возможностей.