Опираясь на ответ эфемиата , я думаю, вы можете сделать что-то вроде этого:
Выберите свой любимый блочный шифр с симметричным ключом (например, AES). Для конкретности скажем, что он работает на 128-битных блоках. Для данного ключа K обозначим функцию шифрования и функцию дешифрования через Enc (K, блок) и Dec (K, блок) соответственно, так что block = Dec (K, Enc (K, block)) = Enc (K, Дек (К, блок)).
Разделите ваши входные данные на массив 128-битных блоков (заполнение по мере необходимости). Вы можете выбрать фиксированный ключ K или сделать его частью ввода в хэш. Далее мы предположим, что это исправлено.
def hash(input):
state = arbitrary 128-bit initialization vector
for i = 1 to len(input) do
state = state ^ Enc(K, input[i])
return concatenate(state, Dec(K, state))
Эта функция возвращает 256-битный хеш. Не должно быть слишком сложно проверить, что оно удовлетворяет условию «рефлексивности» с одним предупреждением - входы должны быть дополнены целым числом 128-битных блоков перед присоединением хеша. Другими словами, вместо hash (input) = hash (input + hash (input)), как было указано изначально, мы имеем hash (input) = hash (input '+ hash (input)), где input' - это просто дополненный ввод. Надеюсь, это не слишком обременительно.