Cómo calcular el CRC de un fichero en Linux

Publicado el 21 diciembre 2017 por Drassill
Las redes de datos se van haciendo progresivamente más complejas y más difíciles de administrar; ya sea por que las infraestructuras crecen o debido a que existen más factores que pueden conducir a un error o una corrupción en la comunicación; desde fallos a nivel de diseño hasta ataques de man in the middle. Afortunadamente a medida que la tecnología evoluciona, también lo hacen los mecanismos de verificación, y hoy vengo a hablaros de uno de ellos que se usa en todas las redes de una forma imperceptible para los usuarios. Se trata del CRC o Código de Redundancia Cíclica.

CRC no es ni más ni menos que una mecanismo de verificación de integridad de datos, el cual realiza un checksum al enviar un paquete a otro punto de la red, y luego es realizado otro más al llegar a su destino. Ambos checksum serían comparados y en caso de que fuesen iguales, el paquete se daría por válido, mientras que en caso contrario se consideraría que el paquete se encuentra corrupto o infectado. A modo aclaratorio, he aquí un pequeño diagrama que puede resultar de ayuda:

El mecanismo de comprobación del CRC es ejecutado automáticamente por el sistema sin intervención alguna, pero eso no significa que no haya métodos para comprobar el CRC de un fichero manualmente sin necesidad de tener que enviarlo a ningún lado. La herramienta en cuestión, obviamente para entornos GNU/Linux, se llama cksum.
Cksum es una herramienta cuya dificultad de uso, afortunadamente, es nula y que ya viene pre-instalada en el sistema, con lo que su uso está al alcance de cualquiera. Su utilidad es el calcular el checksum CRC de un fichero y para usarla simplemente habría que escribir:
cksum fichero
Ejemplo:
cksum testCRCtxt
935282863 5 testCRCtxt

La salida de este comando estaría dividida en tres columnas: La primera correspondería al checksum CRC, la segunda al tamaño del fichero y la tercera al nombre de éste. Tanto el CRC como el tamaño son importantes, pero a nivel de red el que se tomaría en cuenta sería el CRC. Dicho checksum CRC cambiaría en caso de que el contenido de éste cambiase; veamos un pequeño ejemplo:
root@debian:/tmp# cat testCRC.txt
test
root@debian:/tmp# cksum testCRC.txt
935282863 5 testCRCtxt
root@debian:/tmp# echo 'Cambio de contenido' > testCRC.txt
root@debian:/tmp# cat testCRC.txt
Cambio de contenido
root@debian:/tmp# cksum testCRC.txt
301284194 20 testCRCtxt

En el ejemplo anterior se puede apreciar que cuando el contenido del fichero testCRC.txt es test, el checksum es 935282863 mientras que cuando el contenido es Cambio de contenido, sería 301284194. Dicho checksum también variaría con cambios más sutiles, tales como la sustitución de todas las i por u (mediante el comando sed por ejemplo).
root@debian:/tmp# sed -i 's/i/u/g' testCRC.txt
root@debian:/tmp# cat testCRC.txt
Cambuo de contenudo
root@debian:/tmp# cksum testCRC.txt
1797125648 20 testCRCtxt

Se podría considerar como una comprobación de checksum parecida a la usada con md5 (mediante md5sum) pero con un enfoque mucho más orientado a las redes; es más en este caso se podría decir que se hacen comprobaciones de integridad de forma automática sin que nosotros nos percatemos de ello; haciendo que el Código de Redundancia Cíclica sea usado por todo tipo de usuarios todos los días sin que la mayoría de ellos lo sepan, con lo que en ocasiones puede sernos interesantes conocer el CRC de un fichero con el fin de tener un mayor conocimiento de la información transmitida y/o recibida.
Espero que os haya parecido interesante.
Saludos.