Ejercicios para descifrar y cifrar, Ejercicios de Programación Java. Universidad del País Vasco - Euskal Herriko Unibertsitatea (UPV - EHU)
Coliso
Coliso

Ejercicios para descifrar y cifrar, Ejercicios de Programación Java. Universidad del País Vasco - Euskal Herriko Unibertsitatea (UPV - EHU)

9 páginas
4Número de descargas
120Número de visitas
Descripción
Codigo hacker Codigo Cesar Codigo Vernam etc.
20 Puntos
Puntos necesarios para descargar
este documento
Descarga el documento
Vista previa3 páginas / 9
Esta solo es una vista previa
3 páginas mostradas de 9 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 9 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 9 páginas totales
Descarga el documento
Esta solo es una vista previa
3 páginas mostradas de 9 páginas totales
Descarga el documento

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

Objetivos: Poner en práctica todos los conceptos vistos en la asignatura

1. Descripción de la práctica La Criptografía, conocida como el “Arte de escribir con clave secreta o de un modo enigmáti- co”, consiste en un conjunto de técnicas para la protección o el ocultamiento de la información frente a observadores no autorizados. Esta disciplina surge de la necesidad del ser humano de comunicar información confidencial a otras personas, manteniendo la información en secreto.

El objetivo de esta práctica es el desarrollo de alguna de las técnicas clásicas de cifrado o descifrado de mensajes. Para ello, se proporciona un proyecto que contiene la definición de los tipos de datos y funcionalidades básicas junto con la funcionalidad de comprobación. En esta práctica se debe completar el proyecto implementando el tipo de datos y la funcionalidad indicada en el apartado 4.

2. Técnicas de cifrado y descifrado En este apartado se describen las técnicas de cifrado y descifrado que se van a implementar

en la práctica. Las técnicas de cifrado que se presentan consisten en la sustitución de las letras por otros caracteres.

2.1. Lenguaje Hacker

Aunque no sea un algoritmo de cifrado propiamente dicho, los internautas han utilizado este “lenguaje” para difundir sus mensajes evitando ser censurados. El sistema es muy sencillo y consiste en reemplazar algunas letras por aquellos números o símbolos a los que se asemejan (ver Tabla 1) y mantener el resto de las letras.

2.2. Cifrado César

El cifrado César, también conocido como cifrado por desplazamiento o desplazamiento de César, es una técnica de cifrado por sustitución. En lugar de basarse en una table de equivalencias como el Lenguaje Hacker, en este método cada letra del texto original es sustituida por otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto (ver Figura 1).

Utilizando esta técnica para cifrar el mensaje “este es un mensaje secreto” con un des- plazamiento de 3 espacios se obtiene el texto “hvwh hv xq phqvdmh vhfuhwr ”.

1La figura está cogida de https://en.wikipedia.org/wiki/Caesar_cipher

Página 1 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

Letra Símbolo A 4 O 0 E 3 G 6 I 1 S 5 T 7 V / W // Z 2 B 8

Tabla 1: Tabla de equivalencias entre la letra y el símbolo en el Lenguaje Hacker

Figura 1: Sustitución por desplazamiento1

Para descifrar el texto, debemos realizar el proceso inverso. Reemplazar cada una de las letras del texto cifrado por la letra del alfabeto que se encuentra 3 espacios antes en el alfabeto.

2.3. Cifrado de Vernam

El cifrado de Vernam en un método de cifrado simétrico, es decir, utiliza las mismas claves para encriptar un texto que para desencriptarlo. Este método utiliza una “cinta” de claves pseudoaleatoria para codificar el texto tal como se muestra en la Figura 2. Cada caracter del mensaje se procesa aplicando el operador booleano XOr a nivel de bits con la clave correspondiente, obtenida de la cinta, para generar el caracter cifrado.

Este método, aunque sencillo, resulta imposible de romper siempre que se garantice que la secuencia de claves de la cinta sea aleatoria y la cinta se mantenga en secreto. Las cintas se utilizaban una sola vez. En realidad, se creaban dos idénticas copias de cada cinta, una para el cifrado y otra para el descifrado.

Página 2 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

Figura 2: Cifrado de Vernam2

El operador XOr permite obtener el caracter original si se aplica con el caracter codificado y la misma clave que se utilizó para codificarlo. Por lo tanto, el proceso es el mismo, tal como se puede observar en la Figura 3, con la diferencia que en este caso se procesa el texto codificado con la cinta de claves para obtener el texto original.

Figura 3: Descifrado en el método de cifrado Vernam3

2.4. Descifrado de un mensaje basado en la frecuencia de las letras

Una de las técnicas que más se ha utilizado para descifrar mensajes codificados mediante técnicas de sustitución como las descritas anteriormente ha sido el análisis estadístico de los textos. Para ello, se analiza el mensaje para obtener la frecuencia de aparición de las letras y se ordenan de más frecuentes a menos frecuentes (ver Tabla 2).

