C'è un punto fisso MD5 dove md5 (x) == x?


114

C'è un punto fisso nella trasformazione MD5, cioè esiste x tale che md5(x) == x?


8
Quale trasformazione md5? Quello matematico (da qualsiasi stringa di bit a 128 bit) o ​​quello da qualsiasi stringa di byte a una stringa esadecimale di 32 caratteri (quella pratica)? Non è ovvio che le risposte per entrambi siano le stesse ...
Rafał Dowgird

4
Bene, sono la stessa risposta, giusto? Sappiamo che non esiste una x non lunga 128 bit per cui md5(x) == x, poiché md5(x) è lunga 128 bit. Pertanto, esiste un punto fisso in md5 per input di dimensioni arbitrarie se e solo se esiste un punto fisso in md5 sul dominio a 128 bit.
il paul

1
Non credo che siano la stessa risposta poiché per la pratica stringa esadecimale di 32 caratteri è una scelta arbitraria se si rappresentano le cifre esadecimali in maiuscolo [AF] o in minuscolo [af]. Entrambe le rappresentazioni corrispondono allo stesso numero a 128 bit ma produrranno hash diversi se fornite come input per MD5. Quindi la probabilità che ci sia un punto fisso in una delle rappresentazioni è infatti1-(1/e)*(1/e) ≈ 86.47%
Dušan

Risposte:


138

Poiché una somma MD5 è lunga 128 bit, qualsiasi punto fisso dovrebbe necessariamente essere lungo 128 bit. Supponendo che la somma MD5 di una stringa è distribuita uniformemente su tutte le possibili somme, allora la probabilità che un dato stringa di 128 bit è un punto fisso è 1 / 2 128 .

Pertanto, la probabilità che nessun stringa di 128 bit è un punto fisso è (1 - 1 / 2 128 ) 2 128 , quindi la probabilità che vi sia un punto fisso è 1 - (1 - 1 / 2 128 ) 2 128 .

Poiché il limite per n va all'infinito di (1 - 1 / n ) n è 1 / e , e 2 128 è sicuramente un numero molto grande, questa probabilità è quasi esattamente 1 - 1 / e ≈ 63,21%.

Ovviamente, non è coinvolta la casualità: o c'è un punto fisso o non c'è. Ma possiamo essere fiduciosi al 63,21% che ci sia un punto fisso. (Inoltre, nota che questo numero non dipende dalla dimensione dello spazio delle chiavi: se le somme MD5 fossero 32 bit o 1024 bit, la risposta sarebbe la stessa, purché sia ​​maggiore di circa 4 o 5 bit).


11
Potete effettivamente supporre che la somma MD5 di ogni stringa sia distribuita uniformemente su tutte le possibili somme?
Ori Pessach

13
Sì. Numeri grandi e modulabili formano una distribuzione approssimativamente casuale. Se non lo facessero, avresti continue collisioni. La natura di md5 impone la distribuzione casuale del suo output.
Stefan Kendall

2
Ho usato la tua risposta come base per questa risposta: security.stackexchange.com/questions/3851/…
CesarB

1
Tieni un distintivo d'oro.
Dennis

Tranne che md5 è deterministico, non casuale.
PyRulez

13

Il mio tentativo di forza bruta ha trovato una corrispondenza di 12 prefissi e 12 suffissi.

prefisso 12: 54db1011d76dc70a0a9df3ff3e0b390f -> 54db1011d76d137956603122ad86d762

suffisso 12: df12c1434cec7850a7900ce027af4b78 -> b2f6053087022898fe920ce027af4b78

Post del blog: https://plus.google.com/103541237243849171137/posts/SRxXrTMdrFN


Il collegamento non funziona. Google plus ha chiuso ad aprile
Typewar

Spiacenti ... non ho salvato il post del blog e il backup di google + non funziona per me. Ma ecco il mio progetto
Github

Sei sicuro di questo: prefisso 12: 54db1011d76dc70a0a9df3ff3e0b390f -> 54db1011d76d137956603122ad86d762 Ho usato il md5sumcomando linux, ho ottenuto risultati diversi
ThunderPhoenix

