En ce qui concerne la partie collision de hachage SHA-1 de votre question, quelques-unes des réponses ont été apportées à cette question.
Cependant, une grande partie de cela dépend du type de fichier avec lequel nous travaillons:
Maintient le contenu global et le fonctionnement du fichier (mais inclut bien sûr maintenant du contenu malveillant dont le contenu n'était pas modifié à l' origine )
Ce que cela signifie varie énormément sur ce qui détecte les altérations:
- S'il s'agit d'un exécutable signé, ce n'est pas une chance (raisonnable): vous devez obtenir deux collisions de hachage: le SHA-1 du fichier et la signature .exe interne.
- S'il s'agit d'un exécutable non signé, .com, .dll non signé ou similaire, leurs fourches de ressources peuvent être ajoutées de manière à ne pas modifier leur fonctionnement. Vous pouvez ainsi (éventuellement) obtenir une collision de hachage non détectable par la 'normale' opération.
- S'il s'agit d'un fichier de code source ou d'une structure similaire (.cs, .c, .h, .cpp, .rb, .yml, .config, .xml, .pl, .bat, .ini, les ajouts, modifications ou suppressions peut être contraint à une syntaxe de commentaire valide telle que le changement ne soit pas perceptible par la plupart des utilisateurs (en le compilant ou en l'exécutant, sans l'ouvrir avec un éditeur de texte).
- S'il s'agit d'un format de conteneur .iso, .zip ou autre, il est également plus improbable que la plupart des modifications aléatoires corrompent le conteneur. Il est possible de le faire: ajouter une entrée de fichier fictive ou modifier un contenu dans le conteneur et le revérifier, mais vous ajoutez une couche de complexité et un temps supplémentaire pour vérifier le résultat, en plus d'avoir des degrés de liberté limités. comment et quels contenus peuvent être changés.
- S'il s'agit d'un texte ou d'un format semblable à un texte, ils peuvent être modifiés presque comme vous le souhaitez tout en restant un fichier 'valide', bien que le contenu soit probablement visible.
- Avec de nombreux formats tels que .rtf, .doc, .html, .xslx et d’autres formats, il est possible de les ajouter ou de les modifier de manière indétectable par les analyseurs, donc différents de la longueur (ou même avec une longueur limitée). , moins de liberté), les fichiers peuvent être modifiés pour (éventuellement) obtenir une collision de hachage tout en restant non seulement un fichier valide, mais pas sensiblement modifié de manière visible pour les applications types avec lesquelles ils seraient utilisés.
Alors, il ne vous reste plus qu'à trouver des solutions pour éviter les collisions, quelle que soit leur structure et leur degré indétectable:
- Effectuez les modifications fonctionnelles souhaitées (par exemple, insertion de contenu malveillant) et apportez les modifications supplémentaires pour conserver la validité spécifique du format de fichier
- Ajoutez une section qui ne fonctionnera pas (entre les blocs de commentaires, à la toute fin d'un fichier texte avec 3k retour chariot au-dessus, isolez un bloc de commentaires actuel)
- Ajoutez ou sélectionnez un caractère / point de code / octet à modifier et essayez toutes les combinaisons valides possibles (chaque combinaison d'octets n'est pas valide pour différents codages, par exemple).
- Recalculer le hachage, voir si les correspondances de collision.
- si ce n'est pas le cas, passez à 3.
Supposons que vous ayez un ordinateur super rapide et un fichier compact, de sorte qu'une modification avec une séquence d'octets valide et un nouveau calcul du hachage prennent 1 milliseconde (nécessitant probablement du matériel dédié). Si la distribution de hachage est parfaitement aléatoire et répartie sur toute la plage, vous obtiendrez une collision avec SHA-1 à chaque 2^160
tentative (forcée brutalement).
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.
Mais bon, essayons les versions 2^60
et 2^52
, et supposons qu'elles nous permettent de modifier le fichier comme bon nous semble (ce qu'elles ne font pas) et qu'elles peuvent également être effectuées en 1ms à chaque essai:
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*/
Mais bon, vous pourriez avoir de la chance. Vraiment, vraiment, plus d'un-miracle-que-tout-les-gens-appels-miracles chanceux.