Autor Tema: cifrado de vigenere java con lectura y escritura en archivos txt  (Leído 10906 veces)

pinalo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola que tal, un saludo, tengo un pequeño atasco, este es un proyecto de cifrado de Vigenere, el cual cifra y descifra, pero mi profesor quiere que también lea y escriba desde .txt, no se como podría incoorporarlo, me comento que con BufferReader y BufferWriter lo hacia, y al parecer en mi código con el import.java.io*  importe ya todo, pero no se como hacerle para que leea un archivo TXT, alguien podría ayudarme,
Grracias   :)

Este es el codigo completo !
Código: [Seleccionar]
/**
 * @author Luis Enrique Piña Juárez
 */

import java.io.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Vigenere {
   
    char [][]matriz=new char [26][26];
    String criptograma=null;
   
    /**
     * Metodo constructor
     * entrada:ninguna
     * salida:ninguna
     * descripcion:inicializa una matriz cuadrada de n X n donde n es la cantidad de letras
     * que estemos ocupando para nuestro alfabeto
     */
   
    public Vigenere()
    {
        int codigo=65;//valor de la A mayuscula
        int interno=0;
       
        //empezamos a llenar por renglones
        for(int i=0;i<26;i++)
        {
            //con interno llenaremos los renglones y con codigo las columnas
            interno=codigo;
           
            //Nuestro alfabeto tendra  26 letras
            for(int j=0;j<26;j++)
            {
                matriz[i][j]=(char)interno;
                interno++;
                //preguntamos si llegamos a la Z
                if(interno>90)
                {
                    //SI es asi regresa y comienza de nuevo con A
                    interno=65;
                }
            }
           
            codigo++;
            //Preguntamos si llegamos a la Z
            if(codigo>90)
            {
                //SI es asi regresa y comienza con la A
                codigo=65;
            }
        }
    }
   
    /**
     *Funcion quitaEspacios
     *entrada:una cadena de texto
     *salida:una cadena de texto
     *descripcion:Funcion que nos quita los espacios en blanco,se ingresa una cadena problema
     *que contiene espacios en blanco y devuelve una cadena problema sin espacios en blanco
     */
    String quitaEspacios(String problema)
    {
        char []auxiliar=problema.toCharArray();
        problema="";
        for(int i=0;i<auxiliar.length;i++)
        {
            if(auxiliar[i]!=' ')
            {
                problema+=auxiliar[i];
               
            }
        }
        return problema;
    }
   
    /**
     * Funcion completa
     */
   
    public String completa(String faltante,int tamano)
    {
        int diferencia=0,indice=0;
        if(faltante.length()!=tamano)
        {
            //preguntamos si es menor la clave al mensaje
            if(faltante.length()<tamano)
            {
                //Tenemos que acompletar
                //obtenemos la diferencia
                diferencia=tamano-faltante.length();
                while(diferencia!=0)
                {
                    faltante+=faltante.charAt(indice);
                    //preguntamos si es el final de la cadena
                    if(indice==(faltante.length()-1))
                    {
                        indice=-1;
                    }
                    indice++;
                    diferencia--;
                }
            }
            else
            {
                //Tenemos que acortar
                //obtenemos lo que nos sobra
                diferencia=faltante.length()-tamano;
                //cortamos la cadena
                faltante=faltante.substring(0, faltante.length()-diferencia);
            }
        }
        return faltante;
    }
   
    /**
     * Funcion getCaracter
     * entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
     * conforma el mensaje,el segundo representa la k-esima que conforma al clave
     * salida:un argumento de tipo char,que representa la interseccion entre las columnas
     * del mensaje y de la clave
     * descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
     * los renglones el argumento clave y obtiene su posicion en base a eso identfica
     * el caracter y lo retorna
     */
   
    char getCaracter(char mensaje,char clave)
    {
        //variables auxiliares
        int posicionMensaje=0,posicionClave=0,indice=0;
        boolean encontrado=false;
       
        //buscamos el caracter del mensaje en la columna del criptograma
        while(indice<26 && encontrado==false)
        {
            if(matriz[0][indice]==mensaje)
            {
                encontrado=true;
                posicionMensaje=indice;
            }
           
            indice++;
        }
        encontrado=false;
        indice=0;
        //buscamos el caracter en el renglon de las claves
        while(indice<26 && encontrado==false)
        {
            if (matriz[indice][0]==clave)
            {
                encontrado=true;
                posicionClave=indice;
            }
            indice++;
        }
        //Nos aseguramos que hayamos obtenido algun resultado
        return matriz[posicionClave][posicionMensaje];
    }
   
    /**
     * Metodo cifra
     * entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
     * segundo la clave que se usara
     * salida:una cadena que representa el criptograma
     * descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
     */
   
    public String cifra(String mensaje,String clave)
    {
        criptograma=" ";
        //Quitamos espacios en blanco de la clave y del mensaje
        mensaje=quitaEspacios(mensaje);
        clave=quitaEspacios(clave);
       
        //Convertimos a mayusculas el mensaje y la clave
        mensaje=mensaje.toUpperCase();
        clave=clave.toUpperCase();
       
        //Completamos el tamano de la clave al tamano del mensaje
        clave=completa(clave,mensaje.length());
       
        //aplicamos el algoritmo de Vigenere
        for(int i=0;i<mensaje.length();i++)
        {
            //Obtenemos el caracter segun la matriz de vigenere
            //que es la interseccion de la columna del mensaje y la columna
            //de las claves y la concatenamos con el criptograma
            criptograma+=getCaracter(mensaje.charAt(i),clave.charAt(i));
        }
       
       
        return criptograma;
    }//fin del metodo cifra
   
    /**
     * Funcion getCaracter
     * entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
     * conforma el mensaje,elsegundo representa la k-esima que conforma la clave
     * salida:un argumento de tipo char,que representa la interseccion entre las columnas
     * del mensaje y de la clave
     * descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
     * los renglones el argumento clave y obtiene su posicion en base a eso identfica
     * el caracter y lo retorna
     */
   
    char getCaracterDescifrado(char cripto,char clave)
    {
        //variables auxiliares
        int posicionMensaje=0,posicionClave=0,indice=0;
        boolean encontrado=false;
       
        //buscamos el caracter del mensaje en la columna del criptograma
        while(indice<26 && encontrado==false)
        {
            if(matriz[0][indice]==clave)
            {
                encontrado=true;
                posicionClave=indice;
            }
           
            indice++;
        }
        encontrado=false;
        indice=0;
        //buscamos el caracter en el renglon de las claves
        while(indice<26 && encontrado==false)
        {
            if (matriz[indice][posicionClave]==cripto)
            {
                encontrado=true;
                posicionMensaje=indice;
            }
            indice++;
        }
        //Nos aseguramos que hayamos obtenido algun resultado
        return matriz[0][posicionMensaje];
    }
   
    /**
     * Metodo descifra
     * entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
     * segundo la clave que se usara
     * salida:una cadena que representa el criptograma
     * descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
     */
   
    public String descifra(String mensaje,String clave){
        criptograma=" ";
        //Quitamos espacios en blanco de la clave y del mensaje
        mensaje=quitaEspacios(mensaje);
        clave=quitaEspacios(clave);
       
        //Convertimos a mayusculas el mensaje y la clave
        mensaje=mensaje.toUpperCase();
        clave=clave.toUpperCase();
       
        //Completamos el tamano de la clave al tamano del mensaje
        clave=completa(clave,mensaje.length());
       
        //aplicamos el algoritmo de Vigenere
        for(int i=0;i<mensaje.length();i++)
        {
            //Obtenemos el caracter segun la matriz de vigenere
            //que es la interseccion de la columna del mensaje y la columna
            //de las claves y la concatenamos con el criptograma
            criptograma+=getCaracterDescifrado(mensaje.charAt(i),clave.charAt(i));
        }
       
       
        return criptograma;
    }//fin del metodo cifra
   
    /****************************************************/
   
    public static void main(String[] args)  throws IOException {
        // TODO Auto-generated method stub
       
        //try{
        int op;
        do{
            InputStreamReader teclado=new InputStreamReader(System.in);
            BufferedReader buffer=new BufferedReader(teclado);
            /**
             * Variables auxiliares para interactuar con el usuario
             **/
            String mensaje_claro;
            String clave;
           
           
            System.out.println("Elige una opcion");
            System.out.println("1:-cifrar");
            System.out.println("2:-descifrar");
           
            op=Integer.parseInt(buffer.readLine());
            switch(op){
                case(1):
                    System.out.println("Introduzca el mensaje a cifrar: ");
                    mensaje_claro=buffer.readLine();
                    mensaje_claro=mensaje_claro.trim();
                    System.out.println("Introduzca la llave: ");
                    clave=buffer.readLine();
                    Vigenere metodo=new Vigenere();
                    System.out.println("criptograma:"+metodo.cifra(mensaje_claro,clave));
                    break;
                case 2:
                    System.out.println("Introduzca el criptograma");
                    mensaje_claro=buffer.readLine();
                    mensaje_claro=mensaje_claro.trim();
                    System.out.println("Introduzca la llave");
                    clave=buffer.readLine();
                   
                    // Instanciacion de la clase
                    Vigenere metodo1=new Vigenere ();
                   
                    System.out.println("Mcla:"+metodo1.descifra(mensaje_claro,clave));
                    break;
                default:
                    System.out.print("Seleccion incorrecta" );
                   
            }
        }while(op !=2);
    }
   
   
   
   
}
« Última modificación: 12 de Octubre 2014, 19:55 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:cifrado de vigenere java con lectura y escritura en archivos txt
« Respuesta #1 en: 12 de Octubre 2014, 20:01 »
Hola, el uso de lectura y escritura desde archivos txt con Java no es demasiado complicado, aunque si es la primera vez que se hace sí puede resultar un poco lío ::)

