El Índice de Coincidencia es una técnica propuesta por William F. Friedman basada en el conocimiento y trabajo de Kasiski, y publicada en 1.922 como “The Index of Coincidence and Its Applications in Cryptography”. Estas técnicas fueron mejoradas posteriormente por Solomon Kullback, otro compañero judio en la SIS, posteriormente NSA.
Friedman trata la distribución de frecuencias como algo causal y relacionado, para mostrar cómo usarlo, pone como ejemplo el ataque al código denominado “disco quíntuple de Vogel” de E. J. Vogel. Por extensión, se utiliza para atacar cifrados de sustitución poli-alfabética tipo Vigènere y cifrados XOR, a través de la determinación del período de aparición de la clave, como en el método Kasiski.
El índice de coincidencia se define como la probabilidad de que dos letras elegidas al azar de un texto sean las mismas. Si Fi es la frecuencia del carácter cifrado i (número de sus ocurrencias en el criptograma), y N es el número total de caracteres del texto, el índice de coincidencia de esa letra se puede calcular como:
El índice esperado de coincidencia para un idioma determinado, utilizando la frecuencia de las letras del idioma se obtiene con:
n es el tamaño del alfabeto, para el español 27 letras, con ellas obtendríamos un IC no normalizado ≈ 0,0744. El normalizado sería: Kappap/ Kappar = 0,0744 / 0,037037 = 2,0088.
Aquí tenéis un programa en Java para obtener el Índice de Coincidencia de un criptograma. También se puede utilizar para obtener el IC del idioma utilizado, sustituyendo el criptograma por un texto en claro de tamaño significativo (cuanto mayor sea el texto, mejor será el resultado).
Friedman usa las constantes / prueba de Kappa para identificar si dos o más textos han sido cifrados de forma idéntica. Si se han cifrado de la misma manera, su índice de coincidencia será aproximadamente igual a Kappap ≈ 0,0744, en caso contrario se acercaría a Kappar = 0,037037 (1/27 letras del español).
Con el IC se puede identificar cuál tipo de cifrado clásico se ha utilizado, si el índice de coincidencia es alto y está cerca del IC del idioma Kp, el texto probablemente se cifró utilizando una transposición o cifrado simple (mono-alfabético). De lo contrario, si el índice de coincidencia es bajo y cercano al IC esperado para un texto aleatorio Kr, el texto probablemente se cifró utilizando un cifrado poli-alfabético. El resultado del programa en java para obtener el índice de coincidencia 0,0434, que está más arriba, ha utilizado el criptograma del ejemplo de Kasiski que fue cifrado con Vigènere.
Una vez obtenido el IC y con los valores de N y Kappa, podemos estimar la longitud de la palabra clave (Lc) para cifrados tipo Vigènere. La fórmula es la siguiente
Con los datos del ejemplo Lc = 5,7988
Para confirmar la longitud de la clave Lc, dividimos el criptograma en tamaños de la longitud de Lc y calculamos el IC para cada división. Si todos los valores IC tienden a 0,074, Lc puede ser la longitud correcta, en caso contrario y si se acercan a IC = 0,0370, la Lc no es correcta. Esta forma de proceder es válida para claves cortas.
Personalmente y aunque sea antiguo, me gusta más Kasiski.