-
-
Save parzibyte/aa1310f96048211ec0669fc61f1d006b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Implementación del algoritmo ROT 1 (variante de ROT 13) | |
en Java | |
@author parzibyte | |
Visita: parzibyte.me/blog | |
*/ | |
class Main { | |
public static void main(String[] args) { | |
System.out.println("Rotando abcdefghijklmnopqrstuvwxyz ==>" + cifrarRot1("abcdefghijklmnopqrstuvwxyz")); | |
System.out.println("Rotando ABCDEFGHIJKLMNOPQRSTUVWXYZ ==>" + cifrarRot1("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); | |
String mensajeOriginal = "Hola, mundo! hacen algo hoy?"; | |
String mensajeCifrado = cifrarRot1(mensajeOriginal); | |
String mensajeDescifrado = descifrarRot1(mensajeCifrado); | |
System.out.println("Original: " + mensajeOriginal); | |
System.out.println("Cifrado: " + mensajeCifrado); | |
System.out.println("Descifrado: " + mensajeDescifrado); | |
} | |
public static String cifrarRot1(String cadenaOriginal) { | |
return rotar(cadenaOriginal, 1); | |
} | |
public static String descifrarRot1(String cadenaOriginal) { | |
return rotar(cadenaOriginal, -1); | |
} | |
public static String rotar(String cadenaOriginal, int rotaciones) { | |
// En ASCII, la a es 97, b 98, A 65, B 66, etcétera | |
final int LONGITUD_ALFABETO = 26, INICIO_MINUSCULAS = 97, INICIO_MAYUSCULAS = 65; | |
String cadenaRotada = ""; // La cadena nueva, la que estará rotada | |
for (int x = 0; x < cadenaOriginal.length(); x++) { | |
char caracterActual = cadenaOriginal.charAt(x); | |
// Si no es una letra del alfabeto entonces ponemos el char tal y como está | |
// y pasamos a la siguiente iteración | |
if (!Character.isLetter(caracterActual)) { | |
cadenaRotada += caracterActual; | |
continue; | |
} | |
int codigoAsciiDeCaracterActual = (int) caracterActual; | |
boolean esMayuscula = Character.isUpperCase(caracterActual); | |
// La posición (1 a 26) que ocupará la letra después de ser rotada | |
// El % LONGITUD_ALFABETO se utiliza por si se pasa de 26. Por ejemplo, | |
// la "z", al ser rotada una vez da el valor de 27, pero en realidad debería | |
// regresar a la letra "a", y con mod hacemos eso ya que 27 % 26 == 1, | |
// 28 % 26 == 2, etcétera ;) | |
int nuevaPosicionEnAlfabeto = ((codigoAsciiDeCaracterActual | |
- (esMayuscula ? INICIO_MAYUSCULAS : INICIO_MINUSCULAS)) + rotaciones) % LONGITUD_ALFABETO; | |
// Arreglar rotaciones negativas | |
if (nuevaPosicionEnAlfabeto < 0) | |
nuevaPosicionEnAlfabeto += LONGITUD_ALFABETO; | |
int nuevaPosicionAscii = (esMayuscula ? INICIO_MAYUSCULAS : INICIO_MINUSCULAS) + nuevaPosicionEnAlfabeto; | |
// Convertir el código ASCII numérico a su representación como símbolo o letra y | |
// concatenar | |
cadenaRotada += Character.toString((char) nuevaPosicionAscii); | |
} | |
return cadenaRotada; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment