Atención, para ver el código correctamente acceda a la fuente: http://krode.org/cifrado-cesar-escrito-en-java/ .Gracias y disculpa las molestias.
El cifrado César original consiste en cifrar letras del abecedario mediante la rotación de las mismas. Por ejemplo si queremos cifrar la palabra “Hola”, en primer lugar establecemos una clave, 2 por ejemplo. Ahora tomamos la primera letra, H y la sustituimos por la letra que se encuentre dos posiciones por delante de esta es decir, H I J. Hacemos lo mismo con las demás letras: o p q, l m n, a b c. Y finalmente tendríamos nuestro “Hola” cifrado como “Jqnc”. Para descifrarlo se necesita la clave, 2 en nuestro caso, y seguir el proceso a la inversa. Aclaro el proceso con una imagen. En este caso la clave es 13 en lugar de 2.

Sin embargo el cifrado César que vas a ver es distinto al “tradicional” pues se basa en el código ASCII de los caracteres que queramos cifrar. Así pues, necesitaremos nuevamente una clave, un entero esencial para descifrar nuestro cifrado. Teniendo nuestros caracteres y la clave, a la que llamaremos n, la codificació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. A continuación podrás encontrar una tabla con el código ASCII seguida de un ejemplo, y al final, el código.
Pongamos un ejemplo:Introducimos la cadena “Hola mundo”. Esta se almacena en el String original. Seguidamente introducimos n y llamamos a el método cesar(). Dentro de cesar() dividimos la cadena original y la guardamos en temp. Con esto, podremos acceder a temp[0] por ejemplo, que será ‘H’ en nuestro caso. Creamos el objeto de tipo char cifrado declarando una longitud igual a la de la cadena original. cifrado almacenará la cadena cifrada. Iniciamos el bucle for, que tendrá como duración el tamaño de original. En x almacenaremos el código ASCII del elemento i de temp. Con .charAt(0) extraemos el carácter temp y mediante (int) hacemos un casting a entero que nos devolverá el código ASCII deseado. Para temp[0], que es H, el código ASCII será 72. A continuación modificamos el código ASCII con la fórmulaint y = x + n % 27. ‘y’ será el código ASCII del cifrado de ‘H’ para el valor de ‘n’ introducido. Ahora viene una parte muy importante del código, que es el if(y > 127), el cual en caso de que el nuevo código ASCII generado sea superior a 127, que es el tope de dicho sistema, cierra la cadena de caracteres ofreciendo siempre un carácter interpretable por el sistema. Por ejemplo, si tuviéramos x = 22, que es la ‘z’ en ASCII, y tras aplicar la fórmula nos quedara y = 140, este condicional restaría 127 a 14; y = 140 – 127 = 13 el cual sí que simboliza algo en ASCII. Si tratáramos de representar como carácter el 140 se produciría una excepción o el programa arrojaría símbolos desconocidos. Finalmente almacenamos el ASCII codificado en el elemento i de cifrado. Tras acabar de ejecutarse el método cesar() se volvería a main() donde se llamaría a mostrar(), método que nos mostraría el resultado del encriptado.El código para descifrar es igual, pero ala inversa y aplicando la fórmula y = x – n % 27. Próximamente pondré por aquí una versión de este programa pero con objetos y puede que otra con interfaz gráfica. Si alguien está especialmente interesado que lo comente. ¡Saludos!
Haz clic aquí para ver el código bien formateado (fuente externa).
public class Cesar {
static String original = " ";
static char[] 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: "


original = lee.nextLine();
System.out.print("Introduzca n: "


n = lee.nextInt();
cesar();
mostrar();
}
static void cesar(){
String[] temp = original.split(""


//poder acceder a cada carácter de forma individual
cifrado = new char[original.length()];//Asignamos el tamaño del vector que almacenará
//el carácter ASCII correspondiente al código cifrado
for(int i = 0;i < original.length() && ok == 1;i++){
int x = (int)(temp.charAt(0));//Guardamos en x el valor ASCII del carácter que se encuentre en
//temp. Para extraer el carácter empleamos el .charAt(0) y para
//convertirlo a entero, hacemos el casting a int.
int y = x + n % 27;//Codificamos el valor ASCII aplicando la fórmula (y = x + n % 27)
if(y > 127){
int v = y / 127;//Calcula las veces que ha superado 127, ej: 300 se pasa 2 veces
y = y - 128 * v;//Cerramos el bucle. Si el ASCII fuera 28 y n 1, y = 0 evitando errores
cifrado = (char)(y);
}
else
cifrado = (char)(y);
}
}
static void mostrar(){
System.out.print("Código sin cifrar: "+original);
System.out.print("nCódigo cifrado: "


for(int i = 0; i < cifrado.length; i++)
System.out.print(cifrado);
}
}
import java.util.Scanner;
public class desCesar {
static String original = " ";
static char[] desCifrado;
static int n;
static Scanner lee = new Scanner(System.in);
public static void main(String args[]){
System.out.print("Introduzca n: "


n = lee.nextInt();
System.out.print("Introduzca la cadena a decodificar: "


original = lee.next();
desCesar();
mostrar();
}
static void desCesar(){
String[] temp = original.split(""


desCifrado = new char[temp.length];//Asignamos el tamaño del código cifrado al
//String que almacenará el descifrado
for(int i = 0;i < temp.length;i++){
int y = (int)(temp.charAt(0));//Tomamos el valor ASCII del carácter cifrado
int x = y - n % 27;//Desciframos el valor ASCII
if(x > 127){
int v = x / 127;//Calcula las veces que ha superado 127, ej: 300 se pasa 2 veces
x = x - 128 * v;//Cerramos el bucle. Si el ASCII fuera 28 y n 1, y = 0 evitando errores
desCifrado = (char)(x);
}
else
desCifrado = (char)(x);
}
}
static void mostrar(){
System.out.print("Código cifrado: "+original);
System.out.print("nCódigo descifrado: "


for(int i = 0; i < desCifrado.length; i++)
System.out.print(desCifrado);
}
}