Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Cifrado en JAVA

  • 6 Respuestas
  • 4503 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado DeBobiPro

  • *
  • Moderador
  • Mensajes: 293
  • Actividad:
    26.67%
  • Reputación 5
  • Como no sabía que era imposible, lo hice.
    • Ver Perfil
« en: Junio 11, 2015, 10:27:12 pm »
Les comparto un código que realicé en JAVA que cifra palabras o frases según una llave numérica que nosotro definamos


¿Cómo funciona?
Definimos una clave privada la cual usaremos para cifrar y desifrar el código ( esta clave tiene que ser numérica de largo variable)

Lo que hace es lo siguiente:

Si utilizamos la clave 9876 y la palabra "cifrado ejemplo" se ordenará de la siguiente manera

C  I  F R A D O     E  J   E  M P L O
9 8  7 6 9 8 7       6 9  8   7 6  9 8

finalmente hará un cifrado Cesar de X cantidad de saltos según el número asociado en el siguiente alfabeto
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 _ . , ; :

Si llega al final del alfabeto seguirá con el inicio.

Espero les sirva , acá el Code
Código: Java
  1. package cifradoJava;
  2.  
  3. public class CifradoJAVA {
  4.         static char ALFA[] = {'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', '_', '.', ',', ';', ':'};
  5.         static int count = 0, pos;
  6.         static String aux,encrypt;
  7.        
  8.     static String Cifrar(String key, String phrase) {
  9.         count = 0;
  10.         aux = "";
  11.         encrypt = "";
  12.         for (int i = 0; i < phrase.length(); i++) {
  13.  
  14.             if (!" ".equals(phrase.substring(i, i + 1))) {
  15.                 aux = aux + key.substring(count, count + 1);
  16.                 count++;
  17.             } else {
  18.                 aux = aux + " ";
  19.             }
  20.  
  21.             if (count > key.length() - 1) {
  22.                 count = 0;
  23.             }
  24.         }
  25.  
  26.         for (int i = 0; i < phrase.length(); i++) {
  27.  
  28.             for (int j = 0; j < ALFA.length; j++) {
  29.                 if (String.valueOf(ALFA[j]).equalsIgnoreCase(phrase.substring(i, i + 1))) {
  30.                     pos = j + Integer.parseInt(aux.substring(i, i + 1));
  31.  
  32.                     if (pos >= ALFA.length) {
  33.                         pos = pos - ALFA.length;
  34.                     }
  35.                     encrypt = encrypt + ALFA[pos];
  36.                 }
  37.                 if (phrase.substring(i, i + 1).equalsIgnoreCase(" ")) {
  38.                     encrypt = encrypt + " ";
  39.                     j = ALFA.length;
  40.                 }
  41.             }
  42.  
  43.         }
  44.  
  45.         //System.out.println(phrase);
  46.         //System.out.println(aux);
  47.         //System.out.println(encrypt);
  48.         return encrypt;
  49.     }
  50.  
  51.     static String Decifrar(String key, String phrase) {
  52.         count = 0;
  53.         aux = "";
  54.         encrypt = "";
  55.         for (int i = 0; i < phrase.length(); i++) {
  56.  
  57.             if (!" ".equals(phrase.substring(i, i + 1))) {
  58.                 aux = aux + key.substring(count, count + 1);
  59.                 count++;
  60.             } else {
  61.                 aux = aux + " ";
  62.             }
  63.  
  64.             if (count > key.length() - 1) {
  65.                 count = 0;
  66.             }
  67.         }
  68.  
  69.         for (int i = 0; i < phrase.length(); i++) {
  70.  
  71.             for (int j = 0; j < ALFA.length; j++) {
  72.                 if (String.valueOf(ALFA[j]).equalsIgnoreCase(phrase.substring(i, i + 1))) {
  73.                     pos = j - Integer.parseInt(aux.substring(i, i + 1));
  74.  
  75.                     if (pos < 0) {
  76.                         pos = (ALFA.length) - pos;
  77.                     }
  78.                     //System.out.println("pos: "+pos);
  79.                     encrypt = encrypt + ALFA[pos];
  80.                 }
  81.                 if (phrase.substring(i, i + 1).equalsIgnoreCase(" ")) {
  82.                     encrypt = encrypt + " ";
  83.                     j = ALFA.length;
  84.                 }
  85.             }
  86.  
  87.         }
  88.         return encrypt;
  89.     }
  90.  
  91.     public static void main(String[] args) {
  92.  
  93.         String phrase = "debobipro";
  94.         String key = "9876"; //Cualquier número
  95.  
  96.         System.out.println(Cifrar(key, phrase));
  97.         System.out.println(Decifrar(key, Cifrar(key, phrase)));
  98.  
  99.     }
  100.  
  101. }

