Ya he escrito algunas entradas en este blog (ver primer post) sobre cifrados de sustitución polialfabética, entre otros sobre el cifrado de Vigenère, y también sobre el método Kasiski para atacar cifrados de este tipo, y en este post me propongo explicar lo que he entendido sobre el criptoanálisis basado en el Índice de Coincidencia (IC).
Este método de criptoanálisis fue desarrollado en 1920 por William Friedman para atacar cifrados de sustitución polialfabética con claves periódicas, sistemas criptograficos de los que el cifrado de Vigenère es un ejemplo.
Para explicar este método de criptoanálisis seguiré los siguientes puntos:
1.- Cifrados de sustitución polialfabética con claves periódicas.
2.- ¿Qué es el Índice de Coincidencia (IC)?.
3.- ¿Cómo se utiliza el Índice de Coincidencia (IC) para atacar este tipo de cifrados?.
4.- Ejemplo de ataque a un criptograma basado en el Índice de Coincidencia (IC), en un próximo post.
1.- Cifrados de sustitución polialfabética con claves periódicas:
Como ya sabemos, en estos sistemas de cifrado, de los que como digo el cifrado de Vigenère es un ejemplo, para cifrar un texto o mensaje en claro se utiliza una clave donde cada carácter de la misma se corresponde con un alfabeto, de tal forma que el primer carácter del texto en claro se cifra con el alfabeto correspondiente al primer carácter de la clave, el segundo carácter del texto en claro con el correspondiente al segundo y así hasta agotar todos los caracteres de la clave, momento en el cual el siguiente carácter del texto en claro se cifra nuevamente con el alfabeto correspondiente al primer carácter de la clave, y así sucesivamente, es decir:
Donde:
K: clave.
ki: carácter i-ésimo de la clave (1 ≤ i ≤ t).
t: periodo o longitud de la clave o, lo que es lo mismo, número de alfabetos.
E: función de cifrado.
mi: carácter i-ésimo del mensaje o texto en claro a cifrar.
D: función de descifrado.
ci: carácter i-ésimo del criptograma o texto cifrado.
n: tamaño del alfabeto.
Veamos esto cifrando un texto en claro en español con el cifrado de Vigenère.
1.1.- En primer lugar establezcamos una relación entre las letras del alfabeto español y la posición que ocupa cada una de ellas en el mismo:
1.2.- Tamaño del alfabeto (n) = 27
1.3.- Texto en claro a cifrar: EJEMPLO.
1.4.- Clave (K): CLAVE.
1.5.- Longitud de la clave (t) = 5.
1.6.- Cifrado:
Ek(m1) = (m1 + k1) mod n = (E + C) mod 27 = (4 + 2) mod 27 = 6 = G
Ek(m2) = (m2 + k2) mod n = (J + L) mod 27 = (9 + 11) mod 27 = 20 = T
Ek(m3) = (m3 + k3) mod n = (E + A) mod 27 = (4 + 0) mod 27 = 4 = E
Ek(m4) = (m4 + k4) mod n = (M + V) mod 27 = (12 + 22) mod 27 = 7 = H
Ek(m5) = (m5 + k5) mod n = (P + E) mod 27 = (16 + 4) mod 27 = 20 = T
Ek(m6) = (m6 + k1) mod n = (L + C) mod 27 = (11 + 2) mod 27 = 13 = N
Ek(m7) = (m7 + k2) mod n = (O + L) mod 27 = (15 + 11) mod 27 = 26 = Z
Texto cifrado o criptograma: GTEHTNZ.
1.7.- Descifrado:
Dk(c1) = (c1 - k1) mod n = (G - C) mod 27 = (6 - 2) mod 27 = 4 = E
Dk(c2) = (c2 - k2) mod n = (T - L) mod 27 = (20 - 11) mod 27 = 9 = J
Dk(c3) = (c3 - k3) mod n = (E - A) mod 27 = (4 - 0) mod 27 = 4 = E
Dk(c4) = (c4 - k4) mod n = (H - V) mod 27 = (7 - 22) mod 27 = 12 = M
Dk(c5) = (c5 - k5) mod n = (T - E) mod 27 = (20 - 4) mod 27 = 16 = P
Dk(c6) = (c6 - k1) mod n = (N - C) mod 27 = (13 - 2) mod 27 = 11 = L
Dk(c7) = (c7 - k2) mod n = (Z - L) mod 27 = (26 - 11) mod 27 = 15 = O
Texto en claro: EJEMPLO.
En este tipo de cifrados su vulnerabilidad residía en su naturaleza cíclica, es decir, en la aplicación cíclica de t cifrados de sustitución monoalfabética y, por tanto, como en el método Kasiski (ver primer post al que he hecho referencia al principio), lo primero que hay que hacer para atacarlos es averiguar la longitud de la clave, para más tarde realizar un análisis de frecuencias sobre los caracteres del criptograma que han sido cifrados con el mismo carácter de la clave (mismo alfabeto) con objeto de obtener la clave y descifrarlo.
2.- ¿Qué es el Índice de Coincidencia (IC)?:
El Índice de Coincidencia (IC) es la probabilidad de que
dos letras tomadas al azar de un texto sean iguales.
Para obtener la fórmula con la que calcularlo, consideremos lo siguiente:
2.1.- El número de pares de letras “AA” que podemos obtener
tomando 2 letras al azar de un texto es:
Donde: fA es la frecuencia o número de ocurrencias del carácter “A” en
el texto.
Por tanto, el número de pares de letras iguales que
podemos obtener tomando 2 letras al azar de un texto es:
2.2.- Por otra parte, el número de pares de letras tomadas al azar que podemos obtener de un total de N letras (tamaño del texto) es:
2.2.- Por otra parte, el número de pares de letras tomadas al azar que podemos obtener de un total de N letras (tamaño del texto) es:
2.3.- Por lo que la probabilidad de que dos letras tomadas
al azar de un texto con un tamaño de N letras sean iguales (IC) es:
3.- ¿Cómo se utiliza el Índice de Coincidencia (IC) para atacar cifrados de sustitución polialfabética con claves periódicas?:
3.- ¿Cómo se utiliza el Índice de Coincidencia (IC) para atacar cifrados de sustitución polialfabética con claves periódicas?:
Como ya he comentado, lo primero que hay que hacer para atacar este tipo de cifrados es averiguar la longitud de la clave, y para eso precisamente se utiliza el Índice de Coincidencia (IC).
Me explico: tal y como he leído por ahí, el IC obtenido a partir de un texto en el idioma español estará próximo a 0,0775 (lógicamente siempre y cuando el texto sea lo suficientemente grande, aunque ni siquiera hace falta que sea muy extenso para que el IC se aproxime a ese valor).
Cuando se cifra un texto empleando un sistema de sustitución monoalfabética el IC del idioma en el que está escrito el texto en claro se mantiene en el texto cifrado, mientras que si se utiliza un sistema de sustitución polialfabética el IC en el texto cifrado será significativamente menor que el del texto en claro, ya que las frecuencias más altas de las letras del texto en claro se reparten entre varias letras del criptograma.
De lo anterior se deduce que si calculamos el IC para las letras del criptograma que conforme a cada una de las posible longitudes de la clave hayan sido cifradas con el alfabeto correspondiente al mismo carácter de la clave sólo obtendremos valores próximo a 0,0775 para la longitud de la clave realmente usada en el cifrado. Es decir:
- Longitud de la clave (t) = 1: calculamos el IC de todo el texto cifrado. En este caso todos los caracteres del texto en claro habrían sido cifrados por el alfabeto correspondiente al único carácter de la clave y, por tanto, se habría utilizado un único alfabeto, es decir, se trataría realmente de una sustitución monoalfabética. Si el IC calculado está próximo a 0,0775 la clave empleada en el cifrado podría tener una longitud de 1.
- Longitud de la clave (t) = 2: formamos dos subcriptogramas (C1 y C2), el primero compuesto por los caracteres del criptograma 1º, 3º, 5º, 7º, 9º,... y el segundo por 2º, 4º, 6º, 8º, 10º,..., ya que los caracteres de C1 habrían sido cifrados con el alfabeto correspondiente a la primera letra de la clave y los de C2 con el alfabeto correspondiente a la segunda, y calculamos el IC de cada uno de estos dos subcriptogramas. Si ambos IC calculados están próximos a 0,0775 la clave empleada en el cifrado podría tener una longitud de 2.
- Longitud de la clave (t) = 3: formamos tres subcriptogramas (C1, C2, y C3) el primero compuesto por los caracteres del criptograma 1º, 4º, 7º, 10º, 13º,..., el segundo por 2º, 5º, 8º, 11º, 14º,... y el tercero por 3º, 6º, 9º, 12º, 15º..., ya que los caracteres de C1 habrían sido cifrados con el alfabeto correspondiente a la primera letra de la clave, los de C2 con el alfabeto correspondiente a la segunda y los de C3 con el alfabeto correspondiente a la tercera, y calculamos el IC de cada uno de estos tres subcriptogramas. Si los IC calculados están próximos a 0,0775 la clave empleada en el cifrado podría tener una longitud de 3.
...
Una vez averiguada la longitud de la clave, mediante el análisis de frecuencias de los caracteres de los subcriptogramas correspondientes a esa longitud, obtendríamos la clave utilizada y descifraríamos el mensaje.
En resumen y en mi opinión, un elegante método el propuesto por William Friedman, en 1920, para atacar cifrados de sustitución polialfabética con claves periódicas, pero que recomiendo utilizar en combinación con el método Kasiski, para una vez averiguada la longitud de la clave conforme a este último método confirmar que efectivamente es así, por los siguientes motivos principales:
- En textos pequeños el IC no es muy confiable.
- A medida que el tamaño de la clave aumenta llega un momento en el que el IC se aproxima al de una distribución uniforme, es decir, aquella en la que cada letra del alfabeto ocurre con la misma frecuencia (1/27), y por tanto el IC se aproxima a 0,0370, con lo que la información que este método nos aporta pierde valor.
Me explico: tal y como he leído por ahí, el IC obtenido a partir de un texto en el idioma español estará próximo a 0,0775 (lógicamente siempre y cuando el texto sea lo suficientemente grande, aunque ni siquiera hace falta que sea muy extenso para que el IC se aproxime a ese valor).
Cuando se cifra un texto empleando un sistema de sustitución monoalfabética el IC del idioma en el que está escrito el texto en claro se mantiene en el texto cifrado, mientras que si se utiliza un sistema de sustitución polialfabética el IC en el texto cifrado será significativamente menor que el del texto en claro, ya que las frecuencias más altas de las letras del texto en claro se reparten entre varias letras del criptograma.
De lo anterior se deduce que si calculamos el IC para las letras del criptograma que conforme a cada una de las posible longitudes de la clave hayan sido cifradas con el alfabeto correspondiente al mismo carácter de la clave sólo obtendremos valores próximo a 0,0775 para la longitud de la clave realmente usada en el cifrado. Es decir:
- Longitud de la clave (t) = 1: calculamos el IC de todo el texto cifrado. En este caso todos los caracteres del texto en claro habrían sido cifrados por el alfabeto correspondiente al único carácter de la clave y, por tanto, se habría utilizado un único alfabeto, es decir, se trataría realmente de una sustitución monoalfabética. Si el IC calculado está próximo a 0,0775 la clave empleada en el cifrado podría tener una longitud de 1.
- Longitud de la clave (t) = 2: formamos dos subcriptogramas (C1 y C2), el primero compuesto por los caracteres del criptograma 1º, 3º, 5º, 7º, 9º,... y el segundo por 2º, 4º, 6º, 8º, 10º,..., ya que los caracteres de C1 habrían sido cifrados con el alfabeto correspondiente a la primera letra de la clave y los de C2 con el alfabeto correspondiente a la segunda, y calculamos el IC de cada uno de estos dos subcriptogramas. Si ambos IC calculados están próximos a 0,0775 la clave empleada en el cifrado podría tener una longitud de 2.
- Longitud de la clave (t) = 3: formamos tres subcriptogramas (C1, C2, y C3) el primero compuesto por los caracteres del criptograma 1º, 4º, 7º, 10º, 13º,..., el segundo por 2º, 5º, 8º, 11º, 14º,... y el tercero por 3º, 6º, 9º, 12º, 15º..., ya que los caracteres de C1 habrían sido cifrados con el alfabeto correspondiente a la primera letra de la clave, los de C2 con el alfabeto correspondiente a la segunda y los de C3 con el alfabeto correspondiente a la tercera, y calculamos el IC de cada uno de estos tres subcriptogramas. Si los IC calculados están próximos a 0,0775 la clave empleada en el cifrado podría tener una longitud de 3.
...
Una vez averiguada la longitud de la clave, mediante el análisis de frecuencias de los caracteres de los subcriptogramas correspondientes a esa longitud, obtendríamos la clave utilizada y descifraríamos el mensaje.
En resumen y en mi opinión, un elegante método el propuesto por William Friedman, en 1920, para atacar cifrados de sustitución polialfabética con claves periódicas, pero que recomiendo utilizar en combinación con el método Kasiski, para una vez averiguada la longitud de la clave conforme a este último método confirmar que efectivamente es así, por los siguientes motivos principales:
- En textos pequeños el IC no es muy confiable.
- A medida que el tamaño de la clave aumenta llega un momento en el que el IC se aproxima al de una distribución uniforme, es decir, aquella en la que cada letra del alfabeto ocurre con la misma frecuencia (1/27), y por tanto el IC se aproxima a 0,0370, con lo que la información que este método nos aporta pierde valor.
4.- Ejemplo de ataque a un criptograma basado en el Índice de Coincidencia (IC):
En un próximo post.
Para calcular el sumatorio hay que introducir manualmente cada una de las frecuencias?
ResponderEliminarSí, aunque siempre puedes automatizar el proceso mediante un pequeño programa o utilizar alguna herramienta online para calcularlo (por ejemplo: http://practicalcryptography.com/cryptanalysis/text-characterisation/index-coincidence/)
ResponderEliminarHe intentado hacerlo manualmente y me dan valores minimos de 0.002
ResponderEliminarNo entiendo que he hecho mal en la formula.
Que significan las Ns en la fórmula. si utilizo las letras totales del texto me da 0.002.
ResponderEliminarLa N es el tamaño, longitud o número de letras del texto. Déjame un poco de tiempo e intento ponerte un ejemplo detallado del cálculo.
EliminarBuenas Juan F-M:
ResponderEliminarPongo un ejemplo de cálculo del Índice de coincidencia (IC) de un texto en claro, aunque lo habitual es que lo calculemos con respecto a criptogramas.
Supongamos el siguiente texto en claro: EJEMPLO DE CALCULO DEL INDICE DE COINCIDENCIA DE UN TEXTO
Quitamos los espacios:
EJEMPLODECALCULODELINDICEDECOINCIDENCIADEUNTEXTO
Longitud o tamaño del texto en claro (N) = 48
Ahora, para cada carácter (de 'A' a 'Z') del texto en claro se hace lo siguiente:
'A' --> Nº de caracteres 'A' (FA) = 2; Número de pares de letras 'AA' que podemos obtener tomando 2 letras del texto en claro = FA * (FA-1) / 2 = 2 * 1 / 2 = 1; Número de pares de letras posibles tomando 2 letras de un texto de 48 caracteres = N * (N-1) / 2 = 48 * 47 / 2 = 1.128; Por tanto, la probabilidad de que tomadas dos letras al azar del texto en claro éstas resulten ser 'AA' (caso favorables / casos posibles) = 1 / 1.128 = 0,00088652
'B' --> Nº de caracteres 'B' (FB) = 0; Número de pares de letras 'BB' que podemos obtener tomando 2 letras del texto en claro = FB * (FB-1) / 2 = 0 * (-1) / 2 = 0; Número de pares de letras posibles tomando 2 letras de un texto de 48 caracteres = N * (N-1) / 2 = 48 * 47 / 2 = 1.128; Por tanto, la probabilidad de que tomadas dos letras al azar del texto en claro éstas resulten ser 'BB' (caso favorables / casos posibles) = 0 / 1.128 = 0
'C' --> Nº de caracteres 'C' (FC) = 6; Número de pares de letras 'CC' que podemos obtener tomando 2 letras del texto en claro = FC * (FC-1) / 2 = 6 * 5 / 2 = 15; Número de pares de letras posibles tomando 2 letras de un texto de 48 caracteres = N * (N-1) / 2 = 48 * 47 / 2 = 1.128; Por tanto, la probabilidad de que tomadas dos letras al azar del texto en claro éstas resulten ser 'CC' (caso favorables / casos posibles) = 15 / 1.128 = 0,01329787
Y así hasta la letra 'Z'.
Y, finalmente, el Índice de Coincidencia (IC) correspondiente al texto en claro (la probabilidad de que dos letras tomadas al azar del texto en claro resulten ser iguales) es el sumatorio de todos los resultados obtenidos: IC = 0,00088652 + 0 + 0,01329787 + ... = 0,08599291