Domanda:
Come determinare quale tipo di codifica / crittografia è stato utilizzato?
Karthik
2011-05-20 16:12:11 UTC
view on stackexchange narkive permalink

C'è un modo per scoprire quale tipo di crittografia / codifica viene utilizzato? Ad esempio, sto testando un'applicazione Web che memorizza la password nel database in un formato crittografato ( WeJcFMQ / 8 + 8QJ / w0hHh + 0g == ). Come faccio a determinare quale hashing o crittografia viene utilizzato?

Alcuni contenuti di (o collegamenti che puntano a) una metodologia servono a spiegare come identificare determinati tipi di crittografia o codifica in uno scenario completamente a conoscenza zero. La maggior parte di queste risposte è "è impossibile" e il mio istinto mi dice che nulla nel nostro settore è impossibile.
@atdre Grazie per la generosità. La domanda sembra focalizzata sui formati di hashing delle password: è anche questo il tuo obiettivo? Mi sembra la cosa migliore e se le persone vogliono rispondere alla domanda sui formati di file, possono fare un'altra domanda.
@atdre: "Impossible" è solitamente una scorciatoia per "impossibile con la tecnologia attuale / non finirà prima della morte termica dell'universo".
@nealmcb: Identificazione di testo non in chiaro crittografato o codificato.
Ho posto una domanda simile su SE: http://stackoverflow.com/questions/988642/how-would-i-reverse-engineer-a-cryptographic-algorithm
Potresti usare un rilevatore online come: [https://md5hashing.net/hash_type_checker”(https://md5hashing.net/hash_type_checker) nel tuo caso indica: ** Base64 ** Encoding
Nove risposte:
Thomas Pornin
2011-05-23 20:00:49 UTC
view on stackexchange narkive permalink

La tua stringa di esempio ( WeJcFMQ / 8 + 8QJ / w0hHh + 0g == ) è la codifica Base64 per una sequenza di 16 byte, che non sembra ASCII o UTF-8 significativi. Se questoèun valore memorizzato per la verifica della password (cioè non proprio una password "crittografata", piuttosto una password "con hash") allora questo è probabilmente il risultato di una funzione hash calcolato sulla password; l'unica funzione hash classica con un'uscita a 128 bit è MD5. Ma potrebbe essere qualsiasi cosa.

Il modo "normale" per saperlo è guardare il codice dell'applicazione. Il codice dell'applicazione è incarnato in un modo tangibile e grasso (file eseguibili su un server, codice sorgente da qualche parte ...) che non è e non può essere protetto quanto una chiave segreta può. Quindi il reverse engineering è la "strada da percorrere".

Escludendo il reverse engineering, puoi fare alcuni esperimenti per provare a fare ipotesi plausibili:

  • Se lo stesso utente " cambia "la sua password ma la riutilizza, il valore memorizzato cambia? Se sì, allora parte del valore è probabilmente un "sale" casuale o IV (assumendo la crittografia simmetrica).
  • Supponendo che il valore sia deterministico dalla password per un dato utente, se due utenti scelgono lo stesso password, restituisce lo stesso valore memorizzato? In caso negativo, probabilmente il nome utente fa parte del calcolo. Potresti provare a calcolare MD5 ("nome utente: password") o altre varianti simili, per vedere se ottieni una corrispondenza.
  • La lunghezza della password è limitata? Vale a dire, se imposti una password di 40 caratteri e non riesci ad autenticarti digitando solo i primi 39 caratteri, significa che tutti i caratteri sono importanti e ciò implica che questa è davvero hashing della password, non crittografia (il valore memorizzato viene utilizzato per verificare una password, ma la password non può essere recuperata solo dal valore memorizzato).
Grazie per gli input .. Per favore, dimmi di più su come hai confermato che è una codifica Base64 per una sequenza di 16 byte. ** Per quanto riguarda i tuoi esperimenti, ** Sì, questo è un valore memorizzato per la verifica della password. 1) se un utente cambia la password, cambia anche il valore memorizzato. 2) se due utenti scelgono la stessa password, il valore memorizzato è lo stesso 3) la lunghezza della password non è limitata.
@Learner: _ qualsiasi_ sequenza di 24 caratteri, in modo tale che i primi 22 siano lettere, cifre, "+" o "/" e gli ultimi due segni "=", è una codifica Base64 valida di un valore a 128 bit. E qualsiasi valore a 128 bit, se codificato con Base64, produce una sequenza del genere.
Questa è la risposta giusta, anche se volevo sentire alcuni potenziali trucchi se il codice dell'applicazione non è disponibile. Se hai a che fare con un'applicazione binaria a codice chiuso, controlla http://aluigi.org/mytoolz.htm#signsrch
Se è MD5 puoi provare uno qualsiasi dei siti Web di cracking di MD5 come http://www.md5decrypter.co.uk/. Nessuno di questi è veloce o garantito per dare un risultato. Google per "md5 cracking" per trovare altro. Questo ti darà anche un elenco esteso su http://www.stottmeister.com/blog/2009/04/14/how-to-crack-md5-passwords/
john
2011-05-20 16:22:41 UTC
view on stackexchange narkive permalink

