Как работает хеш XOR + выбор ключа
Мне было поручено реализовать хеш XOR для двоичной строки переменной длины в Perl; длина может варьироваться от 18 до более чем 100. В моем понимании этого, я XOR двоичная строка у меня есть с ключом. Я прочитал два разных приложения этого онлайн:
- Один из вариантов - если длина моего ключа короче строки, Я разделяю строку на блоки, которые являются длиной ключа; затем все они складываются вместе (таким образом, длина результирующего ключа хэш - это длина ключа).
- я также читал, что вы просто XOR ключ через каждый блок длины ключа строки (так что результирующий хэш будет длиной строки).
Является ли один из них более правильным, чем другой? Это для хеширования значений в индексе, поэтому я склонен думать, что первый вариант (который может привести к короткому хэшу) будет лучше.
Наконец, есть ли хороший способ генерировать достаточно случайный ключ? И есть ли хорошая длина, чтобы выбрать ключ на основе длины строк, которые будут хэшироваться?
EDIT: кстати, я очень хорошо знаю, как плохо работает этот хэш. Это только для сравнения. :)
5 ответов:
Еще одна альтернатива, из здесь (поиск хеширования XOR).
Предполагая, что хэш должен быть длиной x байт, разбейте сообщение на блоки по x байт; и xor их вместе. Это фактически то же самое, что использовать метод 1 с ключом x 0. (или, альтернативно, начинать с ключа первых x байтов строки и игнорировать эти первые байты строки. Всевозможные забавные способы думать об этом)
(Также обратите внимание на то, что говорится о хешировании XOR, а именно что это плохо. Очень плохо.) (Грубо. Это лучше, чем альтернативы, но этого недостаточно для многого из того, для чего используется хэширование)
EDIT: еще одна маленькая вещь; если метод 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)
Обычно вы хотите, чтобы все ваши хэш-значения были последовательной длины. Второй метод, который вы описываете, звучит как шифрование, когда вы хотите восстановить свои данные, первый-это односторонний хэш.
Xor - не очень хороший способ хэширования:
1-это своего рода хэш, так как вы действительно не можете получить исходные данные обратно, с ключом или без ключа. я предлагаю использовать sha2 (224/256/384/512), md5, ripemd160 или whirlpool, если вы можете
2-это шифр xor с повторяющимся ключом. это определенно не гашиш.
Что касается генерации случайных чисел, вы можете найти программы, которые генерируют иррациональные числа в шестнадцатеричном формате (например, pi: 3. 243F6A8885A308D313198A2E03707344A4093822299....)
Первый метод может быть использован для создания быстрого и грязного хэша строки.
Второй метод может быть использован для быстрого, грязного и ужасно небезопасного симметричного шифрования строки.Если вам нужен хэш, используйте первый метод (или даже лучше, выберите существующую хэш-функцию из списка.)
Случайность ключа не будет вашей самой большой проблемой - вся техника небезопасна.Чем длиннее ключ, тем отчетливее чем больше хэш-значений вы получите, тем меньше вероятность столкновения. Это не займет много времени, прежде чем коллизии будут очень редки для наборов данных среднего размера.
Если вы хотите выполнить "хэш", который использует только XOR, я бы просто разделил строку на блоки некоторого заданного размера X. Не забудьте как-то компенсировать, когда входная строка меньше X.
Comments