Подтвердить что ты не робот

Почему длина символа SHA-1 Hash 40 длится всего 160 бит?

В заголовке вопроса говорится все. Я изучаю SHA-1, и большинство мест я вижу, что это 40 Hex-персонажей, которые мне до 640 бит. Не может ли он быть представлен точно так же, как только с 10 шестнадцатеричными символами 160 бит = 20 байт. И один шестнадцатеричный символ может представлять 2 байта вправо? Почему это вдвое дольше, чем нужно? Что мне не хватает в моем понимании.

И не может ли SHA-1 быть даже 5 или менее символов при использовании Base32 или Base36?

4b9b3361

Ответ 1

Один шестнадцатеричный символ может представлять только 16 различных значений, то есть 4 бита. (16 = 2 4)

40 & times; 4 = 160.


И нет, вам нужно гораздо больше, чем 5 символов в базе-36.

Существует всего 2 160 различных SHA-1 хешей.

2 160= 16 40 так что это еще одна причина, по которой нам нужно 40 шестнадцатеричных цифр.

Но 2 160= 36 160 log 36 2= 36 30.9482... так что вы все еще требуется 31 символ, используя base-36.

Ответ 2

Я думаю, что путаница OP возникает из строки, представляющей хэш SHA1, занимает 40 байт (по крайней мере, если вы используете ASCII), что равно 320 бит (не 640 бит).

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

Вы можете использовать base64, хотя в этом случае вам понадобится около 27-28 байт (или символов) вместо 40 (см. this page).

Ответ 3

Есть два шестнадцатеричных символа для 8-битового байта, а не два байта на шестнадцатеричный символ.

Если вы работаете с 8-битными байтами (как в определении SHA-1), то шестнадцатеричный символ кодирует один высокий или низкий 4-битный кусок в байте. Поэтому для полного байта требуется два таких символа.

Ответ 4

2 шестнадцатеричных символа составляют диапазон от 0 до 255, то есть 0x00 == 0 и 0xFF == 255. Таким образом, 2 шестнадцатеричных символа имеют 8 бит, что делает 160 бит для вашего SHA-дайджест.

Ответ 5

SHA-1 составляет 160 бит

Это соответствует 20 байтам = 40 шестнадцатеричных символов (2 шестнадцатеричных символа на каждый байт)

Ответ 6

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

A символ занимает различное количество байтов в зависимости от используемой кодировки (см. здесь). В наши дни есть несколько контекстов, когда мы используем 2 байта на символ, например, при программировании на Java (вот почему). Таким образом, 40 символов Java будут равны 80 байтам = 640 бит, вычислению ОП и 10 символам Java действительно будут инкапсулировать нужный объем информации для хэша SHA-1.

В отличие от тысяч возможных символов Java, однако, существует только 16 различных шестнадцатеричных символов, а именно 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E и F. Но они не совпадают с символами Java и занимают гораздо меньше места, чем кодировки символов Java от 0 до 9 и от A до F. Они являются символами, обозначающими все возможные значения представленный всего 4 битами:

0  0000    4  0100    8  1000    C  1100
1  0001    5  0101    9  1001    D  1101
2  0010    6  0110    A  1010    E  1110
3  0011    7  0111    B  1011    F  1111

Таким образом, каждый шестнадцатеричный символ составляет только половину байта, а 40 шестнадцатеричных символов дают нам 20 байт = 160 бит - длину хэша SHA-1.