Julio Cesar enviaba mensajes a sus legiones cifrando los mensajes mediante el
siguiente algoritmo:
Se escogía un número n como clave y se sumaba a cada letra en el alfabeto n
posiciones. Así, si la clave escogida fuese 5, la 'a' pasaría a ser la 'f', mientras que
la 'f' pasaría a ser la 'k'. Para las últimas letras del abecedario se seguiría desde el
principio. Así, con la clave de 5 la 'y' pasaría a ser la 'd'
Otra perspectiva para el algoritmo de Julio Cesar para PHP
[code]<?php
//Recuerda que aquí no dejo el formulario HTML
$mensaje=$_POST['mensaje'];
$n=$_POST['n'];
$julio=array(
a=>"0",
b=>"1",
c=>"2",
d=>"3",
e=>"4",
f=>"5",
g=>"6",
h=>"7",
i=>"8",
j=>"9",
k=>"10",
l=>"11",
m=>"12",
n=>"13",
ñ=>"14",
o=>"15",
p=>"16",
q=>"17",
r=>"18",
s=>"19",
t=>"20",
u=>"21",
v=>"22",
w=>"23",
x=>"25",
y=>"25",
z=>"26");
$cesar=array(
0=>"a",
1=>"b",
2=>"c",
3=>"d",
4=>"e",
5=>"f",
6=>"g",
6=>"h",
7=>"i",
9=>"j",
10=>"k",
11=>"l",
12=>"m",
13=>"n",
14=>"ñ",
15=>"o",
16=>"p",
17=>"q",
18=>"r",
19=>"s",
20=>"t",
21=>"u",
22=>"v",
23=>"w",
24=>"x",
25=>"y",
26=>"z");
echo "Mensaje original: ".$mensaje."<br>";
echo "Mensaje codificado: <br>";
for($i=0;$i<strlen($mensaje);$i++)
{
$cifrado=(($julio[$mensaje[$i]] + $n))%27;
echo $cesar[$cifrado];
}
?>
[/code]
Podes reemplazar:
$cesar=array(
0=>"a",
1=>"b",
2=>"c",
3=>"d",
4=>"e",
5=>"f",
6=>"g",
6=>"h",
7=>"i",
9=>"j",
10=>"k",
11=>"l",
12=>"m",
13=>"n",
14=>"ñ",
15=>"o",
16=>"p",
17=>"q",
18=>"r",
19=>"s",
20=>"t",
21=>"u",
22=>"v",
23=>"w",
24=>"x",
25=>"y",
26=>"z");
por
$cesar = array_flip($julio);
Esta buena la implementacion
Saludos
Gracias, no me di cuenta. Así queda mucho mejor. Saludos
Por favor, usa las etiquetas BBCode para resaltado de sintaxis. [code=php][/code]
Pwned, cuando se ingresa una mayúscula. XD
Mensaje original: Shell
Mensaje codificado: PHP Notice: Undefined index: S in /home/alex/Escritorio/PoC.php on line 65
elPHP Notice: Undefined offset: 8 in /home/alex/Escritorio/PoC.php on line 66
Otra opción podría ser,
# @Algoritmo Julio Cesar
# @Shell Root
$sMsg = 'Shell Root';
$sMsg = strtolower($sMsg);
$sNumber = 28;
$sEncryption = 'abcdefghijklmnñopqrstuvwxyz';
echo "Cadena Original: ".$sMsg."\n";
echo "Cadena Cifrada: ";
for($i=0;$i<strlen($sMsg);$i++){
if($sMsg[$i] == ' '){ echo " "; }
for($j=0;$j<strlen($sEncryption);$j++){
if($sMsg[$i] == $sEncryption[$j]){
echo $sEncryption[$j + $sNumber % 27];
}
}
}
echo "\n";
Resultado,
alex@shellroot:~/Escritorio$ php PoC.php
Cadena Original: shell root
Cadena Cifrada: tifmm sppu
Si, tampoco cifra caracteres especiales. Esa sería la opción para agregarle más funcionalidades al código. Lo de las mayúsculas y minúsculas, es relativo. Podes darle un valor de asignación diferentes a las mayúsculas o simplemente usar la función
strtolower ()
y convertir todo tu mensaje a minúscula. En la consigna original, el problema trata solo caracteres del alfabeto, pero estaría bueno agregar lo de los caracteres especiales. Saludos.
otra forma mas facil....
<?php
$x= "a";
$x++;
echo $x;
?>
boludeando descubri eso e hice esta funcion...
<?php
function cesar($cadena,$desplazamiento){
if(!is_numeric($desplazamiento)){
return FALSE;
}
$cifrado='';
$i=0;
while(strlen($cadena)>$i){
$x=0;
$a=substr($cadena,$i,1);
while($desplazamiento>$x){
$a++;
$x++;
}
$cifrado.=$a;
$i++;
}
return $cifrado;
}
?>
el unico problema es que haciendo $x++ funciona, pero $x-- no, asi que cifra, pero no decifra xD.
De esta forma cifra mayusculas, minuscula, numeros y a los caracteres especiales me parece los deja como esta
Otro problema sería la ñ, que al ser PHP americano no etá en el mismo rango ASCII que las demas letras.
Saludos
si... la ñ seria otro problema... solo les mostre que hay otra forma de hacerlo, sin el array, que queda poco dinamico (? :P
Cita de: KrossPock en 31 Octubre 2010, 18:20 PM
si... la ñ seria otro problema... solo les mostre que hay otra forma de hacerlo, sin el array, que queda poco dinamico (? :P
Hay cosas que requieren cierta dinamicidad y hay cosas que no, como por ejemplo un alfabeto. En 500 o 1000 años es muy poco probable que agregue o quite 1 carácter. Tambien podes hacer uso de las correspondencias ASCII, si no te parece conveniente usar un arreglo.
También se podría hacer de la siguiente manera:
<?php
# Cifrado Cesar
# .:WindHack:.
$Msg = "Hola Mundo";
$Key = 3;
$Temp = "";
for ($i=0;$i<strlen($Msg);$i++)
$Temp .= chr(ord($Msg[$i])+$Key);
$Temp = str_replace("#"," ",$Temp);
echo "Cadena Cifrada: $Temp";
echo "Cadena Original: $Msg";
?>
Cadena Cifrada: Krod Pxqgr
Cadena Original: Hola Mundo