Функция ручного хеширования - PullRequest
1 голос
/ 16 ноября 2010

Мне нужна хеш-функция H (X), выполняющая следующее:

(1) Вводит около 10 цифр и выводит около 10 цифр.

(2) Если вы измените Xдаже одной цифрой вы получаете совершенно другое значение H (X).

(3) Легко вычислить вручную .Люди будут вычислять это вручную .Мне нужно, чтобы они могли делать это быстро и без ошибок.

Спасибо за ваши творческие идеи!

edit : Под "хэшем" я имею в виду что-то вдух "одностороннего хэша".То есть - учитывая H (X), должно быть трудно найти возможные значения для X. Трудно для человека.

edit : Для чего это нужно?Это для экзамена.Студенты собираются делать расчеты и получать числа в качестве ответов.Я хочу, чтобы они могли во время теста знать, правильно ли они ответили на все вопросы.Идея такова: объединить все ответы с одним числом X. Затем вычислить H (X).Затем используйте H (X), чтобы расшифровать некоторый код, цифра за цифрой, и получите короткое сообщение, указывающее вашу правильность.Я не хочу, чтобы они могли выяснить 4-й ответ после того, как они получили первые 3.

Ответы [ 3 ]

2 голосов
/ 16 ноября 2010

Хеш-функции, такие как MD5, SHA1 и т. Д., Представляют собой комбинацию функции шифрования (обычно блочного шифра) и функции сжатия.

Поскольку сжатие вам не нужно, простейшая конструкциябудет вычислять побитовый модуль входного числа и некоторый номер ключа.Если бы вы могли использовать новый ключ для каждого номера, ваш код был бы неразрывным (это называется одноразовой клавиатурой).

Вот как работает хеш-функция Дэвиса – Мейера, где E - некоторая функция шифрования, а I - вход:

H[0] = <SOME CONSTANT>
for (i in I[1:])
   H[i] = H[i-1] mod E(H[i-1] with key I[i])

Если вы взяли каждый элемент в I как цифру,Ваше шифрование (E) может быть добавлением цифры к ключу мод 10 и добавлением 1.

Основой более сложного блочного шифрования является некоторая схема замены (замена чисел или битовых последовательностей другими) и перестановки (перестановкацифры или битовые последовательности внутри фразы) h.

2 голосов
/ 16 ноября 2010

Каждая цифра является коэффициентом многочлена: т.е. 1234 равно 1 * x ^ 3 + 2 * x ^ 2 + 3 * x + 4. Вычислите значение полинома для некоторого заранее определенного X, скажем, 987654321, и обрежьте его до нужного количества цифр.

0 голосов
/ 16 ноября 2010

Мое лучшее предположение, что это будет какая-то система CAPTCHA или математическая головоломка.Но я думаю, что будет довольно сложно, если не невозможно, построить функцию, подчиняющуюся всем трем правилам.Если каждая цифра будет влиять на каждую другую цифру независимо, это будет составлять 10 ^ 2 зависимостей.

Ошибка, ладно, я все равно попробую.Как насчет этого:

Подготовьте 10 постоянных чисел c_0, c_1, .. , c_9, каждое из которых имеет 10 цифр.Сделайте их попарно совместными или такими.Выберите ваш номер хеш-ввода a случайным образом.Позвольте пользователю вычислить сумму цифр s из a.Последняя цифра i из s затем используется для выбора одной из этих констант c_i.Результат хеширования b равен a + c_i.

Пример:

c_0 = 4729703658
c_1 = 5793154234
c_2 = 0362709821
...
a = 8243047067
s = 41
i = 1
b = a + c_1 = 14036201301

Изменить одну цифру:

a = 7243047067
s = 40
i = 0
b = a + c_0 = 11972750725

Должно быть очевидно, чтоэта система не подходит для любых криптографических приложений.Также это довольно легко сломать как CAPTCHA.Я даже не думаю, что в большинстве случаев повернуть вспять слишком сложно, даже для людей.Но это может быть началом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...