Cifrado vigenère [code PHP]

Hoy os presento un code sencillo que se comentó por DragonJAR y como estaba aburrido decidí crear un cifrador.

El cifrado es vigenerè y es, básicamente, el cifrado cesar un poco mas avanzado.

Como yo no soy bueno comentado la historia me centro en las matemáticas:

El cifrado recive 3 parámetros:

- Mensaje a cifrar
- Clave
- Cantidad de letras del abecedario (este 3er parámetro es una constante)

La fórmula del cifrado vigenère es:

Yi = (Xi + Zi) mod T

Donde:

Xi = letra original
Zi = letra clave

T = 26 (letras alfabeto -1 , ya que empezamos de 0)

Un ejemplo:

Xi = A
Zi = B

Yi = (A + B) mod 26
Yi = (0 + 1) mod 26

Yi = 1 = B

Siendo:
A = 0
Z = 26

El código es:

<?php

form
();
$message strtolower(str_replace("n"," ",$_POST['message'])); $clavestrtolower($_POST['clave']); $final "";
$letters explode(' ',"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"); $saltar explode(' ''º Âª  ! | " @ Â· # $ ~ % 
â�¬ & Â¬ / ( ) = ? ' Â¿ Â¡ ^ ` [ ] + * Â¨ Â´ { } Ã§ - _ . : , ;');

for (
$i = 0, $x = 0 ; $i < strlen($message); $i++, $x++) {
   
   if (
$x >= strlen($clave))
      
$x = 0;
   
   if (in_array(
$message[$i],$saltar) || $message[$i] === ' ') {
      
$final .= $message[$i];
      
$x--;
   }else {
      
      
$vigenere = (array_search($message[$i],$letters) + 

array_search($clave[$x],$letters) ) % 26 ;

      
$final .= $letters[$vigenere];

   }
}

echo '<b>Resultado encriptado:</b><br />'.strtoupper(
$final);

function form() {
   echo '<form action="'.
$_SERVER['PHP_SELF'].'" method="post">
         Mensaje: <br /> 
            <textarea name="message">'.
$_POST['message'].'</textarea><br />
         Clave: <input type="text" name="clave" value="'

.$_POST['clave'].'" />
         <input type="submit" name="send" value="Enviar">
        </form>
   ';   
}

?>


La cadena $saltar se ha desformatado al convertir el código así que la dejo aparte:

$saltar = explode(' ', 'º ª \ ! | " @ · # $ ~ % € & ¬ / ( ) = ? \' ¿ ¡ ^ ` [ ] + * ¨ ´ { } ç - _ . : , ;');


Explicación:

Básicamente lo que hacemos es crear un array del abecedario, para asignar de forma rápida el 0 = a y z = 26.
Después de eso tomamos un bucle donde usaremos 2 contadores, $i para el mensaje y $x para la clave.

La variable que hará salir del bucle es $i, ya que cuando se acabe el mensaje se acabará el bucle.
$x sin embargo se repetirá cada vez que se termine.

La variable $saltar nos permite saltarnos ciertos carácteres que no forman parte del abecedario y disminuimos $x en 1 ya que no usamos la letra clave para encriptar.

Luego ya solo es cuestión de buscar la letra del mensaje en el array y tomar el valor de la key sumarlo al valor de la letra clave y hacer mod entre 26.

Ejemplo de uso:


Espero que les guste y quizá con mas tiempo hago el decrypter.