¿Existe una función de hash que escupe un carácter ASCII imprimible [cerrado]

0

Las funciones MD5 y SHA generan una cadena de Hex que representa los datos que el hash generó. ¿Existe un hash o una manera de convertir estos hashes para crear una salida que solo daría como resultado una cadena que solo use caracteres Ascii imprimibles?

En lugar de obtener un hash que solo tiene los valores posibles de [0-9] y [A-F]

Me gustaría obtener [0-9] y [AZ] y [az] [! @ # $% ^ & * - = _ + [] {} |; ': ",. / < & gt ;? '~]

Entiendo que el valor Hex que MD5 y Sha escupen es solo una representación del valor binario que realmente representan, por lo que quizás no sea tanto una función hash la que necesito, sino una forma diferente de analizar el binario. .

Sin embargo, si no me equivoco, una traducción directa de Hex a Ascii probablemente incluiría caracteres no imprimibles que anularían el propósito, por lo que supongo que necesitaría una función hash final, cuyo propósito del alma es hacer esto. / p>     

pregunta Mallow 09.07.2017 - 06:15
fuente

1 respuesta

3

Como usted dice, la salida de una función hash es simplemente una cadena de bits, y por lo tanto no está restringida al conjunto de caracteres ASCII. Entonces, lo que le gustaría hacer es codificar esos bits de manera más eficiente que la codificación hexadecimal, que solo es 50% eficiente.

Debes revisar la lista de métodos de codificación de binario a texto en Wikipedia , pero tu mejor La apuesta es Base 85 , que es 80% eficiente:

The proposed character set is, in order, 0–9, A–Z, a–z, and then
the 23 characters !#$%&()*+-;<=>?@^_'{|}~.

Este es un ejemplo de la salida de hash codificada en ambos sentidos:

$ python3
>>> import base64
>>> import hashlib
>>> data = 'The quick brown fox jumped over the lazy dog.'
>>> m = hashlib.md5(data.encode('ascii'))
>>> base64.b16encode(m.digest())
b'5C6FFBDD40D9556B73A21E63C3E0E904'
>>> base64.b85encode(m.digest())
b'TyOi'K-pDmbD|z&!{F%z'
>>>

(tenga en cuenta que las cadenas de salida codificadas son python citadas con b '', por lo que los dos primeros caracteres y el último carácter no forman parte de la cadena real)

    
respondido por el gowenfawr 09.07.2017 - 06:52
fuente

Lea otras preguntas en las etiquetas