Estoy intentando escribir un software que pretende responder genéricamente a la pregunta de qué polinomio generador de Código de Redundancia Cíclica (CRC) se utiliza para un conjunto dado de mensajes de muestra que utilizan el mismo CRC desconocido.
Por ejemplo, aquí hay dos mensajes en hexadecimal que utilizan el mismo CRC:
ee 00 00 00 00 01 20 13 10 (message 1)
ee 00 00 00 00 03 20 a3 23 (message 2)
Dado que los cálculos de CRC son esencialmente división de polinomios sobre GF(2) Podemos considerar que cada cálculo de CRC es $M(x) x^n = Q(x) G(x) + R(x)$ donde $M(x)$ es el mensaje original al que se le añade $n$ ceros, $G(x)$ es el polinomio generador y $R(x)$ es el resto, que es idéntico al valor CRC que se adjunta al final del mensaje. En este caso concreto, el mensaje original es
ee 00 00 00 00 01 20
y el anexo $R(x)$ es 13 10
Dado que estos dos mensajes utilizan el mismo polinomio generador, sabemos que $M_1(x) x^n = Q_1(x) G(x) + R_1(x)$ y $M_2(x) x^n = Q_2(x) G(x) + R_2(x)$ . Restando una de la otra obtenemos: $$\begin{eqnarray*} M_1(x) x^n - M_2(x) x^n &=& Q_1(x) G(x) + R_1(x) - Q_2(x) G(x) - R_2(x)\\ (M_1(x) - M_2(x))x^n - R_1(x) + R_2(x) &=& (Q_1(x)-Q_2(x))G(x)\\ \end{eqnarray*}$$ Dado que la suma y la resta de polinomios sobre GF(2) son idénticas a la operación de suma exclusiva, este resultado significa que la suma exclusiva de los dos mensajes (incluidos los CRC) es idéntica a $(Q_1(x)-Q_2(x))G(x)$ por lo que encontrar el polinomio generador $G(x)$ se puede hacer mediante la factorización de este resultado. En el caso concreto de los dos mensajes anteriores, obtenemos
02 00 b0 33
Debido a la forma en que se calculan los CRC con mayor frecuencia, los bits se "intercambian" para que esto corresponda realmente al polinomio: $x^{30}+x^{11}+x^{10}+x^8+x^7+x^6+x^3+x^2$ . Esto es un factor trivial en $x^2(x^{28}+x^9+x^8+x^6+x^5+x^4+x+1)$ pero ahí es donde me quedo atascado. Sé que en este caso particular, $G(x) = x^{16}+x^{12}+x^5+1$ (que algunos pueden reconocer como el polinomio estándar del CCITT de 16 bits).
¿Cómo puedo escribir un código eficiente para factorizar ese polinomio sobre GF(2) sin recurrir a la fuerza bruta?
Buscando bibliografía que ayudara a responder a esa pregunta, encontré varios trabajos que parecían prometedores:
- http://www-math.upb.de/~aggathen/Publicaciones/gatger96a.ps.gz
- http://www.sciencedirect.com/science/article/pii/S0747717185710553
Sin embargo, soy ingeniero y no matemático, y me parece que no puedo entender lo que significan realmente los documentos y, por tanto, no puedo utilizar los algoritmos inteligentes que pretenden contener. Si no vuelvo a obtener un título en teoría de campos, ¿hay algún medio para aprender a utilizar las técnicas modernas de factorización de polinomios para aplicarlas a este problema?