У дусі конкурсу Underhanded C я розпочинаю конкурс Underhanded Code. Мета цього конкурсу полягає в тому, щоб прямо реалізувати якийсь код, при цьому тонко приховавши в ньому нечестивий помилку.
Конкурс
Ви таємний російський крот, який працює в ІТ-відділі американського шпигунського агентства. Ваш американський бос щойно попросив вас застосувати алгоритм збору паролів, який слід використовувати для шифрування секретних повідомлень.
Ваш начальник хоче, щоб ви реалізували таку функцію:
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
, тим краще.
Примітки
Ви можете використовувати будь-яку мову для реалізації свого коду. Ви намагаєтесь приховати помилку на очах, тому не заперечений код не пропонується.
Можливо, ви захочете поглянути на деяких попередніх переможців конкурсу Underhanded C, щоб отримати уявлення про те, що добре подає заяву.
Рядки введення будуть друкуватися ascii (від 32 до 126, включно). Ви можете припустити розумну максимальну довжину, якщо хочете.