Ищете алгоритм хеширования, в котором небольшое изменение ввода приведет к небольшому изменению хеша

Текущие хеш-функции предназначены для больших изменений хеш-функции, даже если изменяется только очень небольшая часть входных данных. Что мне нужно, так это хеш-алгоритм, выходная мутация которого будет прямо пропорциональна входной мутации. Например, мне нужно что-то похожее на это:

Hash("STR1") => 1000
Hash("STR2") => 1001
Hash("STR3") => 1002

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

Мое текущее требование - иметь большой битрейт (возможно, 512 бит?), Чтобы избежать коллизий.

Спасибо

ОБНОВИТЬ

Думаю, мне следует прояснить свою цель, я вижу, что очень плохо справился с объяснением того, что мне нужно. Извините, я не носитель английского языка и отличный коммуникатор.

Так что в основном мне нужен этот алгоритм хеширования для поиска похожих двоичных файлов. Вы можете думать об этом как об алгоритме хеширования антивируса. Он вычисляет контрольную сумму файла, но в отличие от традиционных функций хеширования, даже после небольшой модификации двоичного файла вредоносной программы, он все еще может ее обнаружить. Это в значительной степени то, что я ищу.

Другой аспект - избежать столкновения. Позвольте мне объяснить, что я имею в виду под этим. Это не противоречивая цель. Я хочу, чтобы Hash («STR1») производил 1000, а Hash («STR2») производил 1001 или 1010, может быть, не имеет значения, пока значение близко к предыдущему хешу. Но хэш («Это очень большая строка или, может быть, даже двоичные данные» + 100 случайных символов) не должен давать значение, близкое к 1000. Я понимаю, что это не будет работать всегда, и будут некоторые конфликты хешей / хеш-диапазона, но Я думаю, что могу представить другой алгоритм хеширования и проверить оба, чтобы минимизировать коллизии.

Так что ты думаешь? Может, есть лучший способ достичь своей цели, может, я слишком многого прошу, я не знаю. Я плохо разбираюсь в криптографии, математике или алгоритмах.

Еще раз спасибо за ваше время и усилия


person Davita    schedule 19.07.2016    source источник
comment
Надеюсь, вы знаете, что это очень слабая защита с точки зрения безопасности, но я думаю, что смогу кое-что найти ...   -  person Laurel    schedule 19.07.2016
comment
Да не в целях безопасности, а для поиска :). Спасибо за ваши усилия, Лорел :)   -  person Davita    schedule 19.07.2016
comment
Вам нужно, чтобы 1str, 2str, 3str также были близко друг к другу?   -  person brian beuning    schedule 19.07.2016
comment
Предотвращение коллизий несовместимо с вашей целью сохранения близости результатов хеширования. Вам нужно будет выбрать один.   -  person    schedule 19.07.2016
comment
Хеширование с учетом местоположения может сделать это, хотя в конечном итоге вы получите больше коллизий. Если ваш набор данных известен и достаточно мал, вы можете создать идеальную хеш-функцию, хотя это не выполняет вашу задачу по небольшому изменению ввода, что приводит к небольшому изменению вывода. Вам может быть нужен минимальный идеальный хеш.   -  person Jim Mischel    schedule 19.07.2016
comment
Привет, ребята, я обновил вопрос, чтобы лучше описать мою проблему. Еще раз спасибо   -  person Davita    schedule 19.07.2016


Ответы (6)


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

Однако я думаю, что «минимальные коллизии» и «пропорциональное изменение выпуска» - цели противоречивые.

person Jonathon Reinhart    schedule 19.07.2016
comment
Я тоже думал об этом, но решил все же попробовать, может быть, есть способ получше, кто-то умнее меня уже придумал :). В любом случае, спасибо, если я не смогу найти лучший подход, я выберу этот путь - person Davita; 19.07.2016

Извините, неправильно прочитал ваш вопрос. MD5 или SHA-x - это не то, что вам нужно.

Согласно Википедии, например, https://en.wikipedia.org/wiki/Substitution_cipher имеет нет лавинного эффекта (это вы имеете в виду под этим словом).

Что касается хеширования, вы можете использовать какое-то общее число.

Например:

char* hashme = "hallo123";
int result=0;
for(int i = 0; i<8; ++i) {
   result += hashme[i];
}

Надеюсь, теперь это поможет больше.

person Cadoiz    schedule 19.07.2016

В других областях это называется перцептивным хешированием.

