Se ho due stringhe casuali (s1, s2) diverse ( s1 != s2
), vuoi sapere la probabilità che md5(s1) == md5(s2) AND sha1(s1) == sha1(s2)
.
Bene, prima per due specifiche stringhe scelte a caso qual è la probabilità che md5(s1) == md5(s2)
? Rispondi a 1/2 ^ 128 dato che il primo hash è una stringa di 128 bit, e le probabilità che il secondo hash sia uguale al secondo è 1 in 2 ^ 128 o circa 2.9 x 10 ^ -37%.
Allo stesso modo, P(sha1(s1) == sha1(s2)) = 2^-160 ~ 6.8 x 10^-47 %
.
Ora la probabilità che entrambe le condizioni siano vere presupponendo che siano condizioni indipendenti (cioè che le funzioni di hashing siano fondamentalmente indipendenti l'una dall'altra), si ottiene moltiplicando le probabilità da P(X AND Y) = P(X) P(Y)
so P(md5(s1)==md5(s2) AND sha1(s1) == sha1(s2)) = 2^-288 ~ 2 x 10^-85 %
.
È scontato che le funzioni di hashing siano indipendenti l'una dall'altra sulla stringa, il che è una buona ipotesi per md5 e sha1 come funzioni di hashing. Ma se invece di confrontare MD5 e SHA-1, abbiamo confrontato MD5 e una nuova funzione di hashing che è solo MD5 applicata a se stessa 100 volte, troveremmo che ogni volta che md5 (s1) == md5 (s2), avremmo anche md5 ^ 100 (s1) == md5 ^ 100 (s2), quindi la probabilità di collisione è uguale alla probabilità di avere una collisione.
Allo stesso modo, se avessimo una stupida funzione "hash" che era semplicemente silly_hash (s) = md5 (s) ++ s (dove ++ significa concatenato), allora potresti mostrare che se s1! = s2 e md5 ( s1) == md5 (s2) quindi silly_hash (s1)! = silly_hash (s2) - significa che non potresti mai avere una doppia collisione con md5 e silly_hash.