Esta lista ordenada de caracteres se contrasta con la lista de caracteres ordenadas por frecuencia de uso en el idioma. Esta lista se suele extraer analizando un conjunto de do-

2La figura está cogida de http://www.cryptomuseum.com/crypto/vernam.html 3La figura está cogida de http://www.cryptomuseum.com/crypto/vernam.html

Página 3 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

c j s e g f n a z u r b l t x q i p o k w y h v d m 35 33 28 27 25 24 23 19 18 17 16 15 14 12 11 10 9 8 7 6 5 4 3 2 1 0

Tabla 2: Tabla de frecuencia de caracteres ordenada de mayor a menor frecuencia extraída del texto codificado

cumentos o libros (ver Tabla 3) para determinar por qué caracter se debe reemplazar cada letra del mensaje cifrado. Considerando el ejemplo mostrado, la letra ’c’ del texto cifrado se sustituiría por letra ’e’ (la más frecuente), la letra ’j ’ por la ’a’ y así sucesivamente hasta obtener el texto decodificado.

e a o s n r l i d u c t m b p q y h g v f j z x k w 135 103 98 97 75 74 63 59 48 37 36 35 24 22 21 18 17 16 15 14 9 8 7 6 5 4

Tabla 3: Tabla de frecuencia de caracteres ordenada de mayor a menor frecuencia extraída de un conjunto de documentos

La frecuencia estimada de aparición de las letras es una aproximación, por lo que puede que en el mensaje no sea exactamente la misma. Por lo tanto, probablemente habrá que realizar alguna permuta en el orden de los caracteres de la lista de caracteres obtenida de los textos sin cifrar para poder obtener el texto original. De todas formas, la frecuencia de aparición de los caracteres es una herramienta fundamental para el descifrado de mensajes.

3. Proyecto proporcionado Para facilitar la realización de la práctica se proporciona un proyecto en el que deberéis

llevar a cabo las tareas descritas en la Sección 4. A continuación, se describen los tipos de datos definidos, los subprogramas y la funcionalidad de comprobación proporcionados en el proyecto.

3.1. Tipos de datos

Para la representación de listas de palabras en general y un diccionario en particular, se ha definido el tipo de datos ListaPalabras que se muestra a continuación.

Listado 1: Implementación del tipo de datos ListaPalabras /** * Este tipo de datos permite almacenar una lista de palabras */

public class ListaPalabras { public int numPalabras; public String listaPalabras [];

}

Página 4 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

3.2. Subprogramas proporcionados

El proyecto proporciona los subprogramas que se describen a continuación y que está definida en el fichero FuncionalidadDiccionario.java.

3.2.1. Cargar un diccionario

La función cargarDiccionario devuelve una lista de palabras que representa el diccionario que se utiliza para comprobar si el texto descifrado es correcto o no.

Listado 2: Función cargarDiccionario public static ListaPalabras cargarDiccionario () {}

3.2.2. Añadir una palabra a una lista de palabras

La función addPalabraListaPalabras añade una palabra a una lista de palabras.

Listado 3: Función addPalabraListaPalabras public static void addPalabraListaPalabras(String pWord ,

ListaPalabras pDict) {}

3.2.3. Comprobar si una palabra está en una lista de palabras

La función estaEnListaPalabras comprueba si una palabra está en una lista de palabras o no.

Listado 4: Función estaEnListaPalabras public static boolean estaEnListaPalabras(String pWord , ListaPalabras

pDict) {}

3.2.4. Obtener la lista de palabras de un texto

La función obtenerListaPalabras devuelve la lista de palabras de un texto. La función, para limitar el tamaño de la lista devuelta, filtra las palabras repetidas.

Listado 5: Función obtenerListaPalabras public static ListaPalabras obtenerListaPalabras(String pText) {}

Página 5 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

3.3. Funcionalidad de comprobación

El proyecto incluye programas de prueba que comprueban que los subprogramas desarro- llados funcionan adecuadamente. Estos programas de prueba ejecutan cada uno de los sub- programas con distintos datos y comprueban que los resultados son los esperados, mostrando de manera visual el nivel de corrección de los subprogramas (considerando los resultados, no la calidad del código o el diseño).

Nota: para ejecutar los programas de prueba debes

1. Pinchar con el botón derecho del ratón sobre el proyecto

2. Seleccionar la opción Run as del menú

3. Pinchar en la opción JUnit test

4. Tareas En este proyecto se deben diseñar e implementar las técnicas de cifrado y descrifrado

de mensajes descritas en la Sección 2 así como los tipos de datos que fueran necesarios para ello. Para desarrollar las técnicas que se piden, hay que completar el fichero AlgoritmosCi- frado.java. A continuación, se describen con más detalle los subprogramas a desarrollar.

4.1. Descifrar mensajes en Lenguaje Hacker

La función descifrarLenguajeHacker (Listado 6), dado un mensaje codificado en Lenguaje Hacker, devuelve el mensaje decodificado.