Modifica: ho appena notato uno script molto interessante chiamato hashID. Il nome lo descrive più o meno.

~~~

In generale, usare l'esperienza per fare ipotesi plausibili è il modo in cui vengono fatte queste cose.

Ecco un elenco con un numero molto elevato di output hash in modo da sapere come ognuno di essi appare e creare firme / schemi o semplicemente verificare otticamente.

Ci sono due cose principali che devi prima prestare attenzione a:

  • la lunghezza dell'hash (ogni funzione hash ha una lunghezza di output specifica)
  • l'alfabeto utilizzato (sono tutte lettere inglesi? numeri 0-9 e AF così esadecimale? Quali caratteri speciali ci sono se ce ne sono?)

Diversi programmi di cracking delle password (John the Ripper per esempio) applicano alcuni pattern matching sull'input per indovinare l'algoritmo utilizzato, ma questo funziona solo su hash generici. Ad esempio, se prendi un output hash e ruoti ogni lettera di 1, la maggior parte degli schemi di corrispondenza dei modelli fallirà.

grazie .. ho dato un'occhiata e ho provato con poche password. ma il metodo funziona dato lo scenario in cui sappiamo che la password è hash e non crittografata, giusto?
Le password di solito non sono crittografate, sono sottoposte ad hashing e solitamente rappresentate nella forma in cui la funzione le emette, quindi puoi trovare molte di queste forme nei collegamenti sopra. Alla fine, l'output di tutte le funzioni sono solo cifre binarie che di solito sono rappresentate e memorizzate come rappresentazione esadecimale o come rappresentazione base64.
Questo programma è spazzatura.Non è nemmeno in grado di identificare un hash base64.
Base64 non è un hash, è una codifica.
Yaur
2011-05-23 08:34:11 UTC
view on stackexchange narkive permalink

Ciò che hai pubblicato sono 16 byte (128 bit) di dati codificati in base 64. Il fatto che sia codificato in base 64 non ci dice molto perché la base 64 non è un algoritmo di crittografia / hashing, è un modo per codificare i dati binari in testo. Ciò significa che questo blocco include un'informazione utile, ovvero che l'uscita è lunga 16 byte. Possiamo confrontarlo con la dimensione del blocco degli schemi comunemente usati e capire cosa non può essere. Gli schemi di gran lunga più comuni sono:

La prossima cosa che dobbiamo fare è guardare altri blocchi di testo cifrato per capire la risposta alla seguente domanda:

  • I testi cifrati hanno tutti la stessa lunghezza, anche per lunghezze di input differenti?

Se non tutti i blocchi hanno la stessa lunghezza, non stai guardando un algoritmo di hashing, ma uno di crittografia. Poiché l'output sarà sempre un multiplo della dimensione del blocco sottostante, la presenza di un blocco che non è uniformemente divisibile per 16 byte significherebbe che non può essere AES e quindi deve essere DES o 3DES.

