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
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]=""+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;
}
}
Por Phicar

8 Comentarios

  1. Jeff - junio 6, 2011, 6:50 pm Responder

    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

  2. Phicar - junio 10, 2011, 2:48 pm Responder

    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

  3. Jeff - junio 10, 2011, 7:51 pm Responder

    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

  4. Phicar - junio 11, 2011, 1:05 pm Responder

    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 ;).

  5. Jason - septiembre 23, 2012, 12:43 pm Responder

    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?

  6. daniel - abril 13, 2013, 11:40 pm Responder

    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);

  7. Javier - marzo 26, 2015, 11:14 pm Responder

    Ya no está disponible el link del código corregido:

    http://foro.redinfocol.org/criptografia/ct/msg3376

Deja un comentario

Tu email no será publicado.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*