Listado 6: Función descifrarLenguajeHacker public static String descifrarLenguajeHacker(String pText) {

// TODO: completar el subprograma }

4.2. Cifrar y descifrar mensajes utilizando el Cifrado César

La función cifrarMetodoCaesar (Listado 7), dados un mensaje y un valor entero que representa el desplazamiento, devuelve el mensaje codificado utilizando el cifrado César.

Página 6 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

Listado 7: Función cifrarMetodoCaesar public static String cifrarMetodoCaesar(String pText , int pDespl) {

// TODO: completar }

La función descifrarMetodoCaesar (Listado 8) realiza el proceso inverso, dado un mensaje codificado y el desplazamiento, obtiene el mensaje decodificado.

Listado 8: Función descifrarMetodoCaesar public static String descifrarMetodoCaesar(String pText , int pDespl) {

// TODO: completar el subprograma }

4.3. Cifrado Vernam

La función cifrarDescifrarMetodoVernam (Listado 9) implementa el método de cifrado simétrico de Vernam. Dados un texto y generador de números aleatorios codifica/descodifica el mensaje aplicando el operador booleano XOr (ver Sección 2.3).

Listado 9: Función cifrarDescifrarMetodoVernam public static String cifrarDescifrarMetodoVernam(String pText , Random

pKeyGen) { // TODO: completar

}

4.4. Descifrado de ménsajes basado en la frecuencia de las letras

La función descifrarSegunFrecuenciaCaracteres (Listado 10) descifra el texto que recibe como parámetro basándose en las frecuencias de aparición de las letras. En los análisis realizados sobre distintos documentos se ha observado que presentan alguno de los caracteres ordenados de más frecuentas e menos frecuentes suelen seguir alguno de los ordenes que se muestran a continuación:

e a o s n r l i d u c t m b p q y h g v f j z x k w

e a t o h r n d s l i w y u g c m f b p k v x j q z

a e o s n l r i d u c m t p b y q g h v j z f x k w

Para simplificar el problema, se asume que los textos están en minúsculas y no se utilizan tildes ni el caracter ’ñ’. Este método comprueba las distintas listas ordenadas de caracteres para descifrar el mensaje y obtener un texto correcto, es decir, un texto en el que todas las palabras que lo componen aparecen recogidas en el diccionario. Si no se puede descifrar el mensaje, el método devuelve la cadena de texto “##Texto no descifrado##”.

Página 7 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

Listado 10: Función descifrarSegunFrecuenciaCaracteres public static String descifrarSegunFrecuenciaCaracteres(String pText) {

// TODO: completar }

La función que se muestra en el Listado 11 descifra un mensaje utilizando como referencia una lista de caracteres que representa el orden respecto a la frecuencia con la que aparecen los caracteres en los textos. El resultado en este caso podría ser un texto no adecuado.

Listado 11: Función descifrarSegunFrecuenciaCaracteres public static String descifrarSegunFrecuenciaCaracteres(String pText ,

char[] pOrdenCar) { // TODO: completar

}

Para verificar que un texto es correcto hay que utilizar el subprograma esTextoCorrecto (Listado 12), que está definido en el fichero FuncionalidadDiccionario.java y cuya implemen- tación hay que completar. Este subprograma, dados un texto y una lista de palabras que representa un diccionario, devuelve verdadero si todas las palabras del texto están recogidas en el diccionario y falso en caso contrario.

Listado 12: Función esTextoCorrecto public static boolean esTextoCorrecto(String pText , ListaPalabras

pDic) { // TODO: Completar este subprograma

}

5. Evaluación Para la evaluación de la práctica se aplicarán los siguientes criterios:

La práctica debe incluir los diseños de los subprogramas desarrollados. Toda práctica que carezca de los algoritmos, tendrá 0 como calificación.

Los diseños se deben corresponder con la implementación proporcionada. Si los algo- ritmos presentados en la documentación no corresponden a los subprogra- mas implementados, la práctica tendrá 0 como calificación.

La práctica debe funcionar adecuadamente. Se proporcionan programas de prueba para que lo verifiquéis. Toda práctica con errores de compilación o que no realice lo que se pide, tendrá una calificación de 0.

Página 8 de 9

Grado en Ing. Informática de Gestión y Sist. de Información

Programación Básica Práctica

Las prácticas son individuales. Podéis comentar los métodos para realizar las ope- raciones solicitadas, pero si se detectan prácticas copiadas la calificación será 0.

Se valorará la calidad de la solución propuesta, considerando los subprogramas identi- ficados.

Se valorarán la claridad del algoritmo y del código, así como la documentación del proyecto.

6. Documentación a entregar Se debe subir a eGela un archivo comprimido que contenga el proyecto (con la imple-

mentación de la práctica y la documentación del código) y un documento con los algoritmos de los suprogramas implementados.

Fecha de entrega: 8 de Enero

Página 9 de 9

No hay comentarios
Esta solo es una vista previa
3 páginas mostradas de 9 páginas totales
Descarga el documento