Próximo evento: Positive Hack Days (CTF) http://t.co/h7TGVgsu #CTF
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/*
Modulo CT para RiCrypt
Cifrado por Transposicion usando una matriz y una llave ordenada.
Phicar
project-ric.org
phicar@yashira.org
*/
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]1=""+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;
}
}Trackback de tu sitio.

Comentarios (4)
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
Responder
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
Responder
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
Responder
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
.
Responder