Columnar Transposition
Bueno, como están amigos?, les traigo transposición columnar simple:
¿En que se basa este método?
Esto acepta un texto de longitud n con un numero pE(x|x<n-1) n-1 el cual permitirá dividir la matriz en n/p filas, con el numero p de columnas. Después de eso hay un orden establecido por el usuario que determina de que forma se agruparan las columnas para ponerlas en el texto Cifrado.
Ej:
Teniendo este mensaje
«Ric para toda la vida» y la llave siguiente
(6;(3,5,0,4,2,1))
Se obtiene la siguiente matriz y el siguiente sistema, para mantener la simetría se agregan «x» como sea necesario.
R i c p a
r a t o d
a l a v
i d a x x x
Y según el orden se obtiene:
» taxadvxRraipo xc laia d»
Lo cual se podría descifrar con la misma llave (6;(3,5,0,4,2,1)) pero ¿como se haria el descifrado? bueno se van cogiendo de a subtextos de longitud n/p que vendria siendo 4 en este ejemplo y se organizan como columnas:
a R p c i
t d r o a
a v a l
x x i x a d
Y se procede a organizar según el orden de la llave, con lo cual nos dará la misma matriz del comienzo 😀
Les dejo el código:
/* Modulo CT para RiCrypt Cifrado por Transposicion usando una matriz y una llave ordenada. Phicar project-ric.org [email protected] */ import java.util.*; public class CT{ public static String TxT; public static int Sp; public static int Seed[]; public CT(String TxT,int Sp,String Sd){ this.TxT = TxT; this.Sp = Sp; while(this.TxT.length()%Sp !=0) this.TxT+="x"; Seed = Gen(Sd,Sp); if(Seed[0]==-1){//generamos Seed por defecto.. Seed = new int[Sp]; for(int n = 0;n<Sp;n++) Seed[n]=n; } } public static String Cifrar(){ String Cifrado = ""; String tmp[][] = new String[TxT.length()/Sp][Sp]; for(int n = 0;n<TxT.length();n++) tmp[(int)Math.floor((double)n/(double)Sp)][n%Sp]=String.valueOf(TxT.charAt(n)); for(int n = 0;n<Seed.length;n++) for(int x =0;x<(TxT.length()/Sp);x++) Cifrado+=tmp[x][Seed[n]]; return Cifrado; } public static String DesCifrar(){ String DesCifrado=""; String pp = ""; for(int n=0;n<Seed.length;n++) pp+=String.valueOf(Seed[n]); //String DesCifrado=""; String tmp[][] = new String[TxT.length()/Sp][Sp]; String ord[][] = new String[TxT.length()/Sp][Sp]; for(int n = 0,c=0;(n+(TxT.length()/Sp))<=TxT.length();c++,n+=(TxT.length()/Sp)){ String tt = TxT.substring(n,n+(TxT.length()/Sp)); for(int x=0;x<tt.length();x++) tmp[x][c]=""+tt.charAt(x); } for(int n = 0;n<Sp;n++) for(int y = 0;y<(TxT.length()/Sp);y++) ord[y][n]=tmp[y][pp.indexOf(String.valueOf(n))]; for(int n = 0;n<(TxT.length()/Sp);n++)for(int x = 0;x<Sp;x++)DesCifrado+=ord[n][x]; return DesCifrado; } public static int[] Gen(String Sd,int Sp){ int nula[] = {-1}; String charset = "0123456789,"; for(int n = 0;n<Sd.length();n++)if(charset.indexOf(Sd.charAt(n))==-1){ System.err.println("Seed Mala"); return nula; } for(int n = 0;n<Sp;n++) if(Sd.indexOf(String.valueOf(n))==-1){ System.err.println("Seed Mala"); return nula; } StringTokenizer tok = new StringTokenizer(Sd,","); if(Sp!=tok.countTokens()){ System.err.println("Seed Mala"); return nula; } int epa[] = new int[Sp]; for(int n = 0;n<epa.length;n++){ epa[n]=Integer.parseInt(tok.nextToken()); if(epa[n]>=Sp){ System.err.println("Seed Mala"); return nula; } } return epa; } }
Jeff
Hi
En esta parte
«Se obtiene la siguiente matriz y el siguiente sistema, para mantener la simetría se agregan “x” como sea necesario.
R i c p a
r a t o d
a l a v
i d a x x x
»
por que la 3ra fila no tiene 5 letras como las 2 primeras??? y por que la ultima tiene 6?
Por lo que entiendo en eso es que la 6ta columna es un espacio.. o eso es lo que entiendo.
Ademas no entiendo como se arma esto
” taxadvxRraipo xc laia d”
Y tampoco entiendo como se arma esta matriz
a R p c i
t d r o a
a v a l
x x i x a d
Se los agradezco se mi lo pueden explicar
Feliz día
Phicar
Hola Jeff, un gusto que andes leyendo algo de por aca :).
Mira, fue un error de tipeo en la matriz, sabes puto Copy Paste 😉 xDDD
“Ric para toda la vida” y la llave siguiente
(6;(3,5,0,4,2,1))
Luego, de a 6 columnas…
R i c _ p a
r a _ t o d
a _ l a _ v
i d a x x x
Donde _ significa un espacio ;)…Seguro ahi si entiendes de donde sale el cipher..
Lo siento 😉
Phicar
Jeff
Hi again.
Bueno de hecho ya habia pasado por tu blog http://my.opera.com/phicar/blog/ y había leído cosas, muy interesantes acerca de cifrados, (esos los entendí 🙂 y más en java como no leerlos) por eso no te pregunte nada y me dio un buen referente para leerte acá.
Tengo estas dudas «texto de longitud n con un numero pE(x|x<n-1) n-1" la última parte quiere decir "p perteneciente a x donde x < n-1" estoy en lo correcto? además el ultimo n-1 (el de fuera de los paréntesis no lo entiendo).
Acá "(6;(3,5,0,4,2,1))" se que 6 son el número de columnas y los otros son el orden en que se deben de leer, pero los números son definidos por el user o son aleatorios?
Gracias
Happy night
Phicar
xDDD y yo que pensaba que solo lo leian emo girls ;)..jjajaj vale….
Estas en lo correcto. el de fuera de los parentesis solo es para seguir hablando de lo que hace n y pues p ;). (por eso es bueno el LaTeX..xDD
Y lo de los argumentos, si lees en el programa estos son introducidos por el usuario en la variable Sd ;).
Jason
Hola!!! tengo una duda, es que estaba probando tu código y en la parte de descifrar me dá un error aquí:
tmp[x]1=»»+tt.charAt(x);
y tenía la duda sobre que puede ser…. falta de corchetes? o que significa el 1?
Phicar
Hola, siento la tardanza…estoy algo desconectado
http://foro.redinfocol.org/criptografia/ct/msg3376
Ahí está el código bien, depronto fue un error al copiarlo..Cualquier cosa me cuentas.
daniel
hola me sale un error de error: not a statement y tambien de error: ‘;’ expected y no se porque espero y me puedan ayudar muchas gracias el error esta en tmp[x]1=»»+tt.charAt(x);
Javier
Ya no está disponible el link del código corregido:
http://foro.redinfocol.org/criptografia/ct/msg3376