Non sono sicuro che tu stia usando il md5sum corretto allora. Puoi anche confermarlo online qui: onlinemd5.com
Thomas Egense,

11

Poiché l'hash è irreversibile, sarebbe molto difficile da capire. L'unico modo per risolvere questo problema sarebbe calcolare l'hash su ogni possibile output dell'hash e vedere se hai trovato una corrispondenza.

Per elaborare, ci sono 16 byte in un hash MD5. Ciò significa che ci sono 2 ^ (16 * 8) = 3,4 * 10 ^ 38 combinazioni. Se ci volesse 1 millisecondo per calcolare un hash su un valore di 16 byte, ci vorrebbero 10790283070806014188970529154,99 anni per calcolare tutti quegli hash.


2
È vero, se dovessi provarli tutti . Ma dovresti solo provare ogni possibile input per verificare che non ci fosse un punto fisso. Se c'è un punto fisso (e la risposta di Adam Rosenfield suggerisce che potrebbe esserci), allora è sufficiente un'ipotesi fortunata.
Naaff

La funzione è irreversibile nel senso che non ha un inverso matematico, tuttavia questo significa solo che per un dato output possono esserci più di un input. In generale, lo spazio degli input per un dato output sarebbe infinito, ma se sai che è iniziato come un valore a 128 bit puoi restringere le possibilità. C'è la possibilità di "lavorare all'indietro" se non si tratta la funzione come una scatola nera, ma invece si leggono le specifiche e si applica un po 'di pensiero matematico.
rndmcnlly

2
@ Naaff: "devo solo provare ogni possibile input" - e questo è più facile che provare ogni hash, come? Al contrario, poiché diversi possibili input possono essere inseriti nello stesso output.
Piskvor ha lasciato l'edificio il

1
@Piskvor: Hai frainteso il significato di Naaff (anche a me ci è voluto un minuto). Un modo più chiaro per dirlo sarebbe "Solo se non c'è un punto fisso dovrai provare ogni input possibile (dallo spazio 2 ^ 128)". In altre parole, devi solo provare ogni possibilità se nessuna prima funziona. Quindi 1.08e28 anni, o un'ipotesi fortunata!
P Daddy

"Se ci volesse 1 millisecondo per calcolare un hash". Le GPU moderne possono calcolare miliardi di hash al secondo, molto più velocemente di così. Tuttavia, ci vorrebbe molto tempo.
markasoftware

0

Anche se non ho una risposta sì / no, la mia ipotesi è "sì" e inoltre che ci sono forse 2 ^ 32 tali punti fissi (per l'interpretazione della stringa di bit, non per l'interpretazione della stringa di caratteri). Ci sto lavorando attivamente perché sembra un puzzle fantastico e conciso che richiederà molta creatività (se non ti accontenti subito della ricerca della forza bruta).

Il mio approccio è il seguente: trattalo come un problema di matematica. Abbiamo 128 variabili booleane e 128 equazioni che descrivono gli output in termini di input (che dovrebbero corrispondere). Collegando tutte le costanti delle tabelle nell'algoritmo e nei bit di riempimento, la mia speranza è che le equazioni possano essere notevolmente semplificate per produrre un algoritmo ottimizzato per il caso di input a 128 bit. Queste equazioni semplificate possono quindi essere programmate in qualche bel linguaggio per una ricerca efficiente, o trattate di nuovo in modo astratto, assegnando singoli bit alla volta, facendo attenzione alle contraddizioni. Hai solo bisogno di vedere alcuni bit dell'output per sapere che non corrisponde all'ingresso!


Questo è davvero interessante, per favore condividi i tuoi progressi mentre percorri questa strada?
user230910

-1

Probabilmente, ma scoprirlo richiederebbe più tempo di quanto abbiamo o comporterebbe una compromissione dell'MD5.


6
Non è stato rotto. Tutto quello che sono stati in grado di fare è, in un ragionevole lasso di tempo, produrre 2 stringhe che equivalgono allo stesso hash. È ancora molto difficile produrre una stringa che corrisponda a un hash specifico.
Kibbee