Se tu avere la capacità di inserire una password e osservare l'output questo può essere determinato molto rapidamente. Basta inserire una password di 17 caratteri e guardare la lunghezza. Se i suoi 16 byte hai MD5, 20 byte significa SHA-1, 24 byte significa DES o 3DES, 32 byte significa AES.

:-p non capisco .. è un dato codificato in base 64 ?? Come? e sicuramente non ho capito la parte in cui dici "se qualche blocco non è uniformemente divisibile per 16 byte probabilmente è DES o 3DES, altrimenti AES molto probabilmente" mi ha fatto luce su questo. :)
@The Learner Ho aggiunto alla risposta per renderlo, si spera, più chiaro. Se puoi usare il testo in chiaro scelto, probabilmente puoi risolverlo da questo.
grazie mille .. sto iniziando a ricevere la seconda parte. e dopo aver posto questa domanda qui, ho letto da qualche parte in Google che l'hashing è molti-a-uno, il che significa che molti testi diversi potrebbero essere sottoposti ad hashing su uno stesso output (per favore correggimi se sbaglio). arrivando al nostro scenario, tutti i blocchi di testo cifrato non hanno la stessa lunghezza .. quindi ora posso essere sicuro che non siano hash ma crittografati? Ma ancora, non ho capito come hai detto che i dati che ho pubblicato sono 16 byte di dati codificati in base 64. Se c'è una cifra o un hash, come potrei dire che si tratta di un dato a 16 o 32 byte?
@the learner = as padding è caratteristico di base64. Questo strumento http://home2.paulschou.net/tools/xlate/ (da una ricerca su google su base64 decoder hex) convertirà dalla base 64 a un array di valori esadecimali. basta incollare il testo nella casella di base 64 e fare clic su decodifica e contare i byte. puoi anche stimare prendendo il numero di caratteri nella stringa base64 e moltiplicando per 0,75
@Karthik, ci sono pochissimi modi per rappresentare un numero (che è quello che sarà il risultato finale dell'hashing o della crittografia) come testo compatto e leggibile dall'uomo.I modi dominanti sono esadecimali (A-F, 0-9) e base 64 (A-Z, a-z, 0-9, +, /).C'è anche tecnicamente la possibilità di provare a visualizzare i dati come una codifica di testo (ASCII, UTF-8, ecc.), Sebbene questo sia in genere solo un segno di non sapere come visualizzare i dati (ad esempio, provare ad aprire un file binario inbloc notes).Lo riconosceresti principalmente guardando semplicemente quali tipi di personaggi appaiono e da lì provi a indovinare.
Quindi la base 64 ha anche il riempimento rivelatore (il "=" s).Questo è davvero il più grande indicatore di essere base64.Ma poi devi ricordare che molti luoghi non memorizzano * solo * un hash, ma in realtà hanno una rappresentazione testuale che include separatori e altri campi (ad esempio, per salt, un ID di cui è stato utilizzato l'algoritmo di hashing, ecc.).Ciò consente francamente di raccogliere molte più informazioni, ma non si applica qui.Importante da tenere a mente poiché quegli altri caratteri non fanno parte del modo in cui i dati vengono codificati.
bethlakshmi
2011-05-20 22:47:36 UTC
view on stackexchange narkive permalink

Dipende dal formato: alcuni protocolli per l'archiviazione di testo crittografato hanno una parte di testo in chiaro che definisce come viene crittografato. Dal tuo esempio, sono dubbioso poiché la stringa a cui fai riferimento è così breve che sembra che sia solo il testo crittografato.

Suggerirei un paio di pensieri:

  • Il "==" alla fine sarebbe sicuramente un riempimento, quindi non includerlo in nessun tentativo di decrittografia.

  • Potresti avere a che fare con un hash o un hash salato, piuttosto che la crittografia. In tal caso, il tentativo di "decrittografare" i dati non funzionerà: è necessario abbinare le password utilizzando lo stesso valore hash e / o salt utilizzato originariamente. Non c'è modo con una password salata per ottenere il valore originale.

  • La soluzione migliore in assoluto è ottenere una copia del codice utilizzato per memorizzare le password. Da qualche parte lì dentro, le password stanno subendo un'operazione crittografica. Trova il codice per sapere cosa sta succedendo qui. 9 volte su 10, utilizzano una sorta di API per l'hashing / salting / crittografia e puoi imitarlo o invertirlo usando la stessa API.

Il "==" alla fine è un segno rivelatore del valore codificato in base64. L'imbottitura è necessaria; non solo * lo lasci cadere *. Per prima cosa decodifichi i dati in base64, POI giocaci.
Puoi tagliare il riempimento perché puoi calcolarlo in base alla lunghezza del messaggio. Per utilizzare base64 in una stringa di query, devi praticamente passarla attraverso una trasformazione webSafeBase64, quindi invertire il processo prima della decodifica.
Jeff Ferland
2011-05-23 20:17:42 UTC
view on stackexchange narkive permalink

La codifica può generalmente essere indovinata. Ad esempio, la stringa che hai pubblicato nella tua domanda è codificata Base64. I segni di uguale stanno riempiendo nello schema Base64. Questo è qualcosa che so a vista per esperienza.

Se mi hai dato una stringa che è stata crittografata, potrei essere in grado di dirti la codifica ma non posso dirti l'algoritmo utilizzato per crittografarla a meno che è disponibile una sorta di metadati. Il motivo è questo: gli algoritmi di crittografia funzionano producendo quelli che sembrano essere dati casuali. Se crittografassi due frasi ciascuna con due cifre (quattro uscite), non saresti in grado di dirmi con sicurezza quale testo cifrato apparteneva a quale cifrario a meno che tu non lo decifrasse o lo rompessi.

istanza specifica, le password vengono solitamente sottoposte ad hashing. Ciò significa che non puoi recuperare la password dall'hash, ma puoi verificare se l'hash corrisponde alla password. A questo proposito, la risposta di @ giovanni è d'oro. Se puoi inserire una password che conosci e poi provare schemi comuni contro di essa, puoi imparare qual è l'hash utilizzato.

Ilmari Karonen
2011-10-20 16:23:25 UTC
view on stackexchange narkive permalink

Se questo è davvero un semplice hash della password, potremmo essere in grado di utilizzare Google per decifrarlo. Base64 è difficile da cercare, tuttavia, con tutte quelle barre e segni più, quindi convertiamo prima quell'hash in esadecimale:

  $ perl -MMIME :: Base64 -le 'print unpack "H * ", decode_base64" WeJcFMQ / 8 + 8QJ / w0hHh + 0g == "'59e25c14c43ff3ef1027fc3484787ed2  

OK, ora possiamo Google for it. Al momento, ricevo solo un riscontro da md5this.com, anche se ovviamente ce ne saranno presto altri, incluso questo post.

Sfortunatamente (o forse fortunatamente, a seconda della tua prospettiva), non siamo abbastanza fortunati da trovare effettivamente una preimage (il sito attualmente elenca questo hash come "cracking ..."), ma il fatto che sia affatto su quella lista suggerisce fortemente che si tratta effettivamente di un hash MD5 non salato di una vera password.

Molto interessante come Google possa aiutare in questa situazione.Buona condivisione!
Nam Nguyen
2011-05-20 18:01:55 UTC
view on stackexchange narkive permalink

L'unico modo è indovinare. Con l'esperienza, le ipotesi saranno più corrette.

Ad esempio: in base alla lunghezza dell'output: l'output MD5 è di 128 bit o 16 byte, l'output SHA1 è di 160 bit o 20 byte. Basato sul set di caratteri dell'output: BASE64 produce l'output con caratteri stampabili.

Alla fine della giornata, è l'approccio di prova ed errore che ti insegna come.

user185
2011-05-20 18:26:47 UTC
view on stackexchange narkive permalink

L'unico modo è quando ci sono alcuni metadati che te lo dicono. Ad esempio, ultimamente ho lavorato con i PDF e il formato include un dizionario contenente il filtro, l'algoritmo, la dimensione della chiave, ecc. Ma se tutto ciò che hai è il testo cifrato, allora tutto ciò che hai è un blob opaco di dati.

mti2935
2020-03-24 19:03:59 UTC
view on stackexchange narkive permalink

Questa è una sicurezza molto debole su tutti i fronti! Il testo in chiaro è P4 $$ w0rdP4 $$ w0rd ed è crittografato utilizzando la crittografia XOR, con la chiave CdZ4MLMPgYtAE9gQ80gMtg == . Questo produce il testo cifrato inviato dall'OP sopra, WeJcFMQ/8+8QJ/w0hHh+0g==”.

Per verificare:

Per prima cosa, usa xxd per ottenere il binario sottostante del testo in chiaro:

  echo -n 'P4 $$ w0rdP4 $$ w0rd' | xxd -b -c16  

Questo produce:

  01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100  

Successivamente, decodifica in base64 la chiave e usa xxd per ottenere il binario sottostante della chiave:

  echo -n 'CdZ4MLMPgYtAE9gQ80gMtg ==' | base64 -d | xxd -b -c16  

Questo produce:

  00001001 11010110 01111000 00110000 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110  

Ora, XOR le due stringhe binarie:

  01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 01010000 00110100 00100100 00100100 01110111 00110000 01110010 01100100 (testo in chiaro) [XOR 110001011 10110011 00001111 10000001 10001011 01000000 00010011 11011000 00010000 11110011 01001000 00001100 10110110 (chiave) ----------------------------------- -------------------------------------------------- -------------------------------------------------- -------- 01011001 11100010 01011100 00010100 11000100 00111111 11110011 11101111 00010000 00100111 11111100 00110100 10000100 01111000 01111110 11010010 (testo cifrato)  

Infine, usa bc, xxd e base64 per convertire il testo cifrato binario in base64:

  echo "obase = 16; ibas e = 2; 01011001111000100101110000010100110001000011111111110011111011110001000000100111111111000011010010000100011110000111111011010010 "| bc | xxd -p -r | base64  

Questo produce WeJcFMQ / 8 + 8QJ / w0hHh + 0g == , che è il testo cifrato inviato dall'OP nella domanda sopra.


Mi scuso se questa risposta sembra artificiosa. Certo, lo è. Domande simili a questa, in cui il poster fornisce solo un testo cifrato e chiede alcune informazioni su come quel testo cifrato avrebbe potuto essere prodotto, sembrano sorgere abbastanza spesso su security.stackexchange.com; e questa domanda è spesso indicata come un duplicato di quelli. Lo scopo di questa risposta è illustrare che domande di questa natura non hanno risposta, perché ci sono infinite soluzioni a questi tipi di domande.

Aspetta, quindi hai semplicemente scelto una password, un metodo "hash" (XOR) e quindi la forza bruta per una chiave che ha prodotto il testo cifrato dato?La tua ultima frase è oro, ma penso che potrebbe valere la pena sottolinearla un po 'di più.Qualcuno che non presta molta attenzione potrebbe facilmente andarsene pensando che tu abbia "risolto" il problema.
@Conor Mancone, Grazie per il feedback.La crittografia XOR può essere `` decodificata '', in modo che se conosci 2 delle 3 variabili (cioè testo in chiaro, chiave, testo cifrato), puoi facilmente trovare la terza.[testo in chiaro xor chiave = testo cifrato, testo cifrato xor chiave = testo in chiaro, testo in chiaro xor testo cifrato = chiave].Ho appena creato un testo in chiaro (P4 $$ w0rdP4 $$ w0rd), quindi ho usato la terza equazione sopra per trovare la chiave che avrebbe prodotto il testo cifrato che l'OP ha pubblicato, dato il testo in chiaro che ho scelto.Avrei potuto scegliere qualsiasi testo in chiaro.
Mi chiedevo se potessi risolvere direttamente con XOR.Non ho mai giocato nei dettagli con i metodi di crittografia reali, quindi non ero del tutto sicuro.Grazie!


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...