Всегда возвращать буквенно-цифровые символы?

У меня чертовски много времени, чтобы понять это. Как, например, MD5 или SHA1 хешируют строку и возвращают только буквенно-цифровые символы. Я имею в виду, если я не совсем ошибаюсь, они оба, или, по крайней мере, MD5, преобразуют строку в двоичный файл, а затем добавляют все, что отсутствует, чтобы иметь возможность разбить его на блоки по 512 символов. Затем он выполняет ряд операций, одна из которых — операция XOR над одним из 32 слов каждого фрагмента. Я имею в виду, что это не может быть чистой удачей, чтобы просто получить буквенно-цифровые символы в конце, XOR должен производить что-то еще?

Может ли кто-нибудь объяснить мне или даже привести небольшой пример, где кто-то XOR использует строку в java или php?


person user1768788    schedule 11.09.2013    source источник
comment
tools.ietf.org/html/rfc1321 и stackoverflow.com/questions/997284/   -  person Mark Baker    schedule 11.09.2013
comment
Надеюсь, я правильно понял, но md5 всегда возвращает 16 байтов, которые можно расширить до строки длиной 32, выраженной в шестнадцатеричном формате.   -  person Dave Chen    schedule 11.09.2013
comment
Они не делают. Обычно вы видите двоичный результат, закодированный в шестнадцатеричном формате (или иногда в base64).   -  person kiheru    schedule 11.09.2013
comment
Независимо от того, насколько большое целое число, вы можете записать его в десятичной системе счисления, используя только цифры 0–9, или в двоичной системе счисления, используя только 0 и 1, или в шестнадцатеричной системе счисления, используя 0–9 и a–f.   -  person Joshua Taylor    schedule 11.09.2013


Ответы (2)


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

Вывод хэша MD5 представляет собой 16-байтовое (128-битное) значение. Полный диапазон значений, которые может иметь один байт, может быть показан как двузначное шестнадцатеричное значение. Это шестнадцатеричное значение может находиться в диапазоне от 00 до FF, что в десятичном виде составляет от 0 до 255 или, возможно, более четко в двоичном формате от 00000000 до 11111111 (восемь бит в байте).

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

РЕДАКТИРОВАТЬ:

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

Когда вы хешируете строку, она хэшируется как данные с использованием кодировки, такой как UTF-8. Например, представление hello в UTF-8 — это 01101000 01100101 01101100 01101100 01101111 в двоичном формате или 68 65 6C 6C 6F в шестнадцатеричном формате. Это число является фактическим входом в хэш.

person Dev    schedule 11.09.2013
comment
Хорошо, но все же, если вывод отображается в шестнадцатеричном формате. Затем из того, что я прочитал в вики, как алгоритм делает так, что любой двоичный материал, который он получает, всегда становится буквенно-цифровым? - person user1768788; 11.09.2013
comment
@ user1768788 Я обновил свой ответ, чтобы уточнить. Чтобы ответить вам напрямую, хэши работают с произвольными данными, не обязательно буквенно-цифровыми. - person Dev; 11.09.2013
comment
Я мог быть неясен в своем вопросе, позвольте мне продемонстрировать: у вас есть строка, которую вы хотите хешировать, например, вопросительный знак (?), в двоичном формате, то есть: 00111111 Теперь с MD5 они имеют разные значения для запуска различные операции, скажем, ваше значение равно b (01100010), и вы выполняете XOR: 00111111 01100010 -------- 01011101 Это новое двоичное значение равно ], я не понимаю, как он не может получить где-то такой результат. Я не могу сделать так, чтобы в этом тексте были пробелы, поэтому за разъяснениями обратитесь сюда: ЗДЕСЬ - person user1768788; 11.09.2013
comment
@user1768788 user1768788 Вывод хеша — это не символьные данные, это просто число, очень большое число (в частности, для md5 вывод представляет собой 128-битное число). Если это число совпадает с какой-либо кодировкой символов в определенных позициях байтов, это просто совпадение. - person Dev; 11.09.2013
comment
это число да, которое преобразуется в строку, я прав? почему эта строка НИКОГДА не является чем-то иным, кроме буквенно-цифрового? - person user1768788; 11.09.2013
comment
@user1768788 user1768788 Число не является и не должно расшифровываться как символьные данные. Большинство программ просто отображают шестнадцатеричное значение числа. - person Dev; 11.09.2013
comment
@ user1768788 - Как уже упоминал Дев, один байт может представлять 256 значений. С помощью символов 0-9 и A-F вы можете представить 16 значений. С двумя одинаковыми символами вы можете представить 16 * 16 значений, это то же самое, что и один байт (256). Таким образом, вы можете просмотреть каждый байт вашего хеша MD5 и представить его двумя такими символами, это шестнадцатеричное представление, своего рода кодировка. - person martinstoeckli; 11.09.2013

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

person Kayaman    schedule 11.09.2013
comment
Я до сих пор не понимаю, конечно, это может быть шестнадцатеричный, но шестнадцатеричный может отображать больше, чем просто буквенно-цифровые символы? Если я не совсем ошибаюсь, ! в шестнадцатеричном формате 21? - person user1768788; 11.09.2013
comment
Нет, шестнадцатеричное представление строго использует символы 0-9 и a-f. Любое двоичное значение, в том числе полученное из хэша, может отображаться в шестнадцатеричном виде. - person GriffeyDog; 11.09.2013