El Análisis de Frecuencias o ataque de texto cifrado, (Distribución frecuencial), se produce cuando la información conocida es sólo el texto cifrado. Básicamente se cuenta el número de veces que cada letra aparece en el texto cifrado y se compara con la frecuencia de aparición de las letras más comunes del idioma en el cual (se supone) está escrito el texto. Al-Kindi, en el siglo IX, escribe el primer tratado que sienta las bases del estudio del criptograma en base a la repetición de signos del alfabeto utilizado, el análisis de frecuencias.
Existen variantes en función del tipo de cifrado utilizado:
- Si identificamos frecuencias de letras comunes en el criptograma con un idioma, posiblemente el texto cifrado sea de transposición.
- Si las letras comunes en un idioma no son las más comunes en el texto cifrado, posiblemente el texto cifrado sea de sustitución.
- El más difícil de los casos es encontrarnos cifrados sofisticados o que utilicen cifrados polialfabéticos
Todos los cifrados por sustitución son vulnerables a este tipo de análisis, para ello debemos obtener un tamaño de código lo suficientemente largo para tener promedios significativos, dado que las propiedades estadísticas del texto claro se conservan en el texto cifrado.
El análisis de frecuencias se basa en la cadencia de letras o combinaciones de las mismas que aparecen en determinados textos. Para abordar el análisis de un criptograma, con este método, se utiliza/ban las cunas, son las palabras que se espera se incluyan en la presentación o finalización del mensaje, este método fue el primero utilizado por al-Kindi en el estudio de los mensajes cifrados que le enviaba el emperador de Bizancio.
En el análisis de más abajo (español), la letra E y A son las que más aprecen en los textos, la evidencia nos dice que para el texto cifrado deberemos sustituir los símbolos más frecuentes por ellas. Seguiremos haciendo parejas entre la frecuencia que hemos obtenido y la aparición de cada símbolo en el mensaje cifrado, con el histograma de frecuencias del idioma en el que se supone está el texto claro podremos descifrar el mensaje.
El análisis se debería realizar para textos de la época en la cual se considera que el cifrado ha sido realizado. A continuación tablas de frecuencias de los idiomas más próximos y después otra tabla con el análisis de tres libros distintos del español más hablado. He tomado distintas tablas de distintos idiomas y he encontrado diferencias sustanciales en los decimales e incluso en alguna cifra entera, algunas de esas tablas son del siglo pasado y he pensado en la conveniencia en obtener algunas nuevas.
Frecuencias en otros idiomas | Frecuencias en Español | ||||||||||
Autor | Libro | Autor | Libro | Autor | Libro | ||||||
Unamuno | La niebla | García Márquez | Crónica de una muerte anunciada | Juan Rulfo | Pedro Páramo | ||||||
Alemán | Francés | Inglés | Italiano | Portugués | Letra | nº | % | nº | % | nº | % |
6,596% | 7,236% | 7,475% | 11,753% | 14,421% | a | 25.521 | 11,63966 | 16.909 | 13,89617 | 17.583 | 12,80860 |
1,868% | 0,901% | 1,372% | 0,923% | 1,139% | b | 3.068 | 1,39926 | 2.296 | 1,88690 | 2.147 | 1,56401 |
3,072% | 3,160% | 2,733% | 4,505% | 3,888% | c | 7.991 | 3,64455 | 4.902 | 4,02857 | 4.613 | 3,36041 |
5,376% | 3,169% | 4,357% | 3,737% | 4,769% | d | 10.362 | 4,72592 | 6.391 | 5,25226 | 7.127 | 5,19177 |
17,497% | 13,115% | 12,121% | 11,792% | 11,943% | e | 30.620 | 13,96522 | 14.951 | 12,28705 | 18.612 | 13,55819 |
1,659% | 9,210% | 2,320% | 0,953% | 1,022% | f | 1.094 | 0,49895 | 744 | 0,61143 | 573 | 0,41741 |
3,107% | 0,866% | 2,048% | 1,641% | 1,309% | g | 2.797 | 1,27566 | 1.351 | 1,11028 | 1.612 | 1,17429 |
4,736% | 0,737% | 5,971% | 1,545% | 1,285% | h | 2.708 | 1,23507 | 1.296 | 1,06508 | 1.698 | 1,23693 |
7,545% | 7,309% | 7,373% | 11,295% | 6,492% | i | 11.762 | 5,36443 | 6.835 | 5,61715 | 6.263 | 4,56237 |
0,280% | 0,545% | 0,101% | 0,002% | 0,412% | j | 1.259 | 0,57421 | 583 | 0,47912 | 947 | 0,68986 |
1,209% | 0,049% | 0,696% | 0,000% | 0,020% | k | 11 | 0,00502 | 1 | 0,00082 | 2 | 0,00146 |
3,418% | 5,100% | 4,014% | 6,511% | 2,756% | l | 11.133 | 5,07756 | 7.310 | 6,00751 | 7.869 | 5,73229 |
2,528% | 2,668% | 2,633% | 2,509% | 4,641% | m | 7.454 | 3,39963 | 3.517 | 2,89034 | 4.188 | 3,05081 |
9,362% | 7,015% | 7,010% | 6,885% | 5,183% | n | 13.836 | 6,31035 | 8.435 | 6,93206 | 8.788 | 6,40175 |
0,000% | 0,000% | 0,000% | 0,000% | 0,000% | ñ | 576 | 0,26270 | 189 | 0,15532 | 281 | 0,20470 |
2,508% | 5,168% | 7,746% | 9,834% | 10,633% | o | 21.587 | 9,84543 | 11.073 | 9,10002 | 13.056 | 9,51084 |
0,789% | 3,021% | 1,836% | 3,051% | 2,530% | p | 5.199 | 2,37117 | 3.395 | 2,79008 | 3.400 | 2,47678 |
0,022% | 1,262% | 0,111% | 0,506% | 1,201% | q | 3.821 | 1,74269 | 1.347 | 1,10699 | 2.258 | 1,64487 |
7,097% | 6,253% | 6,072% | 6,377% | 6,540% | r | 13.792 | 6,29028 | 8.561 | 7,03561 | 9.259 | 6,74486 |
7,268% | 7,518% | 6,334% | 4,975% | 7,767% | s | 17.391 | 7,93172 | 8.620 | 7,08410 | 10.663 | 7,76762 |
6,037% | 7,114% | 9,179% | 5,625% | 4,756% | t | 8.817 | 4,02127 | 4.815 | 3,95707 | 5.401 | 3,93444 |
4,297% | 6,011% | 2,905% | 3,009% | 4,812% | u | 11.478 | 5,23490 | 5.019 | 4,12472 | 6.844 | 4,98561 |
0,660% | 1,628% | 1,120% | 2,081% | 1,774% | v | 2.656 | 1,21135 | 1.466 | 1,20479 | 1.791 | 1,30468 |
1,878% | 0,114% | 2,108% | 0,000% | 0,010% | w | 0 | 0,00000 | 4 | 0,00329 | 0 | 0,00000 |
0,030% | 0,387% | 0,171% | 0,000% | 0,215% | x | 306 | 0,13956 | 85 | 0,06985 | 37 | 0,02695 |
0,040% | 0,308% | 2,128% | 0,000% | 0,011% | y | 3.222 | 1,46949 | 1.112 | 0,91386 | 1.636 | 1,19177 |
1,119% | 0,136% | 0,071% | 0,491% | 0,471% | z | 798 | 0,36395 | 473 | 0,38872 | 627 | 0,45675 |
Programa en Java para la obtención de frecuencias.