En esta ocasión, he implementado un cifrando por transpocición de columnas siguiendo un patrón dado. La interfaz Cipher es la misma que para el cifrado básico (véase: [Java] Cifrado por Transposición). En este caso, el patrón puede considerarse como la clave, pero al ser tan simple, se considera como parte del cifrado. El constructor comprueba que el patrón dado es válido.

El cifrado funciona de la siguiente manera:
dado el mensaje "esto es una prueba" y el patrón [2, 0, 1], construye la siguiente matriz

Código: Seleccionar todo

0 1 2
-----
e s t
o _ e
s _ u
n a _
p r u
e b a
y concatena columna a columna, siguiendo el orden que dicta el patrón [2, 0, 1]: en primer lugar la columna 2; después la columna 0; por último la 1. Así, quedaría:

Código: Seleccionar todo

teu_uaeosnpes__arb
El proceso de descifrado es similar. Acontinuación, la implementación en Java:

Cifrado:
[Column.java]
/*
 * Column Transposition Cipher
 * Author: Slek (10/10/14)
 */

public class Column implements Cipher {
	
	private int[] p;
	
	public Column(int[] pattern){		
		int[] a = new int[pattern.length];
		
		int i = 0;
		boolean b = true;
		
		while ((i < pattern.length) && b) {
			if ((pattern[i] < pattern.length) && (pattern[i] >= 0)) a[pattern[i]] = pattern[i];
			else b = false;
			i++;
		}
		
		i = 0;
		
		while ((i < pattern.length) && b) {
			b = (a[i] == i);
			i++;
		}
		
		if (!b) throw new IllegalArgumentException();
		
		p = pattern;
	}

	@Override
	public byte[] encrypt(byte[] m) {
		int l = m.length;
		int n = p.length;
		
		byte[] c = new byte[l];
		
		int k = 0;
		
		for (int i = 0; i < n; i++)
			for (int j = p[i]; j < l; j += n) c[k++] = m[j];
		
		return c;
	}

	@Override
	public byte[] decrypt(byte[] c) {
		int l = c.length;
		int n = p.length;
		
		byte[] m = new byte[l];
		
		int k = 0;
		
		for (int i = 0; i < n; i++)
			for (int j = p[i]; j < l; j += n) m[j] = c[k++];
		
		return m;
	}

}
Ejemplo:
[Main.java]
public class Main {

	public static void main(String[] args) {
		
		String message = "esto es una prueba";
		
		int[] p = {2, 0, 1};
		
		Cipher cipher = new Column(p);
		
		byte[] c;
		
		System.out.println(new String(c = cipher.encrypt(message.getBytes())));
		
		System.out.println(new String(cipher.decrypt(c)));

	}

}
Saludos!!
github.com/Slek-Z
Responder

Volver a “Fuentes”