Per la parte della collisione dell'hash SHA-1 della tua domanda, questo è stato risolto da alcune delle risposte.
Tuttavia, gran parte di questo dipende dal tipo di file con cui stiamo lavorando:
Mantiene il contenuto e le operazioni generali del file (ma ovviamente include ora contenuti dannosi che inizialmente non erano contenuti modificati)
Che cosa significa varia notevolmente su ciò che sta rilevando le alterazioni:
- Se è un eseguibile firmato, non una (ragionevole) possibilità: dovresti ottenere in qualche modo due collisioni di hash: lo SHA-1 del file e la firma interna .exe.
- Se si tratta di un eseguibile senza segno, .com, .dll senza segno o simile, è possibile aggiungere le loro forcelle di risorse in modi che non cambieranno il loro funzionamento e quindi potresti (eventualmente) ottenere una collisione di hash che non è rilevabile da 'normale' operazione.
- Se si tratta di un file di codice sorgente o di una struttura simile (.cs, .c, .h, .cpp, .rb, .yml, .config, .xml, .pl, .bat, .ini) le aggiunte, le modifiche o le rimozioni può essere vincolato a una sintassi dei commenti valida in modo tale che la modifica non sia riconoscibile dalla maggior parte degli usi (compilazione o esecuzione, non apertura con un editor di testo).
- Se si tratta di un formato .iso o .zip o altro formato contenitore, è anche più improbabile poiché la maggior parte delle modifiche casuali danneggia il contenitore. È possibile fare: aggiungere una voce di file fasullo o modificare un contenuto all'interno del contenitore e ricontrollarlo, ma si sta aggiungendo un livello di complessità e si aggiunge tempo aggiuntivo per controllare il risultato, oltre ad avere gradi di libertà limitati rispetto a come e quali contenuti possono essere modificati.
- Se si tratta di un formato di testo o simile a un testo, possono essere modificati quasi come desideri, pur essendo comunque un file "valido", anche se il contenuto sarà probabilmente evidente.
- Con molti formati come .rtf, .doc, .html, .xslx e altri formati markup-esque, possono essere aggiunti o modificati in modi che non saranno rilevabili dai parser, quindi diversi dalla lunghezza (o anche con una lunghezza limitata , meno libertà) i file possono essere modificati per (eventualmente) ottenere una collisione dell'hash pur rimanendo non solo un file valido, ma non notevolmente modificati in alcun modo che sarebbero visibili alle applicazioni tipiche con cui verrebbero utilizzati.
Quindi, ciò che ti rimane è come ottenere collisioni in qualsiasi struttura non corrompente e un certo grado di non rilevabile forse:
- Apporta le modifiche funzionali che desideri (magari inserendo contenuti dannosi) e apporta eventuali modifiche aggiuntive per conservare la validità specifica del formato file
- Aggiungi una sezione che non funzionerà (tra i blocchi di commenti, alla fine di un file di testo con 3k ritorni a capo sopra di esso, isola un blocco di commenti corrente)
- Aggiungi o seleziona un carattere / codice punto / byte per la modifica e prova ogni possibile combinazione valida (non tutte le combinazioni di byte sono valide per codifiche diverse, ad esempio).
- Ricalcola l'hash, vedi se la collisione corrisponde.
- in caso contrario, vai a 3.
Supponiamo che tu abbia un computer superveloce e un file di dimensioni ridotte, in modo tale che la modifica con una sequenza di byte valida e il ricalcolo dell'hash richieda 1 millisecondo (probabilmente richiede un hardware dedicato). Se la distribuzione dell'hash è perfettamente casuale e distribuita su tutto l'intervallo, si otterrà una collisione con SHA-1 ogni 2^160
tentativo (costringendolo bruto).
2^160/1000/60/60/24/365.24
= 4.63x10^37 years
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years
= 46 undecillion years.
Ma hey, proviamo le versioni 2^60
e 2^52
, e facciamo finta che ci permettano di modificare il file come ci piace (loro no) e che anche loro possono essere fatti in 1ms ogni tentativo:
2^52 yields 142,714 years
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years
/*machines will probably have taken over anyway*/
Ma ehi, potresti essere fortunato. Davvero, davvero, più di un miracolo di qualsiasi cosa la gente chiami miracoli fortunati.