Que lo aprovechen :)!
« Última modificación: Junio 12, 2015, 10:25:37 am por DeBobiPro »
Nivel 77 TERCER OJO

Desconectado Gus Garsaky

  • *
  • Underc0der
  • Mensajes: 93
  • Actividad:
    0%
  • Reputación -1
    • Ver Perfil
  • Skype: gus.garsaky
« Respuesta #1 en: Junio 12, 2015, 10:13:07 am »
Gracias por el source, DeBobi. Como pequeña recomendación, trata de documentar los métodos para que sea mas easy to read.


Salu2.

Conectado DeBobiPro

  • *
  • Moderador
  • Mensajes: 293
  • Actividad:
    26.67%
  • Reputación 5
  • Como no sabía que era imposible, lo hice.
    • Ver Perfil
« Respuesta #2 en: Junio 12, 2015, 10:14:39 am »
si si, ayer estaba medio pillado, lo tengo casi documentado ya :3

Gracias por la recomendación
Nivel 77 TERCER OJO

Desconectado Snifer

  • *
  • Underc0der
  • Mensajes: 1439
  • Actividad:
    0%
  • Reputación 1
  • [email protected]'s
    • Ver Perfil
    • Snifer@L4bs
  • Twitter: sniferl4bs
« Respuesta #3 en: Junio 12, 2015, 01:20:55 pm »
Cuenta considerar caracteres especiales como ser @ ;).

Regards,
Snifer
http://www.sniferl4bs.com


Llaman traidor a la persona que evito que caiga el foro, gente bruta!



Desconectado Adalher

  • *
  • Underc0der
  • Mensajes: 37
  • Actividad:
    1.67%
  • Reputación 0
    • Ver Perfil
« Respuesta #4 en: Mayo 29, 2019, 05:43:04 pm »
Hola DeBobiPro,

1) Solo puedo ponerte en el corazón: ocúpate más intensamente con fundamentos y especialmente con convenciones de código.
2) Aquí no quiero ser vil pero: si está haciendo un pequeño ejercicio de programación en la escuela que utiliza el cifrado César como contenido, no significa eso que el código resultante sea de alguna utilidad para el público en general. Solo sirve para el propio entrenamiento personal de quien hace el ejercicio - nada más. Para TODO lo que se publica como resultado de un ejercicio habrá mejores soluciones. Estoy muy seguro de eso. Por ejemplo para el tema: cifrado.
Y, si uno piensa: “Eso no está pensado para algún uso productivo, sino como una ayuda para las personas que realizan este ejercicio o un ejercicio similar" entonces digo: No, ni siquiera eso. Primero, el resultado del trabajo de tales ejercicios suele ser tan deficiente en calidad que solo sirve como un ejemplo negativo, y en segundo lugar, deberían hacer otros, que hacen tal ejercicio, los ejercicios ellos mismos y no copiarlos. Pues el propósito de tales ejercicios no es el resultado/código final, sino la experiencia de llegar allí.

Saludos

Desconectado ravenheart

  • *
  • Underc0der
  • Mensajes: 6
  • Actividad:
    0%
  • Reputación 1
    • Ver Perfil
« Respuesta #5 en: Mayo 30, 2019, 06:05:38 pm »
A lo mejor el autor ya ha aprendido la lección en los últimos cuatro años ;)

Pero ya que abres el debate...

Primero, el resultado del trabajo de tales ejercicios suele ser tan deficiente en calidad que solo sirve como un ejemplo negativo
¿Y por qué es este un ejemplo negativo? ¿Qué harías de otra forma, y por qué?

Desconectado Adalher

  • *
  • Underc0der
  • Mensajes: 37
  • Actividad:
    1.67%
  • Reputación 0
    • Ver Perfil
