Cifra de Vigenere en PHP

23 12 2009

Clase Vigenere

<?php
/******************************************************************************
 * Nombre : Vigenere.php
 * Clase para el cifrado de Vigenere para Project-RIC. Este es un cifrado de
 * sustitución polialfabetico, siendo una variación del cifrado de cesar. La diferencia
 * es que usa una palabra como semilla, la cual cada caracter representa el indice
 * del charset a ser sumado en las operaciones modulares. Esta semilla se repita cuantas
 * veces sea necesario hasta cifrar/descifrar toda la cadena.
 * @copyLeft  : Project-RIC
 * @package   : RiCrypt
 * @author      : D-m-K, d4rk.m0nk3y@gmail.com, my.opera.com/d-m-k
 ******************************************************************************/
class Vigenere {

charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";	//Definicion del charset
		$this->txt    = strtoupper($s);
		$this->seed   = strtoupper($seed);
    }
 
	/************************************************************************************
	* Funcion :  encode
	* Cifra la cadena pasada como parametro realizando una sustitucion
	* polialfabetica a traves de sumas modulares dependiendo el indice de cada caracter de la semilla
	* @param  $seed = Semilla con la que sera cifrado el mensaje	
	* @return $result = Mensaje cifrado
	************************************************************************************/
    function encode(){
		$result = "";						//Cadena donde queda el resultado
		$x = 0;								//Indice de la semilla
		$p = 0;								//Posicion para relizar la operacion modular
		for($i=0; $itxt); $i++){
			if(strstr($this->charset, $this->txt{$i})){//Evaluo si existe el caracter en el charset
				$x = strpos($this->charset, $this->seed{($p % strlen($this->seed))});
				$result .= $this->rotate($this->txt{$i}, $x);	//Invoco funcion que hace la rotacion
				$p++; //Aumento el indice para la operacion modular
			}else{//Si no existe dejo el caracter evaluado
				$result .= $this->txt{$i};
				continue;
			}	
		}			
        return $result;						//Devuelvo la cadena Cifrada =)
    }
 
 	/************************************************************************************
	* Funcion  :  decode
	* DesCifra la cadena pasada como parametro realizando una sustitucion
	* polialfabetica a traves de sumas modulares dependiendo el indice de cada caracter de la semilla
	* @param  $seed = Semilla con la que sera cifrado el mensaje	
	* @return $result = Mensaje cifrado
	************************************************************************************/
    function decode(){
		$result = "";						//Cadena donde queda el resultado
		$x = 0;								//Indice de la semilla
		$p = 0;								//Posicion para relizar la operacion modular
		for($i=0; $itxt); $i++){
			if(strstr($this->charset, $this->txt{$i})){//Evaluo si existe el caracter en el charset
				$x = strpos($this->charset, $this->seed{($p % strlen($this->seed))});
				$result .= $this->rotate($this->txt{$i}, -$x);	//Invoco funcion que hace la rotacion
				$p++; //Aumento el indice para la operacion modular
			}else{//Si no existe dejo el caracter evaluado
				$result .= $this->txt{$i};
				continue;
			}	
		}			
        return $result;						//Devuelvo la cadena DesCifrada =)
    }
 
	/*****************************************************************************
	* Funcion : rotate
	* Realiza la rotacion de un caracter sobre el charset dependiendo el valor de la semilla
	* de la cadena original la cantidad de veces definida en el parametro
	* @param  $s = Cadena original
	*                 $n = Cantidad de rotaciones
	* @return  $result = Valor del nuevo caracter de acuerdo al indice
	*****************************************************************************/
	function rotate($c, $n){
        $result = "";			//Texto de salida
        $tamC = strlen($this->charset); //Longitud de la cadena del charset
		$k = 0; 				//Indice para sustitucion de la cadena con el charset
		$n %= $tamC;			//Semilla ó rotacion
		$c = strtoupper($c);	//Convierto a mayuscula el caracter		
		//Realizo la sustitución de cada caracter        
        //Evaluo si el caracter en la posicion $i existe, de lo contrario
        //Dejo el caracter que esta por defecto
		if(strstr($this->charset, $c)){
			$k = (strpos($this->charset, $c) + $n);
			if($k charset{$k};
		}else{
			$result .= $c;
		}
		return $result;
	}
}
?> 

Implementacion Cifra vigenere en PHP

encode();
		}	
		//DESCIFRADO DEL MENSAJE
		if($_POST['tarea'] == "DesCifrar"){
			$cipher    = new Vigenere($mensaje, $semilla);	
			$salida = $cipher->decode();
		}	
	}
?>

	
		 .:: Implementacion de la cifra de vigenere ::. 
	
	
		

Vigenere


Mensaje a cifrar / descifrar :

Semilla : <input type="text" name="semilla" style="width:150px;border:1px solid #555" value=""> | | <?php //Muestro el mensaje de salida if($salida != ""){ echo " Resultado del criptograma
\n"; echo "
" . $salida . "
"; } ?>

Greetings to all and happy Bandwith :)








Seguir

Get every new post delivered to your Inbox.