Minicriptografía


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



  1. import cs1.Keyboard;
  2.    import java.io.*;
  3.    import java.util.*;
  4.    @SuppressWarnings("unchecked")
  5.    
  6.    public class  MiniCriptografia{
  7.       static String charMin = "abcdefghijklmnopqrstuvwxyz";
  8.       static String charMay = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  9.      
  10.       public static String llegeixMissatge(String ruta){
  11.          String lectura ="";
  12.        
  13.              
  14.          BufferedReader entrada;
  15.          int num;
  16.          String linea;
  17.          try {
  18.             FileReader fr = new FileReader(ruta);  // Ruta lògica de l'arxiu que volem llegir
  19.             entrada = new BufferedReader(fr);  num=1;      
  20.          
  21.             while((linea = entrada.readLine()) != null)                 // Mentre trobi linees en l'arxiu
  22.             {
  23.                lectura= lectura  +linea;             // Mostra la linia per pantalla
  24.                num++;
  25.             }  
  26.             entrada.close();
  27.          }
  28.             catch(java.io.FileNotFoundException fnfex) {
  29.                System.out.println("El archivo no ha sido encontrado: " + fnfex);}
  30.             catch(java.io.IOException ioex) {}
  31.          return lectura;
  32.       }
  33.    
  34.       public static void imprimeix(String xifrat, String desxifrat){
  35.          
  36.          System.out.println ("Text xifrat: " + xifrat);
  37.          System.out.println ("Text desxifrat: "+desxifrat);
  38.       }
  39.       public static int clau(String missatge){
  40.       /*desplaçament = ( longitud_missatge %  4 ) +1*/
  41.          int desplasament=0;
  42.          desplasament = (missatge.length()%4)+1;
  43.          return desplasament;
  44.       }
  45.       public static boolean c_especial(char lletra){
  46.          if( (charMin.indexOf(lletra) != -1) || (charMay.indexOf(lletra) != -1)){
  47.             return true;
  48.          }
  49.          else{
  50.             return false;
  51.          }
  52.       }
  53.       public static boolean isNumeric(String str)  //funcion para revisar si es numerico de internet
  54.       {  
  55.          try  
  56.          {  
  57.             double d = Double.parseDouble(str);  
  58.          }  
  59.             catch(NumberFormatException nfe)  
  60.             {  
  61.                return false;  
  62.             }  
  63.          return true;  
  64.       }
  65.       public static String xifra(String missatge, int despl){
  66.          String salida = "";
  67.        
  68.          for(int i = 0;i<missatge.length();i++){
  69.             if (i==17){
  70.                String test="";
  71.             }
  72.             if(c_especial(missatge.charAt(i))) {
  73.                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());
  74.             }
  75.             else{
  76.                if (Character.toString(missatge.charAt(i))=="&"){//estem desxifran
  77.                   String ascciNumero="";
  78.                   if (isNumeric(Character.toString(missatge.charAt(i+1)))){
  79.                      i++;
  80.                      ascciNumero=ascciNumero+missatge.charAt(i+1);
  81.                   }
  82.                   if (isNumeric(Character.toString(missatge.charAt(i+2)))){
  83.                      i++;
  84.                      ascciNumero=ascciNumero+missatge.charAt(i+2);
  85.                   }
  86.                   if (isNumeric(Character.toString(missatge.charAt(i+3)))){
  87.                      i++;
  88.                      ascciNumero=ascciNumero+missatge.charAt(i+3);
  89.                      
  90.                   }
  91.                //aqui tindrem el numero final ascciNumero
  92.                   int intAscii=0;
  93.                   intAscii=Integer.valueOf(ascciNumero);
  94.                   salida= Character.toString((char)(intAscii));
  95.                
  96.                }
  97.                else{
  98.                   int Ascii=0;
  99.                   Ascii=(int) missatge.charAt(i);
  100.                   salida += "&"+ Ascii;  
  101.                }
  102.                            
  103.             }
  104.          }
  105.          return salida;
  106.        
  107.       }
  108.       public static void Guardar(String ruta, String texto ){
  109.       //ruta= D:\hola.txt  
  110.          //GUARDEM EL NOU FITXER
  111.          String s;
  112.          BufferedWriter sortida;
  113.          
  114.        
  115.          try {
  116.            
  117.             FileWriter fw = new FileWriter(ruta , true);
  118.             sortida = new BufferedWriter(fw);
  119.            
  120.             s = texto;        
  121.             sortida.write(s);
  122.          
  123.          
  124.            
  125.             sortida.close();
  126.          }
  127.             catch (IOException e) {
  128.                System.out.println("Se ha producido una excepción al guardar el fichero: "+e);
  129.             }  
  130.      
  131.          
  132.       }
  133.       public static void Comparar (String Ruta1, String Ruta2){
  134.          String strTexto ="", strTexto2;
  135.          strTexto= llegeixMissatge(Ruta1);
  136.          strTexto2= llegeixMissatge(Ruta2);
  137.          if(strTexto.equals(strTexto2)){
  138.             System.out.println ("Los dos ficheros son iguales");      
  139.          }
  140.          else {
  141.             System.out.println ("Los dos ficheros son diferentes ");
  142.          }
  143.       }
  144.      
  145.    
  146.       public static void main(String args[])throws IOException {       
  147.        
  148.          
  149.          Scanner sc = new Scanner(System.in);
  150.          boolean n = false;
  151.          while (== false ){
  152.             System.out.println ("****-Menu-*******************");
  153.             System.out.println ("0] Crear un fichero inicial");
  154.             System.out.println ("1] Cifrar el archivo nom.txt y guardarlo en otro fichero nom_out.txt");
  155.             System.out.println ("2] Descifrar el archivo nom_out.txt y guardarlo en otro fichero nom_in.txt ");
  156.             System.out.println ("3] Mirar por pantalla los arxivos, nom.txt  y  nom_in.txt ");
  157.             System.out.println ("4] Comparar automaticament dos archivos txt y decir si son exactamente iguales o no. ");
  158.             System.out.println ("5] Exit");    
  159.             System.out.println ("*****************************");
  160.          
  161.             int i = Keyboard.readInt();
  162.                
  163.             switch (i){
  164.            
  165.                case 0:
  166.                   System.out.println ("Introduce el texto que desea tener en el archivo txt: ");
  167.                   String texto = Keyboard.readString();
  168.                   System.out.println ("Introduzca la ruta del fichero: ");
  169.                   String Ruta = Keyboard.readString();
  170.                
  171.                   Guardar (Ruta, texto);
  172.                   System.out.println("Fichero guardado");
  173.                  
  174.                   break;
  175.                    
  176.                case 1 :
  177.                   String cadena="";
  178.                   String  salida = "";
  179.                   int desplasament = 0;                  
  180.                   System.out.println("Introduzca la ruta y el nombre del archivo: (D:\\textoaCifrar.txt)");
  181.                   String ruta = Keyboard.readString();
  182.                
  183.                   cadena = llegeixMissatge (ruta);
  184.                   desplasament=clau(cadena);
  185.                   salida= xifra(cadena,desplasament);
  186.                   ruta = ruta.replace(".txt""_out.txt");     
  187.                   Guardar (ruta, salida);
  188.                   imprimeix (salida,cadena);
  189.                
  190.                   System.out.println ("Desplazamiento: " + desplasament);
  191.                   break;
  192.                  
  193.                case 2 :
  194.                   //descifrar es hacerlo = pero el deplaçament tiene que ser *-1= negativo
  195.                   cadena="";
  196.                   salida = "";
  197.                   desplasament = 0;                  
  198.                   System.out.println("Introduzca la ruta y el nombre del archivo: (D:\\textoaDescifrar.txt)");
  199.                   ruta = Keyboard.readString();
  200.                   cadena = llegeixMissatge (ruta);//xifrat
  201.                   desplasament=clau(cadena);
  202.                   System.out.println ("Desplazamiento: " + desplasament);
  203.                  //sumem l'abecedari per desxifrar
  204.                   desplasament=charMin.length()-desplasament;
  205.                   salida= xifra(cadena,desplasament);//desxifrat                       
  206.                   imprimeix (cadena, salida);
  207.                   ruta = ruta.replace("_out.txt""_in.txt");  
  208.                   Guardar (ruta, salida);
  209.                  
  210.                   break;
  211.            
  212.            
  213.                case 3 :
  214.                   //3] Vuere per pantalla els arxius, nom.txt  i  nom_in.txt
  215.                   String srtTexto1="", StrTexto2="";
  216.                   System.out.println("Introduzca la ruta y el nombre del archivo: (D:\\textoaDescifrar.txt)");
  217.                   String strRuta= Keyboard.readString();
  218.                   srtTexto1= llegeixMissatge(strRuta);
  219.                   System.out.println ("Texto ("+strRuta+"): " + srtTexto1);
  220.                   strRuta= strRuta.replace (".txt""_in.txt");
  221.                   StrTexto2= llegeixMissatge(strRuta);
  222.                   System.out.println ("Texto in ("+strRuta+"): " + StrTexto2);
  223.                   break;
  224.                
  225.                
  226.                case 4 :
  227.                   String Ruta1, Ruta2;
  228.                   System.out.println ("Introduzca la ruta del primer fichero por pantalla(D:\\fichero1.txt): ");
  229.                   Ruta1= Keyboard.readString();
  230.                   System.out.println ("Introduce la ruta  del segundo fichero por pantalla(D:\\fichero2.txt): ");
  231.                   Ruta2= Keyboard.readString();  
  232.                   Comparar (Ruta1, Ruta2);
  233.                  
  234.                    
  235.                   break;
  236.            
  237.            
  238.                case 5 :
  239.                   n = true;
  240.                   break;
  241.            
  242.            
  243.            
  244.            
  245.             }
  246.          }
  247.       }
  248.    }

No hay comentarios:

Publicar un comentario