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:
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:
La cadena $saltar se ha desformatado al convertir el código así que la dejo aparte:
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.
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'])); $clave= strtolower($_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:
Publicar un comentario