Queremos implementar una aplicación que permita cifrar y descifrar mensajes.
El procedimiento de cifrado que utilizaremos será una variante del algoritmo del César. Este algoritmo consiste en modificar cada letra del mensaje por el equivalente desplazada 3 posiciones en el alfabeto. Así por ejemplo la palabra HOLA después del proceso de cifra se convertiría en KROD. Como puede ver si desplazamos la H 3 posiciones obtenemos la K, de la O la R y así sucesivamente.
A B C D E F G H ... X Y Z
D E F G H I J K ... A B C
Tabla de cifra
La variación que aplicaremos respecto al algoritmo del César original consistirá en que el desplazamiento de las posiciones no será fijo, sino que dependerá de la longitud del mensaje a cifrar. En concreto, la fórmula del desplazamiento será la siguiente:
desplazamiento = (longitud_missatge% 4) +1
Nuestra aplicación se implementará en uso de programación modular.
Prototipo que deberá utilizarse:
Funciones / Acciones Uso
String llegeixMissatge (String archivo)
Devuelve todo el contenido a cifrar o descifrar.
Este contenido lo obtendrá desde el archivo especificado en el ajuste archivo
void imprime (String cifrado, String descifrado)
Imprimirá por pantalla los mensajes cifrados y descifrados controlando el ancho de pantalla.
boolean c_especial (char letra)
Dice si letra es un carácter especial (ñ, ó ...).
int clave (String mensaje)
Devuelve el factor de desplazamiento, calculado según la fórmula especificada anteriormente
String cifra (String mensaje, int despl)
Devuelve el mensaje cifrado.
Cifra y devuelve el mensaje contenido en la variable mensaje, según el desplazamiento indicado en despl
String descifra (String mensaje, int despl) Devuelve el mensaje descifrado.
Descifra y devuelve el mensaje contenido en la variable mensaje, según el desplazamiento indicado en despl.
Nuestro programa nos enseñará un menú donde podremos elegir la operación que queremos realizar y posteriormente nos pedirá los datos necesarios. Una vez realizada una operación volverá a mostrar el menú hasta que decidimos salir.
Un ejemplo de funcionamiento del programa podría ser el siguiente:
1. - Cifrar archivo nom.txt y guardarlo en otro archivo nom_out.txt
2. - Descifrar archivo nom_out.txt y guardarlo en otro archivo nom_in.txt
3. - Vuere por pantalla los archivos, nom.txt y nom_in.txt
4. - Comparar automáticamente dos archivos txt y decir si son exactamente iguales o no.
5. - Salir
>> ¿Qué operación desea realizar? 1
Introduce el nombre del archivo: c: \ text.txt
El texto sin cifrar era: HOLA
El texto cifrado es: IPMB
Hemos generado un archivo de salida llamado text_out.txt
1. - Cifrar archivo nom.txt y guardarlo en otro archivo nom_out.txt
2. - Descifrar archivo nom_out.txt y guardarlo en otro archivo nom_in.txt
3. - Vuere por pantalla los archivos, nom.txt y nom_in.txt
4. - Comparar automáticamente dos archivos txt y decir si son exactamente iguales o no.
5. - Salir
>> ¿Qué operación desea realizar? 2
Introduce el nombre del archivo: c: \ text_out.txt
El texto cifrado era: IPMB
El texto descifrado es: HOLA
Hemos generado un archivo de salida llamado text_in.txt
1. - Cifrar archivo nom.txt y guardarlo en otro archivo nom_out.txt
2. - Descifrar archivo nom_out.txt y guardarlo en otro archivo nom_in.txt
3. - Vuere por pantalla los archivos, nom.txt y nom_in.txt
4. - Comparar automáticamente dos archivos txt y decir si son exactamente iguales o no.
5. - Salir
>> ¿Qué operación desea realizar? 3
El archivo nom.txt es:
HOLA
El archivo nom_in.txt es:
HOLA
1. - Cifrar archivo nom.txt y guardarlo en otro archivo nom_out.txt
2. - Descifrar archivo nom_out.txt y guardarlo en otro archivo nom_in.txt
3. - Vuere por pantalla los archivos, nom.txt y nom_in.txt
4. - Comparar automáticamente dos archivos txt y decir si son exactamente iguales o no.
5. - Salir
>> ¿Qué operación desea realizar? 4
(El nombre que entres se comparará automáticamente con nom_in.txt)
Entra el archivo a comparar: nom.txt
El archivo nom.txt es exacto a nom_in.txt / El archivo nom.txt NO es exacto a nom_in.txt
- import cs1.Keyboard;
- import java.io.*;
- import java.util.*;
- @SuppressWarnings("unchecked")
- public class MiniCriptografia{
- static String charMin = "abcdefghijklmnopqrstuvwxyz";
- static String charMay = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- public static String llegeixMissatge(String ruta){
- String lectura ="";
- BufferedReader entrada;
- int num;
- String linea;
- try {
- FileReader fr = new FileReader(ruta); // Ruta lògica de l'arxiu que volem llegir
- entrada = new BufferedReader(fr); num=1;
- while((linea = entrada.readLine()) != null) // Mentre trobi linees en l'arxiu
- {
- lectura= lectura +linea; // Mostra la linia per pantalla
- num++;
- }
- entrada.close();
- }
- catch(java.io.FileNotFoundException fnfex) {
- System.out.println("El archivo no ha sido encontrado: " + fnfex);}
- catch(java.io.IOException ioex) {}
- return lectura;
- }
- public static void imprimeix(String xifrat, String desxifrat){
- System.out.println ("Text xifrat: " + xifrat);
- System.out.println ("Text desxifrat: "+desxifrat);
- }
- public static int clau(String missatge){
- /*desplaçament = ( longitud_missatge % 4 ) +1*/
- int desplasament=0;
- desplasament = (missatge.length()%4)+1;
- return desplasament;
- }
- public static boolean c_especial(char lletra){
- if( (charMin.indexOf(lletra) != -1) || (charMay.indexOf(lletra) != -1)){
- return true;
- }
- else{
- return false;
- }
- }
- public static boolean isNumeric(String str) //funcion para revisar si es numerico de internet
- {
- try
- {
- double d = Double.parseDouble(str);
- }
- catch(NumberFormatException nfe)
- {
- return false;
- }
- return true;
- }
- public static String xifra(String missatge, int despl){
- String salida = "";
- for(int i = 0;i<missatge.length();i++){
- if (i==17){
- String test="";
- }
- if(c_especial(missatge.charAt(i))) {
- salida += (charMin.indexOf(missatge.charAt(i)) != -1) ? charMin.charAt( ((charMin.indexOf(missatge.charAt(i)) )+despl)%charMin.length() ) : charMay.charAt((charMay.indexOf(missatge.charAt(i)) +despl)%charMay.length());
- }
- else{
- if (Character.toString(missatge.charAt(i))=="&"){//estem desxifran
- String ascciNumero="";
- if (isNumeric(Character.toString(missatge.charAt(i+1)))){
- i++;
- ascciNumero=ascciNumero+missatge.charAt(i+1);
- }
- if (isNumeric(Character.toString(missatge.charAt(i+2)))){
- i++;
- ascciNumero=ascciNumero+missatge.charAt(i+2);
- }
- if (isNumeric(Character.toString(missatge.charAt(i+3)))){
- i++;
- ascciNumero=ascciNumero+missatge.charAt(i+3);
- }
- //aqui tindrem el numero final ascciNumero
- int intAscii=0;
- intAscii=Integer.valueOf(ascciNumero);
- salida= Character.toString((char)(intAscii));
- }
- else{
- int Ascii=0;
- Ascii=(int) missatge.charAt(i);
- salida += "&"+ Ascii;
- }
- }
- }
- return salida;
- }
- public static void Guardar(String ruta, String texto ){
- //ruta= D:\hola.txt
- //GUARDEM EL NOU FITXER
- String s;
- BufferedWriter sortida;
- try {
- FileWriter fw = new FileWriter(ruta , true);
- sortida = new BufferedWriter(fw);
- s = texto;
- sortida.write(s);
- sortida.close();
- }
- catch (IOException e) {
- System.out.println("Se ha producido una excepción al guardar el fichero: "+e);
- }
- }
- public static void Comparar (String Ruta1, String Ruta2){
- String strTexto ="", strTexto2;
- strTexto= llegeixMissatge(Ruta1);
- strTexto2= llegeixMissatge(Ruta2);
- if(strTexto.equals(strTexto2)){
- System.out.println ("Los dos ficheros son iguales");
- }
- else {
- System.out.println ("Los dos ficheros son diferentes ");
- }
- }
- public static void main(String args[])throws IOException {
- Scanner sc = new Scanner(System.in);
- boolean n = false;
- while (n == false ){
- System.out.println ("****-Menu-*******************");
- System.out.println ("0] Crear un fichero inicial");
- System.out.println ("1] Cifrar el archivo nom.txt y guardarlo en otro fichero nom_out.txt");
- System.out.println ("2] Descifrar el archivo nom_out.txt y guardarlo en otro fichero nom_in.txt ");
- System.out.println ("3] Mirar por pantalla los arxivos, nom.txt y nom_in.txt ");
- System.out.println ("4] Comparar automaticament dos archivos txt y decir si son exactamente iguales o no. ");
- System.out.println ("5] Exit");
- System.out.println ("*****************************");
- int i = Keyboard.readInt();
- switch (i){
- case 0:
- System.out.println ("Introduce el texto que desea tener en el archivo txt: ");
- String texto = Keyboard.readString();
- System.out.println ("Introduzca la ruta del fichero: ");
- String Ruta = Keyboard.readString();
- Guardar (Ruta, texto);
- System.out.println("Fichero guardado");
- break;
- case 1 :
- String cadena="";
- String salida = "";
- int desplasament = 0;
- System.out.println("Introduzca la ruta y el nombre del archivo: (D:\\textoaCifrar.txt)");
- String ruta = Keyboard.readString();
- cadena = llegeixMissatge (ruta);
- desplasament=clau(cadena);
- salida= xifra(cadena,desplasament);
- ruta = ruta.replace(".txt", "_out.txt");
- Guardar (ruta, salida);
- imprimeix (salida,cadena);
- System.out.println ("Desplazamiento: " + desplasament);
- break;
- case 2 :
- //descifrar es hacerlo = pero el deplaçament tiene que ser *-1= negativo
- cadena="";
- salida = "";
- desplasament = 0;
- System.out.println("Introduzca la ruta y el nombre del archivo: (D:\\textoaDescifrar.txt)");
- ruta = Keyboard.readString();
- cadena = llegeixMissatge (ruta);//xifrat
- desplasament=clau(cadena);
- System.out.println ("Desplazamiento: " + desplasament);
- //sumem l'abecedari per desxifrar
- desplasament=charMin.length()-desplasament;
- salida= xifra(cadena,desplasament);//desxifrat
- imprimeix (cadena, salida);
- ruta = ruta.replace("_out.txt", "_in.txt");
- Guardar (ruta, salida);
- break;
- case 3 :
- //3] Vuere per pantalla els arxius, nom.txt i nom_in.txt
- String srtTexto1="", StrTexto2="";
- System.out.println("Introduzca la ruta y el nombre del archivo: (D:\\textoaDescifrar.txt)");
- String strRuta= Keyboard.readString();
- srtTexto1= llegeixMissatge(strRuta);
- System.out.println ("Texto ("+strRuta+"): " + srtTexto1);
- strRuta= strRuta.replace (".txt", "_in.txt");
- StrTexto2= llegeixMissatge(strRuta);
- System.out.println ("Texto in ("+strRuta+"): " + StrTexto2);
- break;
- case 4 :
- String Ruta1, Ruta2;
- System.out.println ("Introduzca la ruta del primer fichero por pantalla(D:\\fichero1.txt): ");
- Ruta1= Keyboard.readString();
- System.out.println ("Introduce la ruta del segundo fichero por pantalla(D:\\fichero2.txt): ");
- Ruta2= Keyboard.readString();
- Comparar (Ruta1, Ruta2);
- break;
- case 5 :
- n = true;
- break;
- }
- }
- }
- }
No hay comentarios:
Publicar un comentario