decrypt encoding hash sha1 hashcode base32

encoding - decrypt - sha1 php



¿Por qué un SHA-1 Hash tiene 40 caracteres si solo tiene 160 bits? (6)

2 caracteres hexadecimales forman un rango de 0-255, es decir, 0x00 == 0 y 0xFF == 255. Por lo tanto, 2 caracteres hexadecimales son de 8 bits, lo que hace 160 bits para tu resumen de SHA.

El título de la pregunta lo dice todo. He estado investigando SHA-1 y en la mayoría de los lugares veo que tiene 40 caracteres hexadecimales, lo que para mí es 640 bits. ¿No podría representarse tan bien con solo 10 caracteres hexadecimales de 160 bits = 20 bytes? Y un personaje hexadecimal puede representar 2 bytes, ¿verdad? ¿Por qué es el doble de lo que necesita ser? ¿Qué me estoy perdiendo en mi comprensión?

¿Y no podría un SHA-1 tener solo 5 o menos caracteres si usa Base32 o Base36?


Creo que la confusión del OP proviene de una cadena que representa un hash SHA1 que toma 40 bytes (al menos si está usando ASCII), que equivale a 320 bits (no a 640 bits).

La razón es que el hash está en binario y la cadena hexagonal es solo una codificación de eso. Entonces, si usara una codificación más eficiente (o ninguna codificación), podría tomar solo 160 bits de espacio (20 bytes), pero el problema es que no será binario seguro.

Sin embargo, podría usar base64, en cuyo caso necesitaría entre 27 y 28 bytes (o caracteres) en lugar de 40 (consulte esta página ).


Hay dos caracteres hexadecimales por byte de 8 bits, no dos bytes por carácter hexadecimal.

Si está trabajando con bytes de 8 bits (como en la definición SHA-1), un carácter hexadecimal codifica un solo nibble de 4 bits alto o bajo dentro de un byte. Por lo tanto, se necesitan dos de esos caracteres para un byte completo.


Mi respuesta solo difiere de las anteriores en mi teoría en cuanto al origen EXACTO de la confusión del OP, y en los pequeños pasos que proporciono para la elucidación.

Un personaje ocupa diferentes números de bytes dependiendo de la codificación utilizada ( ver aquí ). Hay algunos contextos en estos días cuando usamos 2 bytes por carácter, por ejemplo cuando programamos en Java ( este es el motivo ). Así, 40 caracteres Java equivaldrían a 80 bytes = 640 bits, el cálculo del OP y 10 caracteres Java encapsularían la cantidad correcta de información para un hash SHA-1.

Sin embargo, a diferencia de los miles de caracteres Java posibles, solo hay 16 caracteres hexadecimales diferentes, a saber, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F Pero estos no son los mismos que los caracteres Java, y ocupan mucho menos espacio que las codificaciones de los caracteres Java 0 a 9 y de A a F. Son símbolos que representan todos los valores posibles representados por solo 4 bits:

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

Por lo tanto, cada carácter hexadecimal es solo medio byte, y 40 caracteres hexadecimales nos da 20 bytes = 160 bits, la longitud de un hash SHA-1.


SHA-1 es de 160 bits

Eso se traduce en 20 bytes = 40 caracteres hexadecimales (2 caracteres hexadecimales por byte)


Un carácter hexadecimal solo puede representar 16 valores diferentes, es decir, 4 bits. (16 = 2 4 )

40 × 4 = 160.

Y no, necesitas mucho más de 5 personajes en base-36.

Hay totalmente 2 160 hash SHA-1 diferentes.

2 160 = 16 40 , así que esta es otra razón por la cual necesitamos 40 dígitos hexadecimales.

Pero 2 160 = 36 160 log 36 2 = 36 30.9482 ... , por lo que todavía necesita 31 caracteres con base-36.