martes, septiembre 05, 2006

Cifra de Vigenère versión Java

/**
* El programa obtiene el texto y la clave, elimina los espacios y los pasa a mayúsculas.
* No tiene en cuenta caracteres especiales (ç, ñ, tildes, etc...). Es feo y se podría
* haber hecho mejor... pero esta no es una clase de metodología de programación, ¿no? ;)
*/
package blog.crypto;

public class Vigenere {

    private String eliminarEspacios( String st ) {
        String _st = new String();
        for (int i = 0; i < st.length(); i++) {
            if ( st.charAt(i) != ' ' ) {
                _st += st.charAt(i)+"";
            }
        }
        return _st;
    }
    
    private void execute( String text , String clau ) throws Exception {
        char[] _text = new char[ text.length() ];
        char[] _clau = new char[ _text.length ];
        
        //ciframos el mensaje
        for ( int i = 0 ; i < text.length() ; i++ ) {
            char t = text.charAt(i);
            char c = clau.charAt( i % clau.length() );
            
            int aux = (int)t;
            int aux2 = (int)c;
            aux -= 65;
            aux2 -= 65;
            
            _text[i] = (char)(((aux + aux2) % 26) + 65);
        }
        
        System.out.println("Missatge: " + text);
        System.out.println("Clau: " + clau);
        System.out.print("Criptograma: ");
        
        for (int i = 0; i < _text.length; i++) {
            System.out.print(""+_text[i]);
        }
        
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Vigenere v = new Vigenere();
        try {
            if ( args.length != 2 ) {
                System.out.println("Uso: java blog.crypto.Vigenere \"texto\" clave");
                System.exit(0);
            }
            v.execute( v.eliminarEspacios(args[0]).toUpperCase(), v.eliminarEspacios(args[1]).toUpperCase() );
        }
        catch ( Exception ex ) {
            System.out.println("ERROR:: " + ex.toString());
        }

    }

}

sábado, septiembre 02, 2006

Cifra del César versión Java

/**
* Clase que tiene como parámetro de entrada una frase y como salida la misma
* frase habiéndole aplicado la cifra del César. El programa es funcional teniendo
* en cuenta que se toma como alfabeto aquello que está definido como letra en la
* tabla ASCII (del 65 al 90 letras mayúsculas y del 97 al 122 letras minúsculas).
* El programa no tiene en cuenta letras especiales como a (ç) o la (ñ).
*/
package blog.crypto;

public class Cesar {

    private static final int CESAR = 3;
    
    private void execute( String s ) throws Exception {
        String st = "";
        for ( int i = 0 ; i < s.length() ; i++ ) {
            char c = s.charAt(i);
            if ( !isLletra( c ) ) {
                st += ""+c;
                continue;
            }
            int aux = (int)c;
            if ( isMajuscula(c) ) {
                aux -= 65;
                aux = (aux+CESAR) % 26;
                aux += 65;
            }
            else {
                aux -= 65;
                aux = (aux+CESAR) % 26;
                aux += 65;
            }
            c = (char)aux;
            st += ""+c;
        }
        System.out.println(st);
    }
    
    /**
     * Comprueba si un carácter es una letra
     * @param c
     * @return boolean
     */
    private boolean isLletra( char c ) {
        return (c >= 65 && c <=90) || (c >= 97 && c <= 122);
    }
    
    /**
     * Comprueba si una letra es mayúscula
     * @param c
     * @return boolean
     */
    private boolean isMajuscula( char c ) {
        return (c >= 65 && c <=90);
    }

    public static void main(String[] args) {
        Cesar c = new Cesar();
        try {
            if ( args.length != 1 ) {
                System.out.println("Uso: java blog.crypto.Cesar \"frase\"");
                System.exit(0);
            }
            c.execute( args[0] );
        }
        catch ( Exception ex ) {
            System.out.println("ERROR:: " + ex.toString());
        }
        
    }
}