Qué es un CRC
Una comprobación de redundancia cíclica trata el mensaje como un número binario largo y lo divide entre un polinomio fijo; el resto es la suma de comprobación. Si un bit, o una ráfaga de bits más corta que el CRC, se voltea, el resto cambia, y por eso los CRC protegen tramas Ethernet, entradas ZIP, chunks PNG, sectores de disco y protocolos serie. Son rápidos en hardware y software, pero no criptográficos: cualquiera puede fabricar datos con el CRC que quiera.
Por qué hay tantos «CRC-16»
Dos implementaciones de la misma anchura pueden diferir en cinco parámetros, y cada combinación es una suma de comprobación distinta:
| Parámetro | Significado |
|---|---|
| Polinomio | El divisor, escrito sin su bit superior (0x1021 para CCITT, 0x04C11DB7 para CRC-32). |
| Init | El valor inicial del registro, 0 o todo unos. |
| Reflejar entrada | Si cada byte de entrada se procesa empezando por el bit menos significativo (sí en CRC-32, MODBUS; no en CCITT-FALSE, XMODEM). |
| Reflejar salida | Si el registro final se invierte bit a bit. |
| XOR out | Un XOR final, normalmente 0 o todo unos. |
La forma estándar de identificar una variante es su valor de comprobación: el CRC de la cadena ASCII 123456789. La tabla de arriba lo muestra para cada modelo, y la entrada por defecto es exactamente esa cadena; si un dispositivo te da una suma de comprobación para datos conocidos, puedes compararla con todas las variantes a la vez.
Variantes habituales
- CRC-32 (0x04C11DB7, reflejado): Ethernet, ZIP, gzip, PNG,
zlib.crc32,cksum -o 3. - CRC-32C (Castagnoli): iSCSI, SCTP, metadatos de ext4, Btrfs, LevelDB; tiene una instrucción de hardware en x86 y ARM y por eso es la opción rápida para diseños nuevos.
- CRC-16/MODBUS: Modbus RTU sobre serie; CRC-16/CCITT-FALSE: Bluetooth, muchas menciones de «CRC-CCITT»; CRC-16/XMODEM: XMODEM,
binascii.crc_hqxde Python. - Adler-32: flujos zlib; más rápido que CRC pero más débil con entradas cortas.
Preguntas
¿Un CRC es lo mismo que un hash?
No. Un CRC detecta corrupción accidental y es trivial de invertir o falsificar. Para integridad frente a un atacante o para identificar archivos usa SHA-256. Para velocidad en un canal de confianza, CRC está bien.
Mi dispositivo da un CRC-16 distinto del de esta página.
Hay al menos una docena de variantes de CRC-16. Introduce los datos que comprobó el dispositivo y compara su valor con cada fila de la tabla; la fila que coincida te dice el polinomio, el init y la reflexión del dispositivo. Si ninguna coincide, prueba el modelo personalizado y comprueba si el dispositivo incluye un byte de longitud o una dirección en los datos.
¿Qué orden de bytes tiene el resultado?
El CRC se muestra como un número. Cuando se escribe en un paquete, el protocolo decide el orden: MODBUS envía primero el byte bajo, XMODEM el alto. Consulta la especificación o una trama de ejemplo.
¿Qué es CRC-32C y por qué lo usan las bases de datos?
CRC-32 con el polinomio de Castagnoli, que detecta mejor los errores en los tamaños de bloque de los sistemas de almacenamiento y está implementado como una sola instrucción de CPU (SSE4.2 crc32, ARMv8 CRC32C), lo que lo hace varias veces más rápido que el CRC-32 clásico.
¿Puedo calcular un CRC de forma incremental?
Sí. Todos estos CRC pueden continuarse desde un valor anterior, así funciona zlib.crc32(data, previous). Esta página calcula toda la entrada de una vez.