Esiste una funzione hash che sputa il carattere ASCII stampabile [chiuso]

0

Le funzioni MD5 e SHA generano una stringa di esadecimale che rappresenta i dati generati dall'hash. Esiste un hash che esiste o un modo per convertire questi hash per creare un output che risulterebbe in una stringa usando solo caratteri Ascii stampabili.

Invece di ottenere un hash che ha solo i valori possibili di [0-9] e [A-F]

Mi piacerebbe ottenere [0-9] e [AZ] e [az] [! @ # $% ^ & * - = _ + [] {} |; ': ",. / < & gt ;? '~]

Capisco che il valore Hex che MD5 e Sha sputano siano solo una rappresentazione del valore binario che rappresentano effettivamente, quindi forse non è tanto una funzione hash di cui ho bisogno, ma piuttosto un modo diverso di analizzare il binario .

Tuttavia, se non sbaglio una traduzione diretta da esadecimale ad Ascii conterrebbe molto probabilmente caratteri non stampabili che vanificherebbero lo scopo, quindi suppongo che avrei bisogno di una funzione di hash finale il cui scopo dell'anima è quello di fare proprio questo.

    
posta Mallow 09.07.2017 - 06:15
fonte

1 risposta

3

Come dici tu, l'output di una funzione di hash è semplicemente una stringa di bit, e quindi non limitato al set di caratteri ASCII. Quindi quello che vorresti fare è codificare quei bit in modo più efficiente rispetto alla codifica esadecimale, che è efficiente solo al 50%.

Dovresti esaminare l' elenco dei metodi di codifica binario-testo su Wikipedia , ma il tuo meglio la scommessa è Base 85 , che è efficiente all'80%:

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

Ecco un esempio di output hash codificato in entrambi i modi:

$ 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'
>>>

(nota che le stringhe di output codificate sono python quotate con b '', quindi i primi due caratteri e l'ultimo carattere non fanno parte della stringa effettiva)

    
risposta data 09.07.2017 - 06:52
fonte

Leggi altre domande sui tag