Check the new version here

Popular channels

El cifrado César en Java

Este cifrado César es distinto al “tradicional” pues se basa en el código ASCII de los caracteres que queramos cifrar. Así pues, necesitaremos una clave, un entero esencial para descifrar nuestro cifrado. Teniendo nuestros caracteres y la clave, a la que llamaremos n, la codificadión vendrá dada por la fórmula y = x + n % 27, siendo y el valor ASCII del caracter introducido, n la clave de la que hablamos e y el resultado del cifrado.

Un apunte, también puedes leer este artículo haciendo clic aquí (fuente) para verlo con más opciones, poder copiar el código etc etc.

Pongamos un ejemplo:

Introducimos la cadena “Hola mundo”. El programa almacena dicha cadena en c, y la clave en n, por ejemplo, 23. Seguidamente llama al método (o función para los que vengan de C) cesar. Dentro de cesar() se inicializa un contador, cont. Este contador es básico para poder, más tarde, descifrar el código. Lo explicaremos al final. Luego creamos un String s que almacenará en nuestro caso s = {H,o,l,a, ,m,u,n,d,o} y un array de enteros donde iremos guardando el cifrado de cada carácter de nuestra cadena. Entramos al bucle for y en primer lugar guardamos el s en el String aux. A continuación convertimos dicho String a char y lo almacenamos en c. Luego convertimos c en un entero y lo almacenamos en x. Por último aplicamos la fórmula y obtenemos el cifrado del caracter que almacenaremos en cifrado. En el caso del primer carácter, H, cuyo valor ASCII es 72, si nuestra n fuera 23, cifrado[0] = 72 + 23 % 27 = 95. Aumentaríamos el contador y volveríamos a entrar en la iteración.

Al final obtendríamos el siguiente cifrado:

Cifrado: 95 134 131 120 55 132 140 133 123 134
Número de caracteres cifrados: 10

El por qué del contador viene aquí. Si el programa devolviera en bruto el cifrado 9513413112055132140133123134 no tendríamos forma de identificar el número de caracteres a los cuales queremos dar salida. Esto sería sencillo si, sabiendo el número de caracteres, el cifrado de cada carácter fuera un entero del mismo tamaño, pero no es así. Como vemos tenemos en este ejemplo dos tamaños, enteros de dos elementos como la ‘H’ y de tres como la ‘o’. Esto se entiende mejor viendo el código de descifrado que podrás encontrar tras este primero. Por supuesto si algo no quedó claro, no dudes en comentarlo.

import java.util.Scanner;

public class Cesar {
static String c = " ";
static int[] cifrado;
static int n;
static Scanner lee = new Scanner(System.in);
public static void main(String args[]){
System.out.print("Introduzca la secuencia de caracteres a cifrar: ";
c = lee.nextLine();
System.out.print("Introduzca n: ";
n = lee.nextInt();
cesar();

}

static void cesar(){
int cont = 0;
//Convertimos la cadena original en un array
String[] s = c.split("";
//Asignamos el tamaño del vector que almacenará el código cifrado
cifrado = new int[c.length()];
System.out.print("Sin cifrar: "+c+"nCifrado: ";

for(int i = 0;i < c.length();i++){
//Creamos un String con un sólo caracter
String aux = s;
//Convertimos el String a caracter
char c = aux.charAt(0);
//Convertimos el caracter a entero (su código ASCII)
int x = Integer.valueOf(c);
//Guardamos el valor codificado como entero
int cif = x + n % 27;
//Guardamos el valor codificado como string
cifrado = cif;
System.out.print(cifrado+" ";
cont ++;
}
System.out.println("nNúmero de caracteres cifrados: "+cont);
}
}



Continuemos con ejemplo anterior. Al ejecutar el programa de descifrado tendremos que introducir la clave de antes, en nuestro caso 23. Seguidamente tendremos que decir al programa de cuántos caracteres está formada la cadena que queremos descifrar, 10 para nosotros. Luego, en un bucle que se repetirá pues, 10 veces, tendremos que ir introduciendo todos los fragmentos de código de nuestro cifrado. Es decir en primer lugar 95 luego 134 hasta llegar al final, 134 (o). Con estos datos llamaremos al método cesar pasando como argumento el array de enteros cuyo tamaño hemos definido en main. Este método es más sencillo que el anterior pues sólo tendrá que aplicar la fórmula inversa y mostrar el resultado traducido a carácter haciendo un casting a char. Dicha fórmula es, x = y – n % 27, siendo n la llave, y el código cifrado del carácter que se esté descifrando e y la variable entera donde se almacenará el código ASCII que luego se traducirá por el casting a char. Aquí abajo tienes el código del descifrado, y esto es todo. No olvides comentar cualquier mejora/duda/sugerencia que tengas, un saludo.

import java.util.Scanner;


public class desCesar {
static String c = " ";
static int[] cifrado;
static int n, x;
static Scanner lee = new Scanner(System.in);
public static void main(String args[]){
System.out.print("1.-Introduzca n: ";
n = lee.nextInt();
System.out.print("n2.-Introduzca el número de caracteres a descodificar: ";
x = lee.nextInt();
while(n < 1){
System.out.print("n2.-Introduzca el número de caracteres a descodificar: ";
x = lee.nextInt();
}
cifrado = new int[x];

for(int i = 0;i < x;i++){
System.out.print("n3.-Introduzca el cifrado del caracter "+(int)(i + 1)+": ";
cifrado = lee.nextInt();
}
cesar(cifrado);
}

static void cesar(int [] cifrado){
System.out.print("nDescifrado: ";
for(int i = 0;i < x;i++){
int aux = cifrado - n % 27;
System.out.print((char)(aux));
}
}
}
0
0
0
0No comments yet