Cifrado Cesar

que tal de tarea me dejaron crear una clase que implementara el Cifrado Cesar
Cifrado Cesar

aqui esta mi codigo me gusto como me quedo que la quise compartir por aquí. de echo creo que esta es mi primera aportación de código xD.

CifradoCesar.java

si ven algún error por ahí díganme ya que es mi tarea hahaha..

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Bug

Tienes un bug en el cifrado de los números. Cifra 90 con codigo 13 y obtendrás 44.

Imagen de ezamudio

tip

El álgebra modular es esencial para implementar este algoritmo. Te ahorras varios while's e if's de los que pusiste en tu código.

Para no darte la respuesta en bandeja de plata, te pongo el algoritmo en Scala. Aunque se ve bastante distinto (me gusta más la verdad, por la expresividad), con que reacomodes 6 bloquecitos de ese código dentro de tu código Java, obtienes el mismo resultado y reduces bastante el tamaño de tu código.

def cesar(s:String,cod:Int)={
  def rotar(c:Char)=(c match {
    case d if Character.isDigit(d) => ((c-48 + cod) % 10) + 48
    case l if Character.isLowerCase(l) => ((c-97 + cod) % 26) + 97
    case u if Character.isUpperCase(u) => ((c-65 + cod) % 26) + 65
    case _ => c
  }).toChar
  s map rotar
}
Imagen de genitalico

ohh no habia visto ese error

ohh no habia visto ese error me cifra el 9 y el cero igual, xD.. shas ...

no entendi lo de los bloques osea que en lugar de usar los while para hacer la correcion del codigo na mas voy haciendo diviciones modulares dentro de las sumas del caracter mas el codigo? .. asi le enyendi..
y en lugar de verificar las mayusculas o minusculas y numeros con if tomo las clases de java que ya me hacen eso no?..

bueno lo de las clases ya se me habia ocurrio nada mas que pense, que no lo iban a validar por no hacer yo el algoritmo pero se mejor asi

creo que lo reprogramare todo haha..

Imagen de ezamudio

Problema...

De hecho mi código tiene un problema: Character.isLowerCase te devuelve true para áéíóú, y Character.isUpperCase te devuelve true para ÁÉÍÓÚ y no estoy seguro pero creo que también te dan true para ñ y Ñ respectivamente, igual para otras letras como äëïöüåâô etc... tu validación es más simple porque funciona solamente para las letras A-Z y a-z sin contar acentuadas ni nada de eso.

Pero bueno, lo principal es lo de la parte modular, con eso quitar varias condiciones y ciclos.

Imagen de genitalico

probare la parte modular, si

probare la parte modular, si la idea de mi codigo al menos cuando empece era por hacer el algoritmo de las mayusculas minusculas y numeros, y despues al final de todo eso el else que le puse era para que si alguien le metia por ahi algun caracter raro pues no tronara el programa si no que lo pasara por alto y no cifrara nada ..

aun no lo e echo en breve lo subo

Imagen de genitalico

ya quedo mas wapo el codigo

ya quedo mas wapo el codigo gracias ezamudio por la idea de hacer la aritmetica modular.. lo que es olvidar las matematicas xD..

hice algunos cambios uno de ellos es que las validaciones de numeros y letras las separe en una clase para posterior reutilizacion de codigo solo eso,
por lo demas del algoritmo el cambio fue hacer aritmetica modular ..

ValidacionAlfanumerica.java

CifradoCesar2.java

bueno el algoritmo anterior no lo cambie asi que sigue en el link , por si alguien quiere ver dos formas de solucionar un problema, solo que como comento ezamudio hay un bug igual lo deje comentado en el codigo..

por ultimo las dos clases dicen que esta en el package Caracteres ese paquete es uno que uso dentro de muchos algoritmos que estoy haciendo nada sin importancia lo pueden eliminar, yo no lo elimino ya que mi enlace apunta a mi directorio de proyecto y les advierto que si cambio algo del codigo algun dia, se reflejara en el link, asi que si seria mejor que alguien respalde el codigo si le interesa tal y como esta.

por cierto si alguien ve algun otro bug de alguna de las dos clases o me sugiere alguna optimizacion hay me dicen

pd: en la revision de la tarea ni cuenta se dieron del bug ¬¬ entregue el codigo anterior xD

Cifrado Cesar con clave