9
non sono sicuro di come trovarne uno comprometterebbe md5, più di quanto comprometterebbe l'algoritmo se ti dicessi MD5 ("La rapida volpe marrone salta sopra il cane pigro") = 9e107d9d372bb6826bd81d3542a419d6
Kip

5
Un punto fisso probabilmente darebbe una certa influenza sulla matematica che potrebbe portare a una violazione più completa dell'MD5. Non sono convinto che Glomek possa davvero giustificare "probabilmente"; Accetterei "possibilmente" senza equivoci.
Jonathan Leffler

-9

Ci sono due interpretazioni e, se si può scegliere una delle due, la probabilità di trovare un punto fisso aumenta all'81,5%.

  • Interpretazione 1: l'MD5 di un'uscita MD5 in binario corrisponde al suo ingresso?
  • Interpretazione 2: l'MD5 di un'uscita MD5 in esadecimale corrisponde al suo ingresso?

13
Non c'è nulla nell'algoritmo MD5 che implichi esadecimale - opera su byte e produce byte - quindi penso che quest'ultima interpretazione non sia valida.
Nick Johnson,

Indipendentemente dal fatto che ci sia o meno un punto fisso sotto l'interpretazione 1, potrebbe ancora essercene (o non esserci) uno sotto l'interpretazione 2. Tuttavia, se sei interessato ad esplorare il problema, l'interpretazione 1 sembra un punto di partenza molto migliore perché hai vinto non è necessario prendere ogni sorta di decisioni arbitrarie sull'involucro e la codifica dei caratteri. Inoltre, il caso binario ha meno bit!
rndmcnlly

4
Stai interpretando male cosa sia veramente l'esagono. Puoi rappresentare binario in esadecimale, così come puoi rappresentarlo in decimale o ottale o in base 3. È un numero e ha rappresentazioni diverse. Quindi, l'interpretazione 1 e 2 sono la stessa cosa. Quello a cui stai pensando è la rappresentazione della stringa di caratteri, che non è affatto lo stesso esadecimale ma è un valore binario completamente diverso. In effetti potresti avere molte stringhe esadecimali diverse in set di caratteri diversi. Il valore hash a 128 bit può essere rappresentato come una stringa "esadecimale", ma non è uguale alla stringa. La stringa non è gli stessi dati binari.
definisce il

Dustin, l'interpretazione 2 significa davvero l'MD5 della stringa di visualizzazione.
Joshua,

4
C'è un grosso problema con quell'idea, però, in quanto dipende direttamente dalla codifica dei caratteri. Schemi di codifica diversi porteranno a set di risultati completamente diversi. C'è persino un intero progetto e un articolo che lo smaschera
definisce il

-23

A rigor di termini, poiché l'ingresso di MD5 è lungo 512 bit e l'uscita è 128 bit, direi che è impossibile per definizione.


4
No, esiste l'MD5 di stringhe da 1 byte.
Joshua

7
L'input può essere di qualsiasi dimensione. Se l'input è inferiore a 512 byte, viene riempito, ma sono comunque accettabili input piccoli. Da Wikipedia: "MD5 elabora un messaggio di lunghezza variabile in un output di lunghezza fissa di 128 bit. Il messaggio di input viene suddiviso in blocchi di blocchi da 512 bit (sedici interi little endian a 32 bit); il messaggio viene riempito in modo che la sua lunghezza è divisibile per 512. "
Naaff

Quindi stai assumendo che, diciamo, 0000000001 = 1? Direi quindi che la domanda è scarsamente specificata, nella migliore delle ipotesi.
Ori Pessach

11
L' ingresso a MD5 può essere di 128 bit. Se MD5 vuole riempire quell'input allora, beh, francamente, questo è affare di MD5. L'input è ancora ben definito. Allo stesso modo, l'output è un 128 bit ben definito. Se l'input (ben definito) e l'output (ben definito) sono entrambi uguali, allora MD5 (x) = x.
Naaff

2
@Joshua esiste anche l'MD5 di una stringa vuota (cioè 0 byte)
Kip
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.