CRC es una división larga . Toma el mensaje, o paquete de software, como un número enormemente largo y lo divide repetidamente a la antigua división larga, restando el divisor hasta que el MSB sea cero, y el resultado final, el CRC, es el resto . La diferencia con la división larga ordinaria es que todas las sustracciones se realizan en el módulo-2, es decir, haciendo XOR al divisor con el siguiente dividendo, que es muy rápido y fácil con la lógica digital. El polinomio generador de CRC o “número mágico” siempre tiene un MSB de 1, por lo que si el mensaje no tiene un MSB de 1, omite el XOR y cambia el mensaje hasta que lo tenga. Es extremadamente rápido Lo que lo hace útil es que si agrega el resto al mensaje, la próxima vez que lo CRC, la división es exacta, es decir, el resto es cero. Hay variaciones en esto, como sembrar el CRC con diferentes números al principio, pero el punto es que siempre le dará una respuesta predecible siempre que el mensaje no cambie.
Otras respuestas dicen que el CRC-16 no es lo suficientemente bueno. Hay 65.536 resultados posibles para un CRC-16, por lo que es teóricamente posible que en un programa largo, varias variaciones den el mismo resultado, pero si está pirateando un ejecutable es mucho trabajo modificarlo de una manera para producir un resultado previsto . No imposible, solo muy difícil y lento. Aún así, es muy poco más trabajo usar un CRC-32 para dar 4 mil millones de resultados posibles. Una función hash como SHA es aún más segura, pero requiere mucho más trabajo para implementar. Está cifrando efectivamente el programa mediante un algoritmo complicado y termina con un resumen , que es otro tipo de resto.
La forma de hacerlo es incluir la rutina CRC en algún lugar del programa, configurada para CRC toda la ROM de principio a fin. Luego, cuando haya terminado el archivo hexadecimal, ejecute el algoritmo CRC en todo el programa de principio a fin, excepto los dos últimos bytes (4 bytes si usa CRC-32). Tome el resultado de esa operación CRC e insértelo como los últimos dos (o cuatro) bytes del archivo hexadecimal. Prográmelo en el dispositivo. Ahora, cuando ejecuta la rutina interna de CRC, que hace inmediatamente que el programa arranca, tomará los últimos bytes que acaba de programar y terminará en cero, o el resultado previsto si utilizó una semilla diferente de cero. Su rutina interna debería bloquearse o detenerse si el CRC no produce el resultado esperado.
- ¿Cómo puedo escribir una función C de retardo de software para Microchip PIC32 MCU? Estoy usando el microcontrolador PIC32MX795F512L con el compilador MPLAB C32 C para MCU PIC32, y me gustaría que una función se retrase en milisegundos.
- ¿Cuál es la diferencia entre un sistema operativo para una PC y una computadora de mano y un sistema integrado?
- ¿Hay un sabor de Linux integrado con soporte KVM?
- ¿Es IoT un nombre elegante de un producto integrado basado en Linux?
- ¿Qué curso debo seleccionar entre vlsi y sistemas integrados?
Debo decir esto antes de que alguien lo comente: un CRC de n bits en realidad usa un generador de bits ( n + 1 ), pero dado que el MSB siempre es 1, siempre se asume y no se menciona.
Trivialidades:
- El CRC de una cadena infinita de 0 siempre es 0. Puede agregar ceros infinitos al final de un mensaje sin cambiar el CRC.
- Un generador de números pseudoaleatorios de registro de desplazamiento es solo un generador CRC alimentado con una cadena infinita de 1.