package com.github.awvalenti.corridapatrimonial.servidor.entradasaida.criptografia;

public enum AlgoritmoCriptografico {
	SEM_CRIPTOGRAFIA {
		@Override
		public String decifrar(String textoClaro, int chave) {
			return textoClaro;
		}

		@Override
		public String cifrar(String textoClaro, int chave) {
			// TODO Auto-generated method stub
			return null;
		}
	},

	CIFRA_DE_CESAR {
		@Override
		public String cifrar(String textoClaro, int chave) {
			StringBuilder textoCifrado = new StringBuilder();

			for (int i = 0; i < textoClaro.length(); ++i) {
				char caractereCifrado = textoClaro.charAt(i);

				char caractereFinal;

				if (!Character.isLetter(caractereCifrado)) {
					caractereFinal = caractereCifrado;

				} else {
					char extremo = Character.isUpperCase(caractereCifrado) ? 'Z' : 'z';
					int caractereDecifrado = caractereCifrado + chave;
					if (caractereDecifrado > extremo) caractereDecifrado -= 26;
					caractereFinal = (char) caractereDecifrado;
				}

				textoCifrado.append(caractereFinal);
			}

			return textoCifrado.toString();
		}

		@Override
		public String decifrar(String textoCifrado, int chave) {
			StringBuilder textoDecifrado = new StringBuilder();

			for (int i = 0; i < textoCifrado.length(); ++i) {
				char caractereCifrado = textoCifrado.charAt(i);

				char caractereFinal;

				if (!Character.isLetter(caractereCifrado)) {
					caractereFinal = caractereCifrado;

				} else {
					char extremo = Character.isUpperCase(caractereCifrado) ? 'A' : 'a';
					int caractereDecifrado = caractereCifrado - chave;
					if (caractereDecifrado < extremo) caractereDecifrado += 26;
					caractereFinal = (char) caractereDecifrado;
				}

				textoDecifrado.append(caractereFinal);
			}

			return textoDecifrado.toString();
		}
	},
	;

	public abstract String cifrar(String textoClaro, int chave);
	public abstract String decifrar(String textoCifrado, int chave);

	public static void main(String[] args) {
		String cifrado = CIFRA_DE_CESAR.cifrar("aAzZ comprar 123 $%%", 2);
		System.out.println(cifrado);
		System.out.println(CIFRA_DE_CESAR.decifrar(cifrado, 2));
		System.out.println(-1 % 26);
	}

}


@@ -155,34 +155,32 @@
 %09%09public String 
-de
 cifrar(String te
@@ -249,32 +249,34 @@
 %09%09public String 
+de
 cifrar(String te
@@ -271,35 +271,37 @@
 ar(String textoC
-lar
+ifrad
 o, int chave) %7B%0A
@@ -307,85 +307,143 @@
 %0A%09%09%09
-// TODO Auto-generated method stub%0A%09%09%09return null;%0A%09%09%7D%0A%09%7D,%0A%0A%09CIFRA_DE_CESAR %7B
+return textoCifrado;%0A%09%09%7D%0A%09%7D,%0A%0A%09CIFRA_DE_CESAR_ESTENDIDA %7B%0A%09%09private static final int MODULO_ARITMETICA_CHAR = Character.MAX_VALUE + 1;%0A
 %0A%09%09@
@@ -619,472 +619,92 @@
 %09%09%09%09
-char caractereCifrado = textoClaro.charAt(i);%0A%0A%09%09%09%09char caractereFinal;%0A%0A%09%09%09%09if (!Character.isLetter(caractereCifrado)) %7B%0A%09%09%09%09%09caractereFinal = caractereCifrado;%0A%0A%09%09%09%09%7D else %7B%0A%09%09%09%09%09char extremo = Character.isUpperCase(caractereCifrado) ? 'Z' : 'z';%0A%09%09%09%09%09int caractereDecifrado = caractereCifrado + chave;%0A%09%09%09%09%09if (caractereDecifrado %3E extremo) caractereDecifrado -= 26;%0A%09%09%09%09%09caractereFinal = (char) caractereDecifrado;%0A%09%09%09%09%7D%0A%0A%09%09%09%09textoCifrado.append(caractereFinal
+textoCifrado.append((char) ((textoClaro.charAt(i) + chave) %25 MODULO_ARITMETICA_CHAR)
 );%0A%09
@@ -936,476 +936,121 @@
 %09%09%09%09
-char caractereCifrado = 
 texto
-C
+Dec
 ifrado.
-charAt(i);%0A%0A%09%09%09%09char caractereFinal;%0A%0A%09%09%09%09if (!Character.isLetter
+append(
 (c
+h
 ar
-actereCifrado)) %7B%0A%09%09%09%09%09caractereFinal = caractereCifrado;%0A%0A%09%09%09%09%7D else %7B%0A%09%09%09%09%09char extremo = Character.isUpperCase(caractereCifrado) ? 'A' : 'a';%0A%09%09%09%09%09int caractereDecifrado = caractereCifrado - chave;%0A%09%09%09%09%09if (caractereDecifrado %3C extremo) caractereDecifrado += 26;%0A%09%09%09%09%09caractereFinal = (char) caractereDecifrado;%0A%09%09%09%09%7D%0A%0A%09%09%09%09textoDecifrado.append(caractereFinal
+) ((textoCifrado.charAt(i) - chave + MODULO_ARITMETICA_CHAR) %25 MODULO_ARITMETICA_CHAR)
 );%0A%09
@@ -1099,16 +1099,17 @@
 %09%09%7D%0A%09%7D,%0A
+%0A
 %09;%0A%0A%09pub
@@ -1237,243 +1237,7 @@
 );%0A%0A
-%09public static void main(String%5B%5D args) %7B%0A%09%09String cifrado = CIFRA_DE_CESAR.cifrar(%22aAzZ comprar 123 $%25%25%22, 2);%0A%09%09System.out.println(cifrado);%0A%09%09System.out.println(CIFRA_DE_CESAR.decifrar(cifrado, 2));%0A%09%09System.out.println(-1 %25 26);%0A%09%7D%0A%0A
 %7D%0A%0A

Cifra de César estendida