Playfair
Friday, 9. January 2009, 01:52:26
Hola, Como tan?
Bueno hoy les presento el cifrado Playfair junto con su aplicacion en java(Me gusta java, y que?
)
Playfair es un cifrado que usa una matriz lo mas de coqueta, lo que hace es generar una matriz 5*5 con la clave entrada de la siguiente manera..digamos que la clave es phicar entonces generamos la matriz con esas letras y posterior el alfabeto(Sin repetir ninguna letra) y dejando una letra poco usada en el olvido en el caso de la aplicacion deje olvidada la w
..entonces la matriz queda como:
phica
rbdef
gjklm
noqst
uvxyz
listo asi queda la matriz, ahora procedemos a jugar con el texto, primero vamos a dividir el texto en partes de dos caracteres, digamos que quiero codificar "pandemonium" entonces lo dividimos y si quead una letra suelta la rellenamos con x
pa-nd-em-on-iu-mx
queda asi, y procedemos a ver las reglas...
1) si los dos caracteres dentro de el conjunto son iguales uno de ellos se remplaza por "x".
2) si los dos caracteres se hallan en la misma fila, se remplazan por el caracter proximo a la derecha,si es el ultimo se procede a coger el primero..
3)si los dos caracteres se hallan en la misma columna pasa lo mismo pero hacia abajo.
4) si los caracteres no se hallan en la misma fila ni columna entonces se procede a hacer un cuadro imaginario, donde se coge un caracter en la fila de la primera letra pero en la columna de la otra letra y viceversa para la otra letra.
Entonces quedaria asi el cifrado
hpqrflqopxkz
Bueno y creo que me va mejor con codigo asi que aca les dejo...disfrutenlo
pd:la ortografia otra vez..que pena!!!
Bueno hoy les presento el cifrado Playfair junto con su aplicacion en java(Me gusta java, y que?
Playfair es un cifrado que usa una matriz lo mas de coqueta, lo que hace es generar una matriz 5*5 con la clave entrada de la siguiente manera..digamos que la clave es phicar entonces generamos la matriz con esas letras y posterior el alfabeto(Sin repetir ninguna letra) y dejando una letra poco usada en el olvido en el caso de la aplicacion deje olvidada la w
phica
rbdef
gjklm
noqst
uvxyz
listo asi queda la matriz, ahora procedemos a jugar con el texto, primero vamos a dividir el texto en partes de dos caracteres, digamos que quiero codificar "pandemonium" entonces lo dividimos y si quead una letra suelta la rellenamos con x
pa-nd-em-on-iu-mx
queda asi, y procedemos a ver las reglas...
1) si los dos caracteres dentro de el conjunto son iguales uno de ellos se remplaza por "x".
2) si los dos caracteres se hallan en la misma fila, se remplazan por el caracter proximo a la derecha,si es el ultimo se procede a coger el primero..
3)si los dos caracteres se hallan en la misma columna pasa lo mismo pero hacia abajo.
4) si los caracteres no se hallan en la misma fila ni columna entonces se procede a hacer un cuadro imaginario, donde se coge un caracter en la fila de la primera letra pero en la columna de la otra letra y viceversa para la otra letra.
Entonces quedaria asi el cifrado
hpqrflqopxkz
Bueno y creo que me va mejor con codigo asi que aca les dejo...disfrutenlo
pd:la ortografia otra vez..que pena!!!
public class Playfair{
public static void main(String args[]){
String opcion = args[0];
String cadena = args[1].toLowerCase();
String clave = args[2].toLowerCase();
if(opcion.equalsIgnoreCase("-c")){
System.out.println(Cif(arre(cadena),clave));
}else if(opcion.equalsIgnoreCase("-d")){
System.out.println(Dec(cadena,clave));
}else{
ayuda();
}
}
public static String Cif(String txt,String clave){
String mat[] = genMatriz(clave);
if(txt.length()%2 != 0)
txt+="x";//le agbnado x si hace falta
String cifr="";
for(int n =0;n<txt.length();n+=2){//recorro de a dos
String temp = txt.substring(n,n+2);
if(temp.charAt(0)==temp.charAt(1))
temp = temp.charAt(0)+"x";//si son iguales modifico a x
if(posY(temp.charAt(0),mat)==posY(temp.charAt(1),mat)){//misma fila
//ad-der
int pSx=posX(temp.charAt(0),mat),psX=posX(temp.charAt(1),mat);
cifr+=mat[posY(temp.charAt(0),mat)].charAt(
((pSx+1)>=mat[posY(temp.charAt(0),mat)].length())?0:pSx+1);
cifr+=mat[posY(temp.charAt(1),mat)].charAt(
((psX+1)>=mat[posY(temp.charAt(1),mat)].length())?0:psX+1);
}else if(posX(temp.charAt(0),mat)==posX(temp.charAt(1),mat)){//misma columna
//ad-aba
int pSy=posY(temp.charAt(0),mat),psY=posY(temp.charAt(1),mat);
cifr+=mat[((pSy+1)<mat.length)?(pSy+1):0].charAt(posX(temp.charAt(0),mat));
cifr+=mat[((psY+1)<mat.length)?(psY+1):0].charAt(posX(temp.charAt(1),mat));
}else{//cuadro
//cuadro
int pSx=posX(temp.charAt(0),mat),pSy=posY(temp.charAt(0),mat)
,psX=posX(temp.charAt(1),mat),psY=posY(temp.charAt(1),mat);
cifr+=mat[pSy].charAt(psX);
cifr+=mat[psY].charAt(pSx);
}
}
return cifr;
}
public static String Dec(String txt,String clave){
String mat[] = genMatriz(clave);
if(txt.length()%2!=0)txt+="x";//le pongo las x
String desc="";
for(int n = 0;n<txt.length();n+=2){//recorro de a dos
String temp = txt.substring(n,n+2);
if(posY(temp.charAt(0),mat)==posY(temp.charAt(1),mat)){//si estan en la misma fila
int pSx=posX(temp.charAt(0),mat),psX=posX(temp.charAt(1),mat);
desc+=mat[posY(temp.charAt(0),mat)].charAt(
((pSx-1)>=0)?(pSx-1):(mat[posY(temp.charAt(0),mat)].length()-1));
desc+=mat[posY(temp.charAt(1),mat)].charAt(
((psX-1)>=0)?(psX-1):(mat[posY(temp.charAt(1),mat)].length()-1));
}else if(posX(temp.charAt(0),mat)==posX(temp.charAt(1),mat)){//misma columna
int pSy=posY(temp.charAt(0),mat),psY=posY(temp.charAt(1),mat);
desc+=mat[((pSy-1)>=0)?(pSy-1):(mat.length-1)].charAt(posX(temp.charAt(0),mat));
desc+=mat[((psY-1)>=0)?(psY-1):(mat.length-1)].charAt(posX(temp.charAt(1),mat));
}else{//cuadro
int psY=posY(temp.charAt(0),mat),pSy=posY(temp.charAt(1),mat),
psX=posX(temp.charAt(0),mat),pSx=posX(temp.charAt(1),mat);
desc+=mat[psY].charAt(pSx);
desc+=mat[pSy].charAt(psX);
}
}
return desc;
}
/*Genero la matriz de las que le hablo
primero pongo los caracteres de la clave
en la matriz, despues, pongo los que fal-
tan del alfabeto
y lo mando spliteado como una matriz*/
public static String [] genMatriz(String a){
String alfa = "abcdefghijklmnopqrstuvxyz";
String res = "";
for(int n = 0;n<a.length();n++)
if(alfa.indexOf(a.charAt(n)) != -1 && res.indexOf(a.charAt(n))==-1)
res+=a.charAt(n);
for(int n = 0;n<alfa.length();n++)
if(res.indexOf(alfa.charAt(n))==-1)res+=alfa.charAt(n);
for(int n = 0;n<res.length();n++)
if(n%6==0)res=res.substring(0,n)+"|"+res.substring(n,res.length());
return res.substring(1,res.length()).split("\\|");
}
/*arreglo el texto antes de usarlo para cifrar...
lo que hace es eliminar todos los carcteres que
no esten en el alfabeto*/
public static String arre(String a){
String alfa="abcdefghijklmnopqrstuvxyz";
String res = "";
for(int n = 0;n<a.length();n++)
if(alfa.indexOf(a.charAt(n))!=-1)
res+=a.charAt(n);
return res;
}
/*la ayuda :P*/
public static void ayuda(){
System.out.println("Playfair :)\n"+
"Usage:java Playfair <option> <txt> <password>\n"+
"Options\n-c/-C\tEnciphering\n"+
"-d/-D\tFor Desciphering\n"+
"By Phicar, phicar@yashira.org");
}
/*posY busca la fila a la que pertenece el caracter*/
public static int posY(char a,String [] b){
for(int n = 0;n<b.length;n++)
if(b[n].indexOf(a) != -1)return n;
return -1;
}
/*posX, busca la posicion dentro de la fila, o sea la colmuna del carcter*/
public static int posX(char a,String b[]){
for(int n =0;n<b.length;n++)
if(b[n].indexOf(a) != -1) return b[n].indexOf(a);
return -1;
}
}













