Как работает XOR Hash + Выбор ключа - PullRequest
2 голосов
/ 10 марта 2010

Мне было поручено реализовать хэш XOR для двоичной строки переменной длины в Perl;длина может варьироваться от 18 до более 100. В моем понимании, я XOR двоичной строки у меня с ключом.Я прочитал два различных приложения этого онлайн:

  1. Один из вариантов, если длина моего ключа короче строки, я делю строку на блоки, которые являются длинойключ;затем все они складываются вместе (поэтому длина полученного хэша будет равна длине ключа).
  2. Я также читал, что вы просто XOR для ключа в каждом блоке длины ключа строки (таким образом, полученный хеш будет длиной строки).

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

Наконец, есть ли хороший способ для генерации достаточно случайного ключа?И есть ли подходящая длина для ключа, основанного на длине хэшируемых строк?

РЕДАКТИРОВАТЬ: Кстати, я очень хорошо знаю, как плохо работает этот хэш.Это строго для сравнения.:)

Ответы [ 5 ]

3 голосов
/ 10 марта 2010

Еще одна альтернатива, из здесь (поиск хэширования XOR).

Предполагая, что хэш должен быть длиной x байтов, разбить сообщение на блоки по x байтов; и скопировать их вместе. Это практически то же самое, что и использование метода 1 с ключом x 0. (или, альтернативно, начиная с ключа первых x байтов строки и игнорируя эти первые байты строки. Весьма забавный способ думать об этом)

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

РЕДАКТИРОВАТЬ: Еще одна маленькая вещь; если метод 1 использует один и тот же ключ во всех двоичных строках, которые хэшируются; тогда это не действительно не имеет значения, что это за ключ. xor'ing против константы сродни, скажем, ROT13 . <sarcasm> В качестве альтернативы, если вы используете SHA1 для получения ключа на строку ... это может сделать хэш XOR намного лучше. </sarcasm>

key xor key == 0 //always
key xor (((key xor msg1) xor msg2) xor msg3) 
== (msg1 xor msg2 xor msg3)
1 голос
/ 10 марта 2010

xor не очень хороший способ хеширования:

1 - это своего рода хеш, поскольку вы действительно не можете получить исходные данные с ключом или без него. Я предлагаю использовать sha2 (224/256/384/512), MD5, RIMM160 или джакузи, если вы можете

2 - шифр xor с повторяющимся ключом. это определенно не хеш.

что касается генерации случайных чисел, вы можете найти программы, которые генерируют иррациональные числа в шестнадцатеричном формате (например, pi: 3.243F6A8885A308D313198A2E03707344A4093822299 ....)

1 голос
/ 10 марта 2010

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

0 голосов
/ 10 марта 2010

Если вы хотите выполнить 'хеш', который использует только XOR, я просто разделил бы строку на блоки некоторого заранее определенного размера X. Не забудьте каким-то образом компенсировать, когда входная строка меньше X.

0 голосов
/ 10 марта 2010

Первый метод может быть использован для создания быстрого и грязного хеша строки.

Второй метод может быть использован для создания быстрого, грязного и ужасно небезопасного симметричного шифрования строки.

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

Случайность ключа не будет вашей самой большой проблемой - вся техника небезопасна.

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

...