XOR-Cascade of hash debole sicuro?

1

Ho seguito la domanda teorica:

Lascia che H(X) sia una funzione di hash considerata debole perché è possibile produrre collisioni (ad esempio SHA1, MD5).

Mi chiedo se le seguenti funzioni:

H2(X) = H(H(X)) xor H(X)
H3(X) = H(H(H(X))) xor H(H(X)) xor H(X)
H4(X) = ...

può essere considerato sicuro, se H(X) è considerato non sicuro. Se l'autore dell'attacco può trovare una collisione in H(X) , dovrà inoltre trovare una collission anche in H(H(X)) , per poter avere una collisione in H2(X) = H(H(X)) xor H(X) . O non è ancora sicuro? (Perché?)

Sono consapevole che tale cascata non è performante rispetto a una funzione hash più recente come SHA256 o SHA3.

    
posta Daniel Marschall 25.10.2014 - 01:35
fonte

2 risposte

1

No. Una collisione per H è una coppia di input m e m ' tale che m m' ma H ( m ) = H ( m '). Ne consegue che H ( H ( m )) = H ( H ( m ')), e anche H ( H ( m )) xor H ( m ) = H ( H ( m ')) xor H ( m '), e così via.

Quindi, qualsiasi collisione per H è anche una collisione per tutte le tue funzioni H 2 , H < sub> 3 , H 4 ... Queste funzioni non sono in alcun modo più sicure di H quando si considera la resistenza alle collisioni . Possono anche essere meno sicuri, anche, dal momento che la tua premessa è sbagliata:

If the attacker could find a collission in H(X), he would need to additionally find a collission in H(H(X)) too, to be able to have a collission in H2(X) = H(H(X)) xor H(X).

Questo non è vero. Se un utente malintenzionato trova una collisione per H che collide anche per H ( H ), quindi ottiene una collisione per H 2 . Ma non funziona nel modo inverso: non c'è un requisito assoluto per una collisione su H 2 essere tale che sia una collisione su entrambi H e H ( H ).

Quindi, tutte le collisioni per H sono collisioni per H 2 (e H 3 , H 4 ...) ma H 2 può avere collisioni proprie che non lo sono collisioni per H . Trovare collisioni su H 2 può quindi essere più semplice che trovare collisioni su H .

    
risposta data 24.11.2014 - 01:45
fonte
0

No, generalmente no. L'iterazione degli hash aumenta il rischio di collisione, dal momento che iterando da H (000 ... 128 ... 000) a H (111 ... 128 ... 111) - assumendo che H abbia un output a 128 bit, non è garantito per l'output 000 ... 128 ... 000 a 111 ... 128 ... 111. Invece, usando questa cosa, si riduce effettivamente la resistenza di collisione.

L'iterazione delle funzioni di hash deve essere eseguita come un fattore chiave di rafforzamento, ad esempio se si desidera generare una chiave di crittografia avanzata con una password non sicura. Un fattore chiave di rafforzamento rallenta l'aggressore abbastanza da rendere la bruteforcing della password sfavorevole rispetto alla bruteforcing della chiave stessa. Quindi qualsiasi collisione non ha importanza in quanto richiederà più tempo all'aggressore di trovare una collisione in una funzione di potenziamento della chiave piuttosto che attaccare direttamente la chiave di crittografia.

Si noti che l'utente malintenzionato ha la funzione hash, quindi l'utente malintenzionato può eseguire facilmente test contro la funzione hash per trovare eventuali collisioni e quindi eseguire il risultato del test sui dati reali.

Invece, modifica la funzione di hash nel tuo sistema con una nuova funzione di hash, come SHA512.

    
risposta data 25.10.2014 - 02:12
fonte

Leggi altre domande sui tag