Tal y como prometimos, en este artículo
acabaremos el tratamiento de los cifrados poligráficos
(de Hill). En la primera parte de esta serie que te ofrecemos,
vimos como realizar estos cifrados para el caso n=2, esto es bloques
de 2 bytes (caracteres).
Generalizando lo tratado en dicho artículo,
un cifrado de Hill se obtiene al transformar bloques de n caracteres
en un texto cifrado a través de la relación
C=A.P(mod 26)
donde A es una matriz nxn que debe ser invertible módulo
26, (recuerda que el 26 proviene de que solo estamos usando las
letras A-Z que son justamente 26) es decir que el m.c.d del determinante
de A y 26 sea 1 - dicho de otro modo que el determinante de A
no divida a 26 ni sea un múltiplo de 26 -, C es la matriz
columna resultante del cifrado de P (un bloque de n caracteres).
Podéis encontrar la teoría
de determinantes en cualquier libro de COU o de álgebra
lineal aunque si alguien me escribe porque no lo entiende, trataré
de explicarlo en otro artículo.
Bien, supongamos que hemos elegido nuestra
matriz A, posiblemente a partir de una clave. Dividimos nuestro
texto en bloques de n caracteres y a cada uno de ellos le aplicamos
la transformación antes citada. ¿Como debemos hacer
para descifrar el texto?
Según la teoría de matrices,
y como ya se explico en el anterior artículo, tenemos que
aplicar la transformación
P=A'C(mod 26)
donde A' es la inversa de A módulo 26, pero ¿como
calcular la inversa módulo 26 de una matriz cualquiera?
Pues bien, si A es una matriz tal que
m.c.d(det (A), 26)=1 y llamamos d=det(A) entonces A'=d'.B donde
d' es el inverso de d módulo 26 y B es la traspuesta de
la matriz adjunta de A.
¿Suena muy complicado? Sigue leyendo,
no lo es tanto. Veamos un ejemplo:
Vamos a cifrar la frase MAXIMA SEGURIDAD
utilizando un cifrado poligráfico de tamaño 3. Para
no alargarlo innecesariamente codificaremos solo los tres primeros
caracteres , tomemos sus equivalentes numéricos:
M A X
12 0 23
Vale, ahora escogemos:

cuyo determinante es d=3 entonces tendremos que d'=9 pues 3.9=27=1
(mod 26) ; esta matriz nos sirve. Por otro lado

así que
(módulo
26 como siempre) y así tenemos la inversa que nos servirá
para descifrar.
Para cifrar 
el resultado es [57 58 -11] es decir [5 6 15] tomándolo
módulo 26. Así que el bloque que corresponde a MAX
es FGP.
Probemos con el descifrado:

el resultado es como era de prever [12 0 23], es decir el bloque
MAX original.
En este ejemplo hemos utilizado bloques
de tamaño 3 pero espero que quede claro como generalizarlo
a bloques de cualquier tamaño.
Dijimos que estos métodos son
inmunes al análisis de frecuencia de letras, a diferencia
de los cifrados monoalfabéticos de los que se trató
en el primer artículo, la razón es que por la A
que aparece en el bloque A F (suponiendo que estemos en el caso
n=2) no resultará cifrada de la misma forma que la A que
aparece en un bloque como A S.
Sin embargo alguien pensará que
podíamos hacer un análisis de PARES de letras. Bien,
apúntate una por chico listo. Efectivamente hay estadísticas
y sabemos cual es el par de letras más frecuente en estañol
(no tengo los datos a mano pero posiblemente sean E L o una preposición
como D E ).
Entonces sólo tenemos que suponer
que el par de letras más frecuente en el mensaje cifrado
corresponde a DE y a partir de ahí unas cuantas operaciones
con matrices nos darán la matriz que se empleo para cifrar.
Hay 26x26 = 676 pares posibles de letras
(cuando empleemos los 256 caracteres posibles en un fichero de
tipo binario tendremos 256x256=65536 combinaciones, bastante más
difícil para el criptoanalista), 676 pares son bastantes
pero es manejable porque unos pares destacan bastante en su frecuencia
de aparición sobre los otros.
Pasemos al caso n=3, ahora tenemos 26x26x26=17576
casos, son bastantes pero aún tenemos estadísticas
para combinaciones de tres letras en español. Ahora bien,
hagamos las cosas en serio empleando bloques de tamaño
10, el número de bloques posibles es 26^10 es decir aproximadamente
1.4E14 o si te gustan los ceros: 140.000.000.000.000; un análisis
de frecuencias de bloques de 10 caracteres es muy improbable por
no decir imposible.
Pues bien, ahí tenemos un reto:
escribe un programa que a partir de una clave genere una matriz
invertible de orden 10 (módulo 256), que divida el texto
en bloques de dicho tamaño y con unas cuantas operaciones
elementales obtenga el texto cifrado. Además el mismo programa
debe ser capaz de dada la clave construir la matriz de cifrado,
invertirla y con las mismas operaciones de antes descifrar el
fichero propuesto.
Para terminar incluyo para que os animéis
a hacer algo mejor, el código
fuente en C de un programa que cifra o descifra una cadena
de texto. Utiliza el método de Hill para una matriz 2x2.
Ni que decir tiene que no es un método seguro sino educa-ware
:-)