Один из подходов к этому заключается в следующем:

  1. Получите обучающий мультимножество n-граммов. (Например, если n = 2 и ваши тренировочные данные были «Это тест», ваш тренировочный набор будет «Th», «hi», «is», «s» и т. Д.)
  2. Отсортируйте и вычислите частоты указанных n-граммов по убыванию.

Тогда хеш слова - это первые биты "для каждого n-грамма в базе данных, является ли частота этого слова на n-грамм выше, чем средняя частота?"

Обратите внимание, что это может и приведет к множеству столкновений с похожими словами, к сожалению, если только длина хеша не будет абсурдно длинной.

person TLW    schedule 19.07.2016

Возможно, он ориентирован на детей, но старый В детском отделе АНБ есть несколько действительно хороших идей.

Конечно, эти алгоритмы действительно небезопасны, поэтому вы не можете использовать их вместо НАСТОЯЩЕГО шифрования. (Но вы также не можете использовать настоящий алгоритм шифрования, когда просто хотите повеселиться.)


Сетка чисел включает настройку сетки с последующим использованием координат каждой буквы:

сетка букв

Дальнейшие идеи:

  • Смешайте буквенное расположение
  • Преобразование чисел в двоичное для обфускации

Извилистый путь также использует сетку. По сути, буквы располагаются в сетке слева направо рядами вниз. Результат получается путем вертикального разреза сетки:

Пароль - это загадка

person Laurel    schedule 19.07.2016
comment
Спасибо, Лорел. Извините, может быть, я задаю глупый вопрос, но все же чем этот подход лучше, чем то, что предложил @Jonathon Reinhart, суммируя все байты? И это моя вина, я имею дело не только со строками, а с двоичными данными. Я обновил вопрос, чтобы лучше описать мою проблему. Еще раз спасибо за ваше время - person Davita; 19.07.2016

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

В качестве небольшого отступления о том, почему эти алгоритмы ведут себя так: они по необходимости разработаны, чтобы скрыть статистические отношения между входом и выходом, чтобы их было труднее взломать. Например, в английском языке буква «е» является наиболее часто используемой буквой; в некоторых очень слабых классических шифрах вы можете просто найти наиболее распространенную букву и цифру, которые соответствуют «е» (например, если n - самая распространенная буква, то шансы равны n = e). Фактически, описанный вами статистический шаблон, вероятно, сделает алгоритм значительно более уязвимым для атак с выбранным открытым текстом, известным открытым текстом, человеком в середине и повторным воспроизведением.

Атаки «человек посередине» и «повторное воспроизведение» были бы значительно проще, поскольку было бы намного проще редактировать зашифрованный текст для получения желаемого открытого текста, не зная ключа (особенно если у вас есть доступ к паре выбранных открытых текстов).

Если ты знаешь это

7/19/2016 1:35 transfer $10 from account x to account y

(где отметка даты используется для защиты от атаки повторного воспроизведения) кодируется как

12345678910

в то время как

7/19/2016 1:40 transfer $10 from account x to account y

кодирует в

12445678910

это довольно безопасное предположение, что

12545678910

будет означать что-то вроде

7/19/2016 1:45 transfer $10 from account x to account y

Не имея доступа к исходному ключу, вы могли бы регулярно воспроизводить этот пакет, чтобы продолжать кражу денег с чьей-либо учетной записи, просто внося тривиальные изменения. Конечно, это довольно надуманный пример, но он все же иллюстрирует основную проблему.

Насколько я понимаю, то, что вы ищете, - это статистическое сходство между файлами. Некоторым это может помочь: https://en.wikipedia.org/wiki/Semantic_similarity

person EJoshuaS - Reinstate Monica    schedule 19.07.2016

Это действительно существует. Этот термин - хеширование с учетом местоположения. Конкретную реализацию можно найти здесь: https://github.com/trendmicro/tlsh. В зависимости от исходного документа вам может потребоваться цифровая криминалистика или VisualRank (от Google) для поиска похожих изображений и видео. Для текстовых данных это обычно используется в антиспаме (подробнее см. Здесь: http://spdp.di.unimi.it/papers/pdcs04.pdf). Для двоичных файлов вы можете сначала запустить дизассемблер, а затем запустить алгоритм в текстовой версии - но это только мое ощущение, у меня нет исследований, подтверждающих это утверждение, но это было бы интересной гипотезой для проверки.

person Ace.Di    schedule 21.02.2018