Hola, a ver si me pueden ayudar necesito hacer un algoritmo del código Cesar pero insertándole una palabra clave, sabemos que el código César es desplazar en el abecedario las palabras por ejemplo la palabra (mensaje) ABA si la ciframos con un desplazamiento 3 seria DED (mensaje cifrado).
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Posicion
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z TABLA
X Y Z A B C D E F G H I J K L M N O P Q R S T U V W NewTabla

Si le agregamos una palabra secreta o Clave, esta tabla se reordenaría ya que debemos insertar esta palabra secreta sin que se repitan la letras del abecedario en la posición o desplazamiento que nos indiquen y reordenando el abecedario; usando el ejemplo anterior insertando como palabra secreta MONONA, ABA se convertiría en XYX como mensaje cifrado
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Posicion
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z TABLA
X Y Z M O N A B C D E F G H I J K L P Q R S T U V W NEW TABLA

Yo solo he llegado hasta en convertir MONONA en MONA ya que la regla dice que no se deben repetir las letras les dejo mi avance
package cesar0;

import java.awt.event.ActionEvent;

public class Cesar
{
private String tabla = "abcdefghijklmnopqrstuvwxyzáéíóú 1234567890@.,;:-+*/$#¿?!¡=()[]{}";
// private String abc = "abcdefghijklmnopqrstuvwxyz";

public Cesar()
{

}
// ingreso un texto y se cifra por ejm aba desplazamiento 3 cifrado ded
public String Encriptar(String t, int key)
{
String texto = LimpiarCadena(t);
//aqui se almacenamos el resultado
String res = "";
for(int i = 0; i < texto.length();i++)
{
//busca la posicion del caracter en la variable tabla
int pos = tabla.indexOf(texto.charAt(i));
//realiza el reemplazo
if ((pos + key) < tabla.length())
{
res = res + tabla.charAt(pos+key);
}
else
{
res = res + tabla.charAt((pos+key) - tabla.length());
}
}
return res;
}

public String Desencriptar(String t, int key)
{
String texto = LimpiarCadena(t);
String res = "";
for(int i = 0; i < texto.length();i++)
{
int pos = tabla.indexOf(texto.charAt(i));
if ((pos - key) < 0){
res = res + tabla.charAt((pos-key) + tabla.length());
}
else
{
res = res + tabla.charAt(pos-key);
}
}
return res;
}

private String LimpiarCadena(String t)
{
//transforma el texto a minusculas
t = t.toLowerCase();
//eliminamos todos los retornos de carro
t = t.replaceAll("\n", "");
//eliminamos caracteres prohibidos
for(int i = 0; i < t.length();i++)
{
int pos = tabla.indexOf(t.charAt(i));
if (pos == -1){
t = t.replace(t.charAt(i), ' ');
}
}
return t;
}
//fin del proceso encriptar y desincriptar
public static void main(String[] args)
{

}

public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand().equals("btnSalir"))
{
System.exit(0);
}
if(e.getSource().equals("btnlongtext"))
{

}
if (e.getSource().equals("btnEstadistica"))
{

}
if (e.getSource().equals("btnArreglo"))
{

}

}

public void Limpiar()
{

}
//cifrar clave por ejm monona se resume a mona que es la new clave//
public String cifraXpalabClave(String t, String clv, int k)
{
String newClav="";
String texto = LimpiarCadena(t);
boolean esta;
char let;

String rep="";
for(int i = 0; i < clv.length()-1; i++)
{
let = clv.charAt(i);
esta = buscar(let, rep, clv);
if(!esta)
{
for(int j = i+1; j < clv.length(); j++)
{
if(let== clv.charAt(j))
rep = rep + j;
}
}
}

for(int i = 0; i < clv.length(); i++)
{
boolean existe = buscarClv(i, rep, clv);
if(!existe)
newClav = newClav +clv.charAt(i);
}
//return newClav;

String res = "";
for(int i = 0; i < texto.length();i++)
{
//busca la posicion del caracter en la variable tabla
int pos = tabla.indexOf(texto.charAt(i));
//realiza el reemplazo
if ((pos + k) < tabla.length())
{
res = res + tabla.charAt(pos+k);
}
else
{
res = res + tabla.charAt((pos+k) - tabla.length());
}
}
res = newClav + res;
return res;
}

public boolean buscarClv(int i, String rep, String clv)
{
//char let = clv.charAt(i);

int k = rep.indexOf(""+i);
if(k>=0)
return true;
else
return false;
}

public boolean buscar(char let, String rep, String clv)
{
for(int i=0; i