Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
8 août 2009 à 17:33
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 2016
-
11 août 2009 à 19:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 11 août 2009 à 19:38
Bien sûr mais c'est toujours mieux optimisé :)
L'exemple de l'avion, c'est le principe même du checksum.
Pour la détection des virus, rien ne vaut un bon anti-virus. Cependant, si l'on a par exemple 1 fichier ultra-important sur notre machine, on peut garder son checksum quelque part (post-it près de l'ordinateur), puis vérifier de temps à autres. Si le checksum est différent, le fichier est infecté.
Mais ça reste très artisanal, et les anti-virus ont des technologies bien plus avancées et efficaces.
@Manchester : tu as l'air de t'intéresser au domaine de la sécurité, si j'en crois tes sources :)
Cordialement, Bacterius !
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021 11 août 2009 à 19:28
Bonjour,
Bacterius, biensur la formule que j'ai decrit plu haut je ne l'ai pas ecrit en delphi ni meme otimisée... J'en donnais simplement le "wayof" que j'utilise notament pour de la verification de données envoyée par radio ou les pertubations du signal sonts inévitables.
En assembleur ce code ne prend que quelques lignes et est
tres rapide. Dans certains cas, c'est tres utile.
Imagine que tu dois mesurer quelque chose qui est transmis par un avion, l'avion envoie par exemple 15x les memes paquets de données. Pour savoir si elles sonts intactes a l'arrivée on fais le checksum du 1er paquet recu, comme le paquet contiend un checksum, on le compare a celui qu'on a calculé. Si c'est les memes, on valide le paquet, sinon on passe au suivant,si tous les 15 paquets ne sont pas bons, on demande a l'emeteur un "resend" du paquet (si il est joignable...).
Voila un exemple ou le cheksum est indispensable.
pour ce qui est d'utiliser un checksum pour verifier la presence de virus ou la modification de données dans des fichiers de grosses taille ou tailles variables, le checksum n'est pas une solution, par contre pour des paquets dedonnées de taille conue et invariable, c'est rapide et efficace.
Bon Coding...
ManChesTer.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 août 2009 à 19:03
Si tu veux quelque chose de moins limité, penses aux fonctions de hashage cryptographiques (MD5, SHA, Whirlpool, ...). Là, les "constantes de bourrage" sont impraticables ... sauf en MD5, ce dernier commence à se faire vieux ... Mais avec le SHA ou le Whirlpool tu es peinard pour quelques années :p
Cordialement, Bacterius !
kelloucheaeh
Messages postés14Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention15 février 2010 10 août 2009 à 19:00
Trop limité à ce que je vois, merci encore pour ces minutes si précieuses.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 août 2009 à 18:57
Eventuellement. Si tu veux l'utiliser comme détecteur de virus, il te faut plusieurs informations.
- La modification du fichier à tester signifie NECESSAIREMENT une infection de virus;
- Tu connais le checksum du fichier AVANT infection;
Dans ce cas, il te suffit de refaire le checksum du fichier quand tu veux vérifier son état. Si le checksum AVANT infection et celui que tu viens de faire sont identiques, alors ton fichier est OK. Sinon, il est infecté ...
Evidemment, il existe des virus qui ajoutent des "constantes de bourrage" dans leur code, afin de faire en sorte que le checksum du fichier infecté soit identique à celui du fichier normal (dans ce cas, tu ajoutes un octet à la fin du fichier avant infection, par exemple !).
Cordialement, Bacterius !
kelloucheaeh
Messages postés14Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention15 février 2010 10 août 2009 à 18:51
et loin de l'histoire de l'internet, peut-on imaginer leur utilité comme détecteur de virus ou danger potentiel ?
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 août 2009 à 18:45
@Kelloucheaeh : Ben par exemple, lors d'une transmission par internet, il peut y avoir des erreurs de paquets (mal interprêtés, mal envoyés, etc ...). Ca ne t'est jamais arrivé de foirer un téléchargement ? Dans ce cas là les données sont différentes à l'envoi et à la réception.
Cordialement, Bacterius !
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 août 2009 à 18:44
Enfin les fonctions de hashage conviennent également très bien, peut-être même mieux (même mon algorithme de hashage LEA est amplement suffisant pour un checksum, si l'on prend que les 32 premiers bits).
Cordialement, Bacterius !
kelloucheaeh
Messages postés14Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention15 février 2010 10 août 2009 à 18:43
aux éclaircissements données, je me vois poser la question suivante : quels sont les cas où les données ne parviennent pas, en totalité, à leurs destination finale.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 août 2009 à 18:42
Le "mod" à la fin n'est pas nécessaire, Delphi s'en charge tout seul :)
Ton checksum peut être optimisé :
shl 1 = * 2
Donc on se retrouve avec :
for J := $0 to TailleFichier step $8
Checksum := (3 * Checksum) + MonFichier[J];
Et c'est pas très efficace. J'aurai plus opté pour une formule comme ceci :
for J := $0 to TailleFichier step $4
Checksum := (MonFichier[J] + Checksum) or (MonFichier[J] xor Checksum);
Cordialement, Bacterius !
cs_ManChesTer
Messages postés374Date d'inscriptionvendredi 20 octobre 2000StatutModérateurDernière intervention15 janvier 2021 10 août 2009 à 18:37
Bonjour,
Comme le decrit ci bien ci dessus bacterius leschecksum sonts surtout utiles pour le controle d'intégrité des données.
il n existe de different types et ils utilisent tous une algo +- évolué.
personellement j'utilise tres souvent ceci :
for j:=0 to taillefichier step 8
moncheksum:=(monchecksum+(monchecksum shl 1)+monfichier[j]) mod maxint64;
voila c'est simple et efficace sur les données de petites tailles ou tailles moyennes.
Si vous voulez faire vos propres protocoles de transfer de données via ip par exemple cette formule donne de tres bons resultats pour contrôler que vos paquets sonts intacts.
Bon Coding...
ManChesTer.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 10 août 2009 à 13:48
Le domaine d'application est très vaste pour les checksums. Un exemple :
- A souhaite transmettre à B un fichier musique.
- A envoie donc le fichier musique à B, accompagné de son checksum.
- B reçoit le fichier musique ainsi que le checksum.
- B calcule le checksum du fichier musique qu'il a reçu.
- B compare le checksum obtenu avec le checksum reçu de la part de A.
- Si les deux checksums sont identiques, le fichier est probablement entier (il ne manque pas de bout, aucune donnée n'a été modifiée ...). Sinon, le fichier est très probablement altéré (même d'un bit !).
Ensuite, si le checksum est suffisamment complexe, comme un CRC, on peut se pencher vers une comparaison de fichiers en masse (recherche de doublons dans un dossier, par exemple. Ce qui n'est pas possible avec le checksum proposé par f0xi car on risquerait, au vu du nombre considérable de collisions, d'effacer pas mal de fichiers innocents).
Et il y en a d'autres ...
Cordialement, Bacterius !
kelloucheaeh
Messages postés14Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention15 février 2010 10 août 2009 à 12:03
Bonjour!
j'ai pas encore vu la chose mais j'ai toujours comme l'impression que la partie description fait défaut et ce qui est avancé n'est pas très claire. Aussi, faut-il ajouter que la grande partie des codes n'est pas bien commenté et on n'y trouve pas le domaine d'application facilement.
cordialement.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 9 août 2009 à 22:46
En gros, si j'utilise le checksum 8 bits, et que j'ai un message de deux octets, on a :
($05;$05) ($02;$08) ($0A;$00) = ($03;$07) = ... ?
Alors oui effectivement il ne peut être utilisé que dans le cadre d'une vérification d'intégrité de fichier, et pas autrement (trop de collisions).
Cordialement, Bacterius !
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 9 août 2009 à 22:42
c'est tout simplement ça,
pour une somme 8bits, on lit octet par octet qu'on additionne les uns aux autres.
pour une somme 16bits, on lit deux octet par deux octet
pour une somme 32bits, on lit 4 par 4,
pour une somme 64bits, 8 par 8, 128, 16 par 16, 256, 32 par 32, 512, 64 par 64 etc.
graçe a Delphi, pas besoin de faire le modulo puisqu'il reviens a zero tout seul :
byte(255 + 1) (255+1) mod 256 0byte(255 + 2) (255+2) mod 256 1word(65535 + 4) (65535 + 4) mod 256 3
etc ...
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 9 août 2009 à 13:28
Donc si j'ai bien compris, tu fais simplement une addition des octets/mots/doubles mots/int64 du message modulo la taille du checksum ?
Cordialement, Bacterius !
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 9 août 2009 à 13:10
n'importe qu'elle somme est "fiable" pour verifier si un fichier a été modifié ou corrompu.
ensuite, vus la "complexité" du bouzin, les collisions (somme identique pour fichier different) sont plus frequentes qu'avec md5 ou SHA.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 8 août 2009 à 17:33
Intéressant ... mais peut-on utiliser ces checksums pour comparer de nombreuses données, où sont-ils seulement efficaces pour vérifier si tel fichier a été corrompu lors d'un traitement sur le disque ? Je veux dire sont-ils assez sûrs comme le CRC-32 ?
11 août 2009 à 19:38
L'exemple de l'avion, c'est le principe même du checksum.
Pour la détection des virus, rien ne vaut un bon anti-virus. Cependant, si l'on a par exemple 1 fichier ultra-important sur notre machine, on peut garder son checksum quelque part (post-it près de l'ordinateur), puis vérifier de temps à autres. Si le checksum est différent, le fichier est infecté.
Mais ça reste très artisanal, et les anti-virus ont des technologies bien plus avancées et efficaces.
@Manchester : tu as l'air de t'intéresser au domaine de la sécurité, si j'en crois tes sources :)
Cordialement, Bacterius !
11 août 2009 à 19:28
Bacterius, biensur la formule que j'ai decrit plu haut je ne l'ai pas ecrit en delphi ni meme otimisée... J'en donnais simplement le "wayof" que j'utilise notament pour de la verification de données envoyée par radio ou les pertubations du signal sonts inévitables.
En assembleur ce code ne prend que quelques lignes et est
tres rapide. Dans certains cas, c'est tres utile.
Imagine que tu dois mesurer quelque chose qui est transmis par un avion, l'avion envoie par exemple 15x les memes paquets de données. Pour savoir si elles sonts intactes a l'arrivée on fais le checksum du 1er paquet recu, comme le paquet contiend un checksum, on le compare a celui qu'on a calculé. Si c'est les memes, on valide le paquet, sinon on passe au suivant,si tous les 15 paquets ne sont pas bons, on demande a l'emeteur un "resend" du paquet (si il est joignable...).
Voila un exemple ou le cheksum est indispensable.
pour ce qui est d'utiliser un checksum pour verifier la presence de virus ou la modification de données dans des fichiers de grosses taille ou tailles variables, le checksum n'est pas une solution, par contre pour des paquets dedonnées de taille conue et invariable, c'est rapide et efficace.
Bon Coding...
ManChesTer.
10 août 2009 à 19:03
Cordialement, Bacterius !
10 août 2009 à 19:00
10 août 2009 à 18:57
- La modification du fichier à tester signifie NECESSAIREMENT une infection de virus;
- Tu connais le checksum du fichier AVANT infection;
Dans ce cas, il te suffit de refaire le checksum du fichier quand tu veux vérifier son état. Si le checksum AVANT infection et celui que tu viens de faire sont identiques, alors ton fichier est OK. Sinon, il est infecté ...
Evidemment, il existe des virus qui ajoutent des "constantes de bourrage" dans leur code, afin de faire en sorte que le checksum du fichier infecté soit identique à celui du fichier normal (dans ce cas, tu ajoutes un octet à la fin du fichier avant infection, par exemple !).
Cordialement, Bacterius !
10 août 2009 à 18:51
10 août 2009 à 18:45
Cordialement, Bacterius !
10 août 2009 à 18:44
Cordialement, Bacterius !
10 août 2009 à 18:43
10 août 2009 à 18:42
Ton checksum peut être optimisé :
shl 1 = * 2
Donc on se retrouve avec :
for J := $0 to TailleFichier step $8
Checksum := (3 * Checksum) + MonFichier[J];
Et c'est pas très efficace. J'aurai plus opté pour une formule comme ceci :
for J := $0 to TailleFichier step $4
Checksum := (MonFichier[J] + Checksum) or (MonFichier[J] xor Checksum);
Cordialement, Bacterius !
10 août 2009 à 18:37
Comme le decrit ci bien ci dessus bacterius leschecksum sonts surtout utiles pour le controle d'intégrité des données.
il n existe de different types et ils utilisent tous une algo +- évolué.
personellement j'utilise tres souvent ceci :
for j:=0 to taillefichier step 8
moncheksum:=(monchecksum+(monchecksum shl 1)+monfichier[j]) mod maxint64;
voila c'est simple et efficace sur les données de petites tailles ou tailles moyennes.
Si vous voulez faire vos propres protocoles de transfer de données via ip par exemple cette formule donne de tres bons resultats pour contrôler que vos paquets sonts intacts.
Bon Coding...
ManChesTer.
10 août 2009 à 13:48
- A souhaite transmettre à B un fichier musique.
- A envoie donc le fichier musique à B, accompagné de son checksum.
- B reçoit le fichier musique ainsi que le checksum.
- B calcule le checksum du fichier musique qu'il a reçu.
- B compare le checksum obtenu avec le checksum reçu de la part de A.
- Si les deux checksums sont identiques, le fichier est probablement entier (il ne manque pas de bout, aucune donnée n'a été modifiée ...). Sinon, le fichier est très probablement altéré (même d'un bit !).
Ensuite, si le checksum est suffisamment complexe, comme un CRC, on peut se pencher vers une comparaison de fichiers en masse (recherche de doublons dans un dossier, par exemple. Ce qui n'est pas possible avec le checksum proposé par f0xi car on risquerait, au vu du nombre considérable de collisions, d'effacer pas mal de fichiers innocents).
Et il y en a d'autres ...
Cordialement, Bacterius !
10 août 2009 à 12:03
j'ai pas encore vu la chose mais j'ai toujours comme l'impression que la partie description fait défaut et ce qui est avancé n'est pas très claire. Aussi, faut-il ajouter que la grande partie des codes n'est pas bien commenté et on n'y trouve pas le domaine d'application facilement.
cordialement.
9 août 2009 à 22:46
($05;$05) ($02;$08) ($0A;$00) = ($03;$07) = ... ?
Alors oui effectivement il ne peut être utilisé que dans le cadre d'une vérification d'intégrité de fichier, et pas autrement (trop de collisions).
Cordialement, Bacterius !
9 août 2009 à 22:42
pour une somme 8bits, on lit octet par octet qu'on additionne les uns aux autres.
pour une somme 16bits, on lit deux octet par deux octet
pour une somme 32bits, on lit 4 par 4,
pour une somme 64bits, 8 par 8, 128, 16 par 16, 256, 32 par 32, 512, 64 par 64 etc.
graçe a Delphi, pas besoin de faire le modulo puisqu'il reviens a zero tout seul :
byte(255 + 1) (255+1) mod 256 0byte(255 + 2) (255+2) mod 256 1word(65535 + 4) (65535 + 4) mod 256 3
etc ...
9 août 2009 à 13:28
Cordialement, Bacterius !
9 août 2009 à 13:10
ensuite, vus la "complexité" du bouzin, les collisions (somme identique pour fichier different) sont plus frequentes qu'avec md5 ou SHA.
8 août 2009 à 17:33
Cordialement, Bacterius !