Accueil🇫🇷Chercher

Somme de contrĂ´le BSD

L'algorithme de somme de contrôle BSD (en anglais BSD checksum) est un algorithme de somme de contrôle très utilisé. Il a été implémenté dans les distributions BSD et est également disponible dans l'utilitaire en ligne de commande GNU sum.

Code de l'algorithme

Ci-dessous la partie correspondant à la somme de contrôle BSD du code source C de GNU sum (sous licence GPL). Ce code calcule une somme de contrôle de 16 bits en sommant tous les octets du flux d'entrée. Pour éviter les failles posées par un simple ajout d'octets, les bits de la somme de contrôle sont permutés de façon circulaire vers la droite de 1 bit à chaque itération.

int bsdChecksumFromFile(FILE *fp) /* fp: gestionnaire du fichier d'entree */
{
    int ch;                       /* Le dernier caractère lu. */
    int checksum = 0;             /* La somme de contrĂ´le modulo 2^16. */
    while ((ch = getc(fp)) != EOF) {
        checksum = (checksum >> 1) + ((checksum & 1) << 15);
        checksum += ch;
        checksum &= 0xffff;       /* ET binaire Ă©quivalent Ă  un modulo 2^16 */
    }
    return checksum;
}

Le code ci-dessous est un fragment de code java qui calcule une somme de contrôle de 8 bits de long. Il ajoute chaque bit du tableau d'entrée après avoir effectué une permutation circulaire de la somme de contrôle.

byte checksum(byte[] input) {
    byte checksum = 0;
    for (byte cur_byte: input) {
        checksum = (byte) (((checksum & 0xFF) >> 1) | (checksum << 7)); // Permuation circulaire
        checksum = (byte) (checksum + cur_byte);                        // Ajouter le segment suivant
    }
    return checksum;
}

Explication de l'algorithme

comme mentionné ci-dessus, cet algorithme calcule une somme de contrôle en segmentant les données et en ajoutant à chaque segment un accumulateur dont les bits sont permutés de façon circulaire entre chaque sommation. Pour veiller à ce que la somme de contrôle soit sur 4 bits, on applique une oppération modulo 2^4 qui est équivalente à un ET bit à bit avec le masque 1111.

Exemple : Somme de contrĂ´le 4-bit avec des segments de 4-bit de long (big-endian)

Entrée: 101110001110

Premier tour :

 Somme de contrĂ´le: 0000        seg : 1011

a) Permutation circulaire de la somme de contrĂ´le :

 0000 �0000

b) Ajout du segment et modulo :

 0000 + 1011 = 1011 �1011 & 1111 = 1011

Deuxième tour :

 Somme de contrĂ´le : 1011        seg : 1000

a) Permutation circulaire de la somme de contrĂ´le:

 1011 �1101

b) Ajout du segment et modulo :

 1101 + 1000 = 10101 �10101 & 1111 = 0101

Troisième tour :

 Somme de contrĂ´le : 0101        seg : 1110

a) Permutation circulaire de la somme de contrĂ´le:

 0101 �1010

b) Ajout du segment et modulo :

 1010 + 1110 = 11000 �11000 & 1111 = 1000

Somme de contrĂ´le finale : 1000

Notes et références

(en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « BSD_checksum » (voir la liste des auteurs).

Annexes

Articles connexes

Liens externes

Cet article est issu de wikipedia. Texte licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.