AccueilAlgorithmes et IASomme de contrôle CRC

💻 Somme de contrôle CRC

Simulateur interactif de CRC (contrôle de redondance cyclique). Visualisez la division polynomiale sur GF(2) étape par étape, le circuit à registre à décalage, les préréglages CRC-8/CRC-16/CRC-32. Injectez des erreurs simples et en rafale et observez leur détection.

Algorithmes et IA3DModéré60 FPS
crc-checksum ↗ Ouvrir en autonome

À propos de la somme de contrôle CRC

Un contrôle de redondance cyclique (CRC) est un code de détection d'erreur calculé en traitant un bloc de données comme un polynôme sur GF(2) — le corps binaire où toute l'arithmétique se fait modulo 2 (XOR) — et en le divisant par un polynôme générateur fixe. Le reste de cette division est ajouté aux données ; le récepteur recalcule la division et signale toute incohérence comme une erreur de transmission. Le CRC-32, défini par le polynôme générateur 0x04C11DB7, est utilisé dans les trames Ethernet, les archives ZIP, les images PNG et la suite TCP/IP, offrant une détection garantie de toutes les erreurs à un bit, toutes les erreurs à deux bits, tous les nombres impairs d'erreurs de bits, et toutes les erreurs en rafale de moins de 32 bits.

Le simulateur visualise la division longue par XOR étape par étape, montrant chaque reste intermédiaire et le circuit à registre à décalage qui effectue le même calcul en matériel. Vous pouvez basculer entre les préréglages CRC-8, CRC-16 et CRC-32, modifier le message d'entrée, et injecter des erreurs simples ou multi-bits pour vérifier la détection.

Questions fréquentes

Pourquoi utilise-t-on l'arithmétique sur GF(2) (XOR) pour le CRC ?

L'arithmétique sur GF(2) ne comporte pas de retenues, ce qui rend le calcul du CRC extrêmement efficace en matériel comme en logiciel : l'addition devient un XOR, la multiplication devient un ET, et la division polynomiale peut être implémentée sous forme de registre à décalage à rétroaction linéaire (LFSR) cadencé une fois par bit. La structure algébrique des polynômes sur GF(2) rend également possibles des preuves formelles de détection d'erreur grâce à la théorie du codage.

Quels types d'erreurs le CRC-32 garantit-il de détecter ?

Le CRC-32 détecte : toutes les erreurs à un seul bit ; toutes les erreurs à deux bits (pour des messages de moins de 2³² − 1 bits) ; tous les nombres impairs d'erreurs de bits (car 0x04C11DB7 est divisible par (x+1)) ; toutes les erreurs en rafale de longueur ≤ 32 bits ; et une grande fraction (1 − 2⁻³²) des erreurs en rafale plus longues. Il ne garantit PAS la détection de toutes les erreurs aléatoires multi-bits — pour cela, des codes plus robustes comme Reed-Solomon sont utilisés.

Comment un registre à décalage à rétroaction linéaire (LFSR) calcule-t-il le CRC en matériel ?

Un LFSR est une chaîne de bascules dont les points de rétroaction correspondent aux bits à 1 du polynôme générateur. Chaque cycle d'horloge fait entrer un bit d'entrée et le combine par XOR avec la rétroaction des points de dérivation. Une fois tous les bits de données passés, le contenu du registre est le reste du CRC. Ce traitement se fait à raison d'un bit par cycle à pleine vitesse de ligne — des milliards de bits par seconde dans les ASIC Ethernet modernes.

Pourquoi différentes implémentations de CRC-32 produisent-elles des résultats différents ?

Il existe plusieurs variantes de CRC-32 : la variante Ethernet/ZIP/PNG (polynôme 0x04C11DB7, valeur initiale 0xFFFFFFFF, entrée/sortie réfléchies, XOR final 0xFFFFFFFF) et la variante Castagnoli CRC-32C (polynôme 0x1EDC6F41) utilisée dans iSCSI, SCTP et ext4. Mélanger les variantes provoque des incohérences de somme de contrôle. Le modèle Rocksoft définit 7 paramètres qui spécifient entièrement un algorithme CRC.

Le CRC convient-il à la vérification d'intégrité cryptographique ?

Non. Le CRC est un simple code de détection d'erreur, pas un hachage cryptographique. Un adversaire capable de modifier un message peut trivialement recalculer le CRC et forger une somme de contrôle valide. Pour la détection d'altération dans des contextes de sécurité, utilisez un code d'authentification de message (MAC) tel que HMAC-SHA256 ou un hachage cryptographique comme SHA-3. Le CRC ne convient qu'à la détection de corruption accidentelle dans des canaux de confiance.

Comment le calcul logiciel du CRC utilise-t-il des tables de correspondance ?

Traiter un bit à la fois est lent en logiciel. À la place, une table de correspondance à 256 entrées est précalculée : table[b] = CRC d'un octet unique b suivi d'un remplissage de zéros. Traiter chaque octet d'entrée ne nécessite alors qu'une seule recherche dans la table, un XOR et un décalage — ce qui permet au CRC-32 basé sur table de calculer à plusieurs Go/s sur les CPU modernes. Les processeurs x86 dotés du jeu d'instructions SSE4.2 disposent d'une instruction CRC32 dédiée pour le CRC-32C.

Quelle est la différence entre CRC-8, CRC-16 et CRC-32 ?

Le nombre indique le degré du polynôme générateur et la largeur de la somme de contrôle en bits. Le CRC-8 (reste de 8 bits) est utilisé dans des protocoles embarqués comme SMBus et 1-Wire où la taille du code est primordiale. Le CRC-16 (16 bits) est courant dans les protocoles série (MODBUS, paquets de données USB) et détecte toutes les erreurs en rafale jusqu'à 16 bits. Le CRC-32 (32 bits) offre une probabilité de faux négatif de 1 sur 4 milliards et constitue la norme pour les systèmes de fichiers et les paquets réseau.

Deux messages différents peuvent-ils produire le même CRC (collision) ?

Oui — des collisions existent car le CRC associe des messages de longueur arbitraire à une somme de contrôle de longueur fixe (par exemple 32 bits). Étant donné une paire message+CRC valide, on peut toujours construire un autre message ayant le même CRC en ajoutant des bits soigneusement choisis. La probabilité qu'une corruption aléatoire produise le même CRC-32 est de 2⁻³² ≈ 2,3×10⁻¹⁰, ce qui est négligeable pour les communications mais pas pour des scénarios adverses.

Qu'est-ce que le polynôme générateur et comment est-il choisi ?

Le polynôme générateur g(x) détermine les propriétés de détection d'erreur du CRC. Un bon générateur doit être primitif (pour détecter toutes les erreurs à nombre impair de bits) ou au moins inclure (x+1) comme facteur. Le polynôme CRC-32 0x04C11DB7 a été conçu pour maximiser la détection d'erreurs en rafale pour les longueurs de trames Ethernet. Choisir des polynômes optimaux pour des longueurs de code et des modèles d'erreur spécifiques est un domaine actif de recherche en théorie du codage.

⚙ Sous le capot

Choisissez un préréglage CRC-8/16/32, tapez un message, puis injectez une erreur et observez la somme de contrôle la détecter — ou parfois la manquer.

crcchecksumalgorithmserror-detection

3D · Moteur de rendu Three.js / WebGL · Cible 60 FPS · fonctionne entièrement côté client, sans installation

Qu'avez-vous trouvé ?

Ajouter les étapes de reproduction (facultatif)