Pienso que viendo este ejemplo puedas incorporar el tratamiento con archivos sin demasiadas complicaciones:

https://www.aprenderaprogramar.com/foros/index.php?topic=712

Si además de este quieres ver otra explicación que también es buena tienes esta:

https://www.aprenderaprogramar.com/foros/index.php?topic=1154

Creo que con esto puedes intentarlo, si escribiendo el código hay algo que no te salga pega el código y trataremos de revisarlo para decirte dónde está el problema.

Saludos

pinalo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:cifrado de vigenere java con lectura y escritura en archivos txt
« Respuesta #2 en: 16 de Octubre 2014, 01:35 »
Según Yo me quedo así  :(
Pero me da una excepción,
y lo peor es que es para hoy D:

Código: [Seleccionar]
/**
 * @author Luis Enrique Piña Juárez
 */

import java.io.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
public class Vigenere {
   
    char [][]matriz=new char [26][26];
    String criptograma=null;
   
    /**
     * Metodo constructor
     * entrada:ninguna
     * salida:ninguna
     * descripcion:inicializa una matriz cuadrada de n X n donde n es la cantidad de letras
     * que estemos ocupando para nuestro alfabeto
     */
   
    public Vigenere(){
        int codigo=65;//valor de la A mayuscula
        int interno=0;
       
        //empezamos a llenar por renglones
        for(int i=0;i<26;i++){
            //con interno llenaremos los renglones y con codigo las columnas
            interno=codigo;
           
            //Nuestro alfabeto tendra  26 letras
            for(int j=0;j<26;j++){
                matriz[i][j]=(char)interno;
                interno++;
                //preguntamos si llegamos a la Z
                if(interno>90){
                    //SI es asi regresa y comienza de nuevo con A
                    interno=65;
                }
            }
           
            codigo++;
            //Preguntamos si llegamos a la Z
            if(codigo>90){
                //SI es asi regresa y comienza con la A
                codigo=65;
            }
        }
    }
   
    /**
     *Funcion quitaEspacios
     *entrada:una cadena de texto
     *salida:una cadena de texto
     *descripcion:Funcion que nos quita los espacios en blanco,se ingresa una cadena problema
     *que contiene espacios en blanco y devuelve una cadena problema sin espacios en blanco
     */
    String quitaEspacios(String problema){
        char []auxiliar=problema.toCharArray();
        problema="";
        for(int i=0;i<auxiliar.length;i++){
            if(auxiliar[i]!=' '){
                problema+=auxiliar[i];
                }
        }
        return problema;
    }
   
    /**
     * Funcion completa
     */
   
    public String completa(String faltante,int tamano){
        int diferencia=0,indice=0;
        if(faltante.length()!=tamano){
            //preguntamos si es menor la clave al mensaje
            if(faltante.length()<tamano){
                //Tenemos que acompletar
                //obtenemos la diferencia
                diferencia=tamano-faltante.length();
                while(diferencia!=0){
                    faltante+=faltante.charAt(indice);
                    //preguntamos si es el final de la cadena
                    if(indice==(faltante.length()-1)){
                        indice=-1;
                    }
                    indice++;
                    diferencia--;
                }
            }
            else{
                //Tenemos que acortar
                //obtenemos lo que nos sobra
                diferencia=faltante.length()-tamano;
                //cortamos la cadena
                faltante=faltante.substring(0, faltante.length()-diferencia);
            }
        }
        return faltante;
    }
   
    /**
     * Funcion getCaracter
     * entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
     * conforma el mensaje,el segundo representa la k-esima que conforma al clave
     * salida:un argumento de tipo char,que representa la interseccion entre las columnas
     * del mensaje y de la clave
     * descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
     * los renglones el argumento clave y obtiene su posicion en base a eso identfica
     * el caracter y lo retorna
     */
   
    char getCaracter(char mensaje,char clave){
        //variables auxiliares
        int posicionMensaje=0,posicionClave=0,indice=0;
        boolean encontrado=false;
       
        //buscamos el caracter del mensaje en la columna del criptograma
        while(indice<26 && encontrado==false){
            if(matriz[0][indice]==mensaje){
                encontrado=true;
                posicionMensaje=indice;
            }
           
            indice++;
        }
        encontrado=false;
        indice=0;
        //buscamos el caracter en el renglon de las claves
        while(indice<26 && encontrado==false){
            if (matriz[indice][0]==clave){
                encontrado=true;
                posicionClave=indice;
            }
            indice++;
        }
        //Nos aseguramos que hayamos obtenido algun resultado
        return matriz[posicionClave][posicionMensaje];
    }
   
    /**
     * Metodo cifra
     * entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
     * segundo la clave que se usara
     * salida:una cadena que representa el criptograma
     * descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
     */
   
    public String cifra(String mensaje,String clave){
        criptograma=" ";
        //Quitamos espacios en blanco de la clave y del mensaje
        mensaje=quitaEspacios(mensaje);
        clave=quitaEspacios(clave);
       
        //Convertimos a mayusculas el mensaje y la clave
        mensaje=mensaje.toUpperCase();
        clave=clave.toUpperCase();
       
        //Completamos el tamano de la clave al tamano del mensaje
        clave=completa(clave,mensaje.length());
       
        //aplicamos el algoritmo de Vigenere
        for(int i=0;i<mensaje.length();i++){
            //Obtenemos el caracter segun la matriz de vigenere
            //que es la interseccion de la columna del mensaje y la columna
            //de las claves y la concatenamos con el criptograma
            criptograma+=getCaracter(mensaje.charAt(i),clave.charAt(i));
        }
       
       
        return criptograma;
    }//fin del metodo cifra
   
    /**
     * Funcion getCaracter
     * entrada:dos argumentos,el primero de tipo char que representa la i-esima letra que
     * conforma el mensaje,elsegundo representa la k-esima que conforma la clave
     * salida:un argumento de tipo char,que representa la interseccion entre las columnas
     * del mensaje y de la clave
     * descripcion:busca en las columnas el argumento mensaje y obtiene su posicion,busca en
     * los renglones el argumento clave y obtiene su posicion en base a eso identfica
     * el caracter y lo retorna
     */
   
    char getCaracterDescifrado(char cripto,char clave){
        //variables auxiliares
        int posicionMensaje=0,posicionClave=0,indice=0;
        boolean encontrado=false;
       
        //buscamos el caracter del mensaje en la columna del criptograma
        while(indice<26 && encontrado==false){
            if(matriz[0][indice]==clave){
                encontrado=true;
                posicionClave=indice;
            }
           
            indice++;
        }
        encontrado=false;
        indice=0;
        //buscamos el caracter en el renglon de las claves
        while(indice<26 && encontrado==false){
            if (matriz[indice][posicionClave]==cripto){
                encontrado=true;
                posicionMensaje=indice;
            }
            indice++;
        }
        //Nos aseguramos que hayamos obtenido algun resultado
        return matriz[0][posicionMensaje];
    }
   
    /**
     * Metodo descifra
     * entrada:dos arguementso de tipo string,el primero contiene el mensaje a cifrar y el
     * segundo la clave que se usara
     * salida:una cadena que representa el criptograma
     * descripcion:Cifra una cadena usando la clave con el algoritmod de vigenere
     */
   
    public String descifra(String mensaje,String clave){
        criptograma=" ";
        //Quitamos espacios en blanco de la clave y del mensaje
        mensaje=quitaEspacios(mensaje);
        clave=quitaEspacios(clave);
       
        //Convertimos a mayusculas el mensaje y la clave
        mensaje=mensaje.toUpperCase();
        clave=clave.toUpperCase();
       
        //Completamos el tamano de la clave al tamano del mensaje
        clave=completa(clave,mensaje.length());
       
        //aplicamos el algoritmo de Vigenere
        for(int i=0;i<mensaje.length();i++){
            //Obtenemos el caracter segun la matriz de vigenere
            //que es la interseccion de la columna del mensaje y la columna
            //de las claves y la concatenamos con el criptograma
            criptograma+=getCaracterDescifrado(mensaje.charAt(i),clave.charAt(i));
        }
       
       
        return criptograma;
    }//fin del metodo cifra
   
    /****************************************************/
   
    public static void main(String[] args)  throws IOException {
        // TODO Auto-generated method stub
       
        //try{
        int op;
        do{
            InputStreamReader teclado=new InputStreamReader(System.in);
            BufferedReader buffer=new BufferedReader(teclado);
            /**
             * Variables auxiliares para interactuar con el usuario
             **/
            String otro;
            String clave;
    BufferedReader lector= null;
    PrintWriter escritor= null;
           
           
            System.out.println("Elige una opcion");
            System.out.println("1:-cifrar");
            System.out.println("2:-descifrar");
           
            op=Integer.parseInt(buffer.readLine());
         
    switch(op){
                case 1:
                    System.out.println("Introduzca el nombre del archico que contenga el mensaje a cifrar: ");

    try{
lector= new BufferedReader(new FileReader (args[0]));
escritor= new PrintWriter(new FileWriter (args[1]));
while ((otro= lector.readLine ())!=null){
    escritor.println (otro);
}
    }
    finally{
if(lector!=null){
    lector.close();
}
if(escritor!=null){
    escritor.close();
}
    }
   
    /*mensaje_claro=buffer.readLine();
    mensaje_claro=mensaje_claro.trim();*/
                    System.out.println("Introduzca la llave: ");
                    clave=buffer.readLine();
                    Vigenere metodo=new Vigenere();
                    System.out.println("Criptograma:"+metodo.cifra(otro,clave));
                    break;

                case 2:
                    System.out.println("Introduzca el nombre del archivo que contine el criptograma");

    try{
lector= new BufferedReader(new FileReader (args[0]));
escritor= new PrintWriter(new FileWriter (args[1]));
while ((otro= lector.readLine ())!=null){
    escritor.println (otro);
}
    }
    finally{
if(lector!=null){
    lector.close();
}
if(escritor!=null){
    escritor.close();
}
    }
                    /*mensaje_claro=buffer.readLine();
      mensaje_claro=mensaje_claro.trim();*/
                    System.out.println("Introduzca la llave");
                    clave=buffer.readLine();
                   
                    // Instanciacion de la clase
                    Vigenere metodo1=new Vigenere ();
                   
                    System.out.println("Mensaje claro:"+metodo1.descifra(otro,clave));
                    break;

                default:
                    System.out.print("Seleccion incorrecta" );
                   
            }
        }while(op !=2);
    }
   
   
   
   
}

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:cifrado de vigenere java con lectura y escritura en archivos txt
« Respuesta #3 en: 17 de Octubre 2014, 10:51 »
Hola, el error que me ha saltado al ejecutar es: java.lang.ArrayIndexOutOfBoundsException: 0 at Vigenere.main(Vigenere.java:280)


Eso corresponde a esta parte del código:

Código: [Seleccionar]
    switch(op){
                case 1:
                    System.out.println("Introduzca el nombre del archico que contenga el mensaje a cifrar: ");

    try{
lector= new BufferedReader(new FileReader (args[0]));
escritor= new PrintWriter(new FileWriter (args[1]));


Lo que me extraña aquí es lo siguiente: args[0] y args[1] son parámetros que se le pasan al método main a la hora de invocar la ejecución del programa, es decir, que cuando el programa empieza a ejecutarse ya existen esos datos.

Sin embargo tú estás indicando "Introduzca el nombre del archico que contenga el mensaje a cifrar: "

Si el nombre de archivo lo quieres pasar como parámetro de ejecución del programa no tendrías que pedirlo después, o si lo quieres pedir para que se introduzca por teclado no tendría sentido usar args[0] ni args[1]

Si quieres que se introduzca por teclado el nombre de archivo, tienes que tener en cuenta que si el usuario introduce "datos.txt", ese archivo deberá estar en la misma carpeta donde tienes el código del programa. Si no es así tendrías que poner la ruta completa, por ejemplo C:/Users/Jose/Desktop/datos.txt

Para que sea el usuario quien introduzca el nombre del archivo puedes usar la clase Scanner, aquí tienes un ejemplo de cómo se usa: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=627:pensar-en-objetos-una-entrada-de-teclado-o-consola-en-java-como-objeto-con-campos-y-metodos-cu00661b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Aunque antes de introducir eso yo haría una prueba sencilla: usa un código del tipo FileReader fr = new FileReader("datos.txt"); para crear el FileReader y lo mismo para el FileWriter, prueba el programa así, y si te funciona todo bien luego introduce la entrada de la ruta del fichero a través del teclado.

Saludos

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".