В духе конкурса « Поднятый 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 включительно). Вы можете принять разумную максимальную длину, если хотите.