Cifrado por sustitución – 1

22 10 2009

Hola parceros, bueno luego de terminar la solución del reto de yashira “Trial Version”, aqui expongo el código que use para tal reto. Adicional a esto pues me pareció muy interesante la forma de cifrar y descifrar datos =).

Si pueden observar el código tiene cositas adicionales, como un menú, lee un archivo “entrada.txt” y arroja una “salida.txt”. No siendo más ahora si vamos a la acción :) . He colocado algunos comentarios documentando el código, sin embargo creo que esta muy claro ;)

/****
 *  msg : /&4=91 5)?1= 5$35==14& 5$ {$1 31)31=1 45 ${5+ - )5$?9=m5 =5- 45 {$ 5)/139& 9$69$9?&
 *  @description : Reto para yashira
 *  @author       :  D-m-K
 ***/

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;

public class TrialRamon {
    //Miembros de clase

    static BufferedReader br;
    //Patron de cadenas para cifrar y descifrar
    public final static String str1 = "1234567890!#$%&/(=)?{¡@*-+";
    public final static String str2 = "abcdefghijklnñopqrstuvwxyz";
    public static File fe;
    public static boolean abierto;

    //Main :P
    public static void main(String[] args) throws IOException {
        //Instacio y defino los datos de entrada
        fe = new File("entrada.txt");
        BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
        int op;
        do{
            System.out.println(" 1. Cifrar datos");
            System.out.println(" 2. Descifrar datos");
            System.out.println(" 3. Salir :P ");
            System.out.print("    Opcion >>");
            op = Integer.parseInt(entrada.readLine());
            //Evaluo la opcion ingresada
            switch(op){
                case 1:
                    Criptar();
                    break;
                case 2:
                    DesCriptar();
                    break;
                case 3:
                    System.out.println("Hasta luego!");
                    System.exit(0);
                    break;
            }
        }while(op != 3);
    }

    //Codifico los datos del fichero de entrada
    public static void Criptar() throws IOException {
        //Evaluo si el fichero pudo ser abierto
        if(fe.exists()){
            br = new BufferedReader(new FileReader(fe));
            abierto = true;
        }else{
			System.out.println("El archivo no existe");
		}
        if(abierto){
            //Creo el fichero de salida
            PrintWriter out = new PrintWriter(new FileWriter("salida.txt"));
            //Realizo el cifrado de los datos
            String linea = "";
            while ((linea = br.readLine()) != null) {
                System.out.println(linea);
                for (int i = 0; i < str1.length(); i++) {
                    linea = linea.toLowerCase();
                    linea = linea.replace(str2.charAt(i), str1.charAt(i));
                }
                System.out.println(linea);
                //Escribo la linea cifrada en el archivo
                out.println(linea);
            }
            //Aseguro los datos de salida y cierro los ficheros
            br.close();
            out.flush();
            out.close();
        }else{
            System.out.println("\n ERROR : El archivo no pudo ser abierto");
        }
        System.out.println("leyendo");
    }

    //Decodifica los datos del fichero de entrada
    public static void DesCriptar() throws IOException{
    //Evaluo si el fichero pudo ser abierto
        if(fe.exists()){
            br = new BufferedReader(new FileReader(fe));
            abierto = true;
        }else{
			System.out.println("El archivo no existe");
		}
        if(abierto){
            //Creo el fichero de salida
            PrintWriter out = new PrintWriter(new FileWriter("salida.txt"));
            //Realizo el cifrado de los datos
            String linea = "";
            while ((linea = br.readLine()) != null) {
                System.out.println(linea);
                for (int i = 0; i < str1.length(); i++) {
                    linea = linea.toLowerCase();
                    linea = linea.replace(str1.charAt(i), str2.charAt(i));
                }
                System.out.println(linea);
                //Escribo la linea cifrada en el archivo
                out.println(linea);
            }
            //Aseguro los datos de salida y cierro los ficheros
            br.close();
            out.flush();
            out.close();
        }else{
            System.out.println("\n ERROR : El archivo no pudo ser abierto");
        }
        System.out.println("leyendo");
    }
}

Hakuna Matata! Greetings to all and happy bandwidth.





.:: Cifrando con Cesar [ROT3 o ROT13] ::.

31 10 2008

Aburrido cierto dia y con un poco de curiosidad sobre el tema de la criptografia, me surgio la duda de la composición del cifrado de Cesar o el famoso ROT13 (Usado en los BBS y algunos foros para ocultar mensajes, que ante un publico normal no son nada legibles).

Basicamente el algoritmo de Cesar (origalmente ROT3, por la ROTación de 3 letras del alfabeto) es un cifrado que mueve N cantidad de veces una letra dentro de las 26 letras que lo componen. Por ejemplo si yo quisiera
cifrar la palabra COCOMAN, la clave (cipher) seria la siguiente.

1.) 26 Letras del alfabeto
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

2.) Parametro de ROTacion
ROT = 3

3. Palabra o frase a cifrar
– COCOMAN

4. Resultado

A B C D E F G H I J K L M N O P  Q  R S T U V W X Y Z
	  |   |                   |  |  |
     (A) (C)                 (M)(N)(O)

COCOMAN = FRFRPDQ

Bien ahora despues de la carreta, viene el código en PHP.
- ¿Porqué en PHP?, porque fue el lenguaje que se me ocurrió en ese momento.

==========// Implementando el Código \\===========

1. Clase que contiene el metodo de cifrado :D

<?php
  /***
  *@Nombre : criptografia.c
  *@Descripcion : clase que contiene las implementación de los diferentes metodos de cifrado.
  ***/

    class criptografia{	

	//Cifra de Cesar
	function obtenerCifraCesar($texto, $rotacion){

		if ($rotacion == ""){
			$rotacion = 3;
		}

		$patron = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
		$patronEspecial = "1234567890 .!";
		$tamanoTexto = strlen($texto);
		$tamanoPatron = strlen($patron);
			for($i=0; $i<$tamanoTexto; $i++){
				for($j=0; $j= 52){ //Letras
							$ROT = $ROT - 52;
						}
						$resultado .= $patron{$ROT};

					}
					//Para los caracteres especiales, numeros y otras hierbas :D
					if($texto{$i} == $patronEspecial{$j}){
						$resultado .= $texto{$i} ;
					}
				}
			}

		return $resultado;
	}
}

?>
 

2. Archivo que llama el metodo y contiene la interface xD

<?
  /******
  * @Name : cesar.php
  * @Description : Breve ejemplo del cifrado de Cesar.
  * @Date : 28-10-08
  *******/

  //Incluyo clase que realiza el cifrado
  //Se puede crear la carpeta class y dentro de class meter el archivo criptografia.pho, o bien modificar la ruta.
  require("class/criptografia.php"); 

  $metodo = new criptografia();

  //Tomo los datos enviados por metodo POST
  foreach($_POST as $nombre_campo => $valor)
  {
	$asig = "\$" . $nombre_campo . "='" . $valor . "';";
	eval($asig);
  }

?>

Cifrando con Cesar 

		Mensaje a Cifrar

Tamaño de rotación : <input type="text" size="2" maxlength="3" name="rotacion" value=""> obtenerCifraCesar($texto, $rotacion); echo "" . $cifraCesar .""; } ?> document.forms[0].elements[0].focus();