¿Mapa es el aflabeto?
---------------------------------------------------
La estructura mapa contiene el alfabeto. Por eso crear_mapa crea la transformación del alfabeto a Z_27.
La función indice recibe el mapa y un carácter y devuelve el índice del carácter en la estructura. Es decir, dada una letra del alfabeto devuelve la transformación al entero correspondiente entre 0 y 26 (Z_27).
La función indice2 hace lo mismo (salvo por la pre-condición) en un arreglo genérico.
Es importante ver que estas funciones son sugerencias, quizás luego en tu resolución no las utilices todas. Es bueno que veas qué funcionalidad queres resolver (quizás indice2 no la termines utilizando).
---------------------------------------------------
---------------------------------------------------
Problema con la 'ñ'
---------------------------------------------------
Si tienen problema con codificar la 'ñ', una solución práctica es codificar esa letra con otro caracter de la tabla ASCII. Esto tiene por objetivo que no les quite el tiempo esta cuestión. Si hacen eso, deben realizar en los archivos dicha transformación.
Un link que han compartido para java es: https://stackoverflow.com/questions/652161/how-do-i-convert-between-iso-8859-1-and-utf-8-in-java
---------------------------------------------------
---------------------------------------------------
Duda sobre coincidencia bloque
---------------------------------------------------
En este criptoanálisis lo que intentamos averiguar es el largo de la clave para Vigenere. La estrategia es pensar en que si el largo de la clave es 'n', entonces se produjeron 'n' corrimientos independientes, tantas veces como 'n' entre en el largo del texto. Entonces, lo que hacemos es armar una matriz con 'n' filas y llenamos por columna. Lo que puede pasar que la última columna no quede de forma completa pues el largo del texto no es múltiplo del largo de la clave. Para poder hallar el índice de coincidencia mutua, se va a utilizar el largo de cada fila.
En la práctica lo que sucede es que los cifrados por bloques, saben trabajar con cierto tamaño fijo de bloque. También vimos los distintos modos de operación de los bloques (CBC, etc). Es por ello que existen técnicas de Padding, que lo que hacen es, para el último bloque, agregar caracteres dummy de forma de completar el largo de bloque. Entonces, quien recibe el texto cifrado, primero lo desencripta y luego desecha estos últimos caracteres dummy. Es interesante ver de qué forma sabe el receptor descartar estos caracteres dado que no forman parte del mensaje original.
Si quieren profundizar más en técnicas de padding pueden buscar los PKCS, por ejemplo PKCS#5 (https://tools.ietf.org/html/rfc8018).
Si nos centramos en la implementación nuestra, como bien dijeron, toma los largos de bloque de forma fija. Pero está bien que tomen el largo de bloque real, en tanto no estamos trabajando con técnicas de padding y además esa diferencia no les afecta en poder determinar cómo varía el ic entre los distintos bloques.
---------------------------------------------------
---------------------------------------------------
Duda sobre el índice de coincidencia mutua
---------------------------------------------------
El indice de coincidencia mutua refiere a la probabilidad de elegir de forma aleatoria y uniforme dos letras del alfabeto y que sean idénticas. Dichas probabilidades son distintas entre los distintos idiomas. El idioma inglés es alrededor de 0.065, en español 0.073 y en un idioma aleatorio es 0.038. Notemos que lo que interesa en una herramienta automatizada como la que estas programando, es que se despega del idioma aleatorio, es por eso, que tu automatización buscará máximos.
En particular, en la parte 4.5 lo que se busca es dado un largo de clave determinar de forma automática cuál fue la clave de encriptado. Se divide el texto en tantos bloques como letras tenga la clave, esto quiere decir que agrupas en cada bloque las letras que tienen el mismo corrimiento. Entonces, lo que se busca es dado un bloque determinar el corrimiento de forma automática. Para ello, en cada bloque calculas el indice de coincidencia mutua de cada posible corrimiento, donde se da el máximo conjeturas que ese corrimiento (letra) es el que forma parte de la clave.
Al hallar el indice de coincidencia mutua en esta parte lo que debes tener en cuenta es la probabilidad de ocurrencia de las letras en el idioma español (esto es una tabla y se las pasé en un archivo en el comprimido) para luego multiplicarlo por la frecuencia relativas de la letra en el texto que estás analizando. Esto dividido por la longitud del texto.
Te podes referir a la página 35 del libro de Stinson que les recomendamos lean para el laboratorio.
---------------------------------------------------
---------------------------------------------------
Duda sobre Corrimientos en Mutua
---------------------------------------------------
Vigenere es un cifrado por bloques. Si te fijas como funciona el encriptado, dada una clave de largo k, se aplican k corrimientos tantas veces como k entre en el largo del texto. Entonces si pensamos esos corrimientos de forma independiente, es como si tuviéramos k textos cifrados por el método de shift y cada uno con un posible corrimiento distinto.
Para efectuar este ataque el largo de la clave de Vigenere ya se supone conocido. Entonces, dividimos el texto en k bloques. Cada bloque corresponde con un corrimiento de la clave. Ahora resta saber para cada bloque cuál es el corrimiento que se hizo. Como el ataque está automatizado, se hace una especie de fuerza bruta. Se prueba con todos los posibles corrimientos y se calcula el indice de coincidencia mutua. Entonces te quedas con el ic que es máximo entre todas las posibilidades. Esto es porque, en el mensaje anterior que explicaba, el icm del idioma español está por encima y lejos del icm del idioma aleatorio.
---------------------------------------------------
---------------------------------------------------
Duda en salida distinta en Sustitución Parcial
---------------------------------------------------
Veamos el ejemplo. La primer parte del texto cifrado es: tsvcdyertsgjt
La clave candidata es: n-gr-wo-jk-sd-yfbe-mcp-aui-
Esto quiere decir la 'a' se encriptó en 'n', entonces para desencriptar cada ocurrencia de 'n' se sustituye por una 'a' y así sucesivamente.
Entonces,
* la 't' no ocurre en la clave de encriptado, ergo es (t)
*. la 's' si miramos la clave parcial, es el transformado de la 'l', ergo es 'l'
* así sucesivamente.
La salida viene dando : (t)l ...
---------------------------------------------------
---------------------------------------------------
Fin de línea de los archivos que recibe cripto
---------------------------------------------------
Los archivos que recibe el programa cripto no tienen fin de línea. Por ejemplo, si la clave de Vigenere es 'ejemplo', el contenido de key.txt no es 'ejemplo\n'. El fin de línea se puede quitar con un editor hexadecimal.
---------------------------------------------------
---------------------------------------------------