« Respuesta #6 en: Junio 03, 2019, 10:29:35 am »
Hola ravenheart,

un detalle: los nombres de los métodos en Java se escriben por convención en lowerCamelCase.
Generalmente, los métodos para cifrar y descifrar están demasiado sobrecargados y difíciles de entender porque DeBobiPro ha puesto todos los pasos del cifrado/descifrado en un método. Además, el cambia las variables de clase dentro de los métodos. Estas variables pueden ser variables locales dentro de los métodos porque DeBobiPro no desea transportar información a través de múltiples llamadas de métodos con esas variables. Entonces esto evita un posible Multithreading (llamada de sus métodos desde múltiples Threads hacia afuera).
Los pasos individuales, así como se ven en DeBobiPro, son:
1. Asignar la frase a una secuencia de valores clave/números clave (su primer bucle).
2. Encontrar el índice de un carácter en el alfabeto (el bucle interno dentro del segundo bucle).
3. “Offsettear” este índice con el valor clave/dígito clave calculado en el paso uno.
4. Componer el resultado (en la variable 'encrypt').
5. Además, atender siempre el espacio.
Yo separaría más estos aspectos individuales, de tal forma que este claro qué cosa sucede exactamente y donde.
Por diversión, se ha construido una realización funcional del cifrado (usen jOOL https://github.com/jOOQ/jOOL - según algunas opiniones, esto debería ser parte del JRE, pero da igual…) y se ha dividido más los pasos.
Código: Java
  1. import static java.util.stream.IntStream.range;
  2. import static org.jooq.lambda.Seq.seq; // <- https://github.com/jOOQ/jOOL
  3. import java.util.ArrayList;
  4. import java.util.function.Supplier;
  5. import java.util.stream.Stream;
  6. public class VerschlüsselungJAVA2 {
  7.   private final static int ALFA[] = {
  8.     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  9.     'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '_', '.', ',', ';', ':'
  10.   };
  11.   private static Supplier<? extends IllegalArgumentException> characterNotInAlphabet(int cp) {
  12.     return () -> new IllegalArgumentException("Character not in alphabet: " + Character.toString(cp));
  13.   }
  14.   private static int alphaAt(int index) {
  15.     return ALFA[index % ALFA.length];
  16.   }
  17.   public static String encrypt(String key, String phrase) {
  18.     // zip the phrase characters with the exclusive prefix
  19.     // sum mapping the space to 0 and every other character to 1,
  20.     // lookup the alphabet character and offset by the key digit
  21.     // at the index provided by the prefix sum
  22.     return seq(phrase.chars())
  23.           .map(Character::toUpperCase)
  24.           .zip(keyIndicesOf(phrase))
  25.           .map(t -> t.v1 == ' ' ? ' ' : alphaAt(offset(t.v1, key, t.v2)))
  26.           .map(Character::toString)
  27.           .toString();
  28.   }
  29.   private static int findAlphabetIndexOf(int cp) {
  30.     // 'C' -> 2
  31.     return range(0, ALFA.length)
  32.           .filter(i -> ALFA[i] == cp)
  33.           .findFirst()
  34.           .orElseThrow(characterNotInAlphabet(cp));
  35.   }
  36.   private static int offset(int phraseChar, String key, int keyIndex) {
  37.     // Find the index of the phrase character and offset by the digit at the key index
  38.     return findAlphabetIndexOf(phraseChar)
  39.          + key.charAt(keyIndex % key.length()) - '0';
  40.   }
  41.   private static Stream<Integer> keyIndicesOf(String phrase) {
  42.     // Exclusive prefix sum of the stream producing
  43.     // 0 for spaces and 1 for every other character
  44.     // "abc de f" -> [0, 1, 2, 2, 3, 4, 4, 5]
  45.     return phrase.chars()
  46.           .map(c -> isIgnored(c) ? 0 : 1)
  47.           .collect(ArrayList<Integer>::new,
  48.                    (l, v) -> l.add(v + (l.isEmpty() ? 0 : l.get(l.size() - 1))),
  49.                    (l1, l2) -> {}).stream()
  50.           .map(i -> i - 1);
  51.   }
  52.   private static boolean isIgnored(int c) {
  53.     return c == ' ';
  54.   }
  55.   public static void main(String[] args) {
  56.     String phrase = "cifrado ejemplo";
  57.     String key = "9876"; // Cualquier número
  58.     System.out.println(encrypt(key, phrase));
  59.   }
  60. }
  61.  

Independientemente de la implementación real: el cifrado César NUNCA es razonable. Hay mejores métodos para cifrar.
Déjame intentar aclarar lo que realmente se quiere expresar con esto: El cifrado es relativamente complejo. Cuando se trata de cifrado, hay que tener en cuenta muchos aspectos. Ya el generador aleatorio de números aleatorios juega un papel importante. Los conceptos básicos ya son tan complejos que ellos obtienen su propia conferencia. Encriptaciones de César tan simples son una broma. Ellas pueden ser descifradas por ataques triviales. A esto entonces, de niño, ya basta con leer un libro correspondiente (Así que tenía un libro ? ? ? con acertijos en aquel entonces. Pues en un tiempo eso también era precisamente un tema…).
Y solo un ejemplo que muestra la complejidad:
Después de que se supo que alguien está trabajando para la NSA en un gran sistema operativo de código abierto y de que la confianza se había ido de repente, se necesitaron dos semanas (creo) solamente para ver si existía un debilitamiento del cifrado y cómo había llegado a existir este. Solo se tenía que comprobar los Commits de la persona.
U otro tema:
Imagínate que escribes un algoritmo que muestre de qué forma está ese algoritmo actualmente detrás del cifrado SSL. Uno podría pensar: Hurra, algoritmo logrado. Se ve bien. Pero no - incluso ahí hay muchos expertos que optimizan constantemente y descartan cosas antiguas! Por lo tanto, pertenece a la administración tanto en el cliente como en el lado del servidor, qué algoritmos se querrá permitir para el acceso SSL.
Por consiguiente, el cifrado no es tan trivial. Y si se desea tener un cifrado que conserve el formato, entonces también existen posibilidades correspondientes (https://en.wikipedia.org/wiki/Format-preserving_encryption).
En general, se debe tener en cuenta que, con trabajos de desarrollo tan pequeños en la escuela y en el estudio, el aprendizaje está en primer plano. Allí se simplifica mucho. Entonces, de ahí se querrá escribir un árbol de búsqueda ordenado y equilibrado, pero eso no jugará ningún papel más más adelante porque se obtendrá soluciones mucho mejores (con mejor rendimiento), en donde además se utilizan hashcodes (Por lo tanto, el tipo de datos almacenado ya no necesita implementar un Comparable) y mucho más.
Si se quiere se puede hacer esto hasta tal punto que al final se tiene una base de datos In Memory o una base de datos en donde todo está almacenado con un Caching adecuado.
Así que, por favor, que no se tome esto personalmente, pero la evaluación del código para tareas estándar es correspondientemente así.

Saludos
« Última modificación: Junio 03, 2019, 10:31:18 am por Adalher »

 

¿Te gustó el post? COMPARTILO!



[Video Curso] Iniciacion a Java por DesarrolloWeb y EscuelaIT Mayo 2014

Iniciado por graphixx

Respuestas: 3
Vistas: 3524
Último mensaje Febrero 23, 2015, 10:13:28 am
por Hu3c0
[LIBRO] Programación avanzada en Java - Sonia Jaramillo Valbuena

Iniciado por graphixx

Respuestas: 5
Vistas: 8098
Último mensaje Enero 23, 2019, 07:14:41 pm
por jashin
Java Extremo [Video Cursos Completos] [Español] [ISO] 2009

Iniciado por graphixx

Respuestas: 9
Vistas: 9036
Último mensaje Diciembre 04, 2017, 02:36:34 am
por graphixx
Como compilar programas Java en la consola de comandos de Windows

Iniciado por tar3kw0rm3d

Respuestas: 2
Vistas: 3876
Último mensaje Junio 04, 2013, 02:55:07 pm
por tar3kw0rm3d
[VIDEOTUTORIAL] Java 7 (2011) Creación de aplicaciones de escritorio

Iniciado por graphixx

Respuestas: 3
Vistas: 5422
Último mensaje Diciembre 13, 2017, 12:15:55 pm
por Jean Grey