Nombre: Cifrado de playfair
Descripción:
Desarrolle este algoritmo con fines didácticos, ya que solo soporta 25 caracteres los cuales son muy pocos, aunque se podrían hacer implementaciones con más caracteres basandoce en este algoritmo pero dejaría de ser el cifrado de playfair. Este sistema criptográfico fue inventado en 1854 por Charles Wheatstone, pero debe su nombre al Baron Playfair de St Andrews quien promovió el uso de este criptosistema. El algoritmo utiliza una tabla o matriz de 5x5. La tabla se llena con una palabra o frase secreta descartando las letras repetidas. Se rellenan los espacios de la tabla con las letras del alfabeto en orden. Usualmente se omite la "W" y se utiliza la "V" en su lugar o se reemplazan las "J" por "I". Esto se hace debido a que la tabla tiene 25 espacios y el alfabeto tiene 26 símbolos. La frase secreta usualmente se ingresa a la tabla de izquierda a derecha y arriba hacia abajo o en forma de espiral, pero puede utilizarse algún otro patrón. La frase secreta junto con las convenciones para llenar la tabla de 5x5 constituyen la clave de encriptación. Mas acerca de este cifrado:
www.textoscientificos.com/criptografia/playfair
URL: http://www.mygnet.net/codigos/php/criptografia/cifrado_de_playfair.1515
Código Fuente:
<?php
//Tabla del alfabeto...
$T=array();
$Tp=array();
function buscar($s,$c=true)
{ global $Tp;
for($i=0; $i<5; $i++)for($j=0;$j<5; $j++) if($Tp[$i][$j]==$s) return $c?$i:$j;
return false;
}
function setcar($s)
{ global $T;
if(trim($s)!=''){ for($i=0; $i<count($T); $i++)if($T[$i]==$s){ $T[$i]=''; return $s; } return ''; }
for($i=0; $i<count($T); $i++)if($T[$i]!=''){ $s=$T[$i]; $T[$i]=''; return $s; }
}
function matrizTp($K)
{ global $Tp,$T;
$Tp=array();
$T=array('A','B','C','D','E',/**/'F','G','H','I','J',/**/'K','L','M','N','O',/**/'P','Q','R','S','T',/**/'U','V','X','Y','Z');
//$T=array('A','B','C','D','E',/**/'F','G','H','I','K',/**/'L','M','N','O','P',/**/'Q','R','S','T','U',/**/'V','W','X','Y','Z');
$K=str_replace('W','V',strtoupper($K)); $n=0;
for($i=0; $i<5; $i++)
{ for($j=0;$j<5; $j++)
{ do{ $Tp[$i][$j]=setcar($K[$n++]);
}while($Tp[$i][$j]=='');
}
}
}
function playfair($M,$K)
{ global $Tp;
matrizTp($K);
$M=str_replace('W','V',strtoupper($M));
for($i=0; $i<strlen($M); $i+=2)
{ $C.=$Tp[buscar($M[$i],true)][buscar($M[$i+1],false)].
$Tp[buscar($M[$i+1],true)][buscar($M[$i],false)];
}
return $C;
}
/* Ejemplo..*/
$K='comunidad mygnet'; //Clave
$M='lenguaje';
$C=playfair($M,$K);
echo '<code>Algoritmo de Playfair<hr>';
echo 'Clave: '.$K.'<hr>';
echo 'Cifrado: '.$C.'<hr>';
for($i=0; $i<5; $i++)
{ echo '<br>';
for($j=0;$j<5; $j++) echo $Tp[$i][$j].' ';
} echo '<hr>';
$M=playfair($C,$K);
echo 'Decifrado: '.$M.'</code><hr>';
?>