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

Taller de Criptografia con Algoritmos en java

  • 1 Respuestas
  • 635 Vistas

0 Usuarios y 3 Visitantes están viendo este tema.

Conectado user_en1gm4

  • *
  • Underc0der
  • Mensajes: 39
  • Actividad:
    10%
  • Reputación 2
  • 01 01
    • Ver Perfil
    • Email
« en: Abril 22, 2018, 01:01:03 pm »
Hola compañer@s, hoy quiero hacer este taller ya que me gusta mucho todo este tema y quisiera compartirles algo de lo que se, se trata de un taller de criptografia con algoritmos paso a paso hechos por mi, de diferentes tipos de cifrado empezando por los clasicos hasta llegar a los actuales (en algunos todavia estoy trabajando, los mas complejos), en este taller enseñare paso a paso como codear estos algoritmos con ejemplos graficos, ademas de diversas actividades para los mas curiosos y que quieran aprender de mas.


Sugerencia saber de java (los algoritmos seran codeados en este lenguaje) y algo de estructura de datos (arrays,matrices,listas,codigo ASCII), bueno sin mas que decirles voy a comenzar.

Aca voy a colocar todos los algoritmos: mega.nz/#F!puQDVbqT!nhqABKFKf_69iqKIE-09iQ
Quiero decir algo y esque en esto de la programacion hay muchas formas de hacer algo, esta es mi forma los algortimos no estan hechos por un programador profesional ni nada, soy un estudiante todavia pero me gusta mucho esto, asi que quise compartirlo.


TALLER DE CRIPTOGRAFIA


Empecemos definiendo que es, para que se utiliza la criptografia y sus objetivos:

-  CRIPTOGRAFIA
 
La palabra Criptografía proviene del griego "kryptos" que significa oculto, y "graphia", que significa escritura, y su definición según el dicccionario es "Arte de escribir con clave secreta o de un modo enigmático". La Criptografía es una técnica, o más bien un conjunto de técnicas, que originalmente tratan sobre la protección o el ocultamiento de la información frente a observadores no autorizados. Es parte de un campo de estudios que trata las comunicaciones secretas,  Estas técnicas se utilizan tanto en el arte como en la ciencia y en la tecnología. Por tanto, el único objetivo de la criptografía era conseguir la confidencialidad de los mensajes, para lo cual se diseñaban sistemas de cifrado y códigos.

La criptografia es algo muy antiguo, no es algo que nace con la informatica, si no que era usada miles de años antes por egipcios, romanos,tambien en la primera y segunda guerra mundial.

Aca les dejo una buena introduccion a la criptografia si quieren saber mas a fondo y un poco de su historia, les recomiendo que revisen los links que les dejo a lo largo del taller para complementar lo que aca esta escrito.

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Wikipedia: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


- OBJETIVOS DE LA CRIPTOGRAFIA

En la criptografia tenemos 3 objetivos principales, es lo que se quiere conseguir despues de aplicar alguna tecnica criptografica a alguna informacion o comunicacion

  • Confidencialidad:
  • Es decir, garantiza que la información sea accesible únicamente a personal autorizado.
  • Integridad:
  • Grantiza que la informacion no sea modificada y se mantanga tal cual se creo
  • Autentificacion:
Es decir proporciona mecanismos que permiten verificar la identidad del comunicador, osea que quien envia el mensaje o informacion se confirme que venga de el

Nota:
No me extendere tanto explicando todo esto ya que en los link que les deje esta toda esa informacion y aun mas(en google podrian buscar criptografia y saldrian millones de resultados), el fin de este taller es entender como funcionan las tecnicas y poder codearlos


- TIPOS DE CRIPTOGRAFIA

  • Criptografia Simetrica:
La criptografía simétrica solo utiliza una clave para cifrar y descifrar el mensaje, que tienen que conocer el emisor y el receptor previamente. Es la comunicación de las claves entre ambos sujetos el punto débil del sistema, ya que resulta más fácil interceptar una clave que se ha transmitido sin seguridad

   
  • Criptografia Asimetrica:
Un algoritmo de criptografía asimétrica utiliza dos claves para el envío de mensajes. Las dos claves pertenecen a la persona que recibe el mensaje. Se utiliza una clave para encriptar y otra para desencriptar. La clave que se emplea para cifrar se llama clave pública y se puede entregar a cualquier persona. (De hecho hay hasta servidores de claves públicas). La magia es que si el cifrado se ha hecho con una clave pública sólo podre desencriptar con una clave distinta de la primear asociada. Es decir: dos claves matemáticamente relacionadas de manera que lo que cifras con una solo lo puedes descifrar con la otra.

   
  • Criptografia Hibrida:
es un método criptográfico que usa tanto un cifrado simétrico como un asimétrico. Emplea el cifrado de clave pública para compartir una clave para el cifrado simétrico. El mensaje que se esté enviando en el momento, se cifra usando su propia clave privada, luego el mensaje cifrado se envía al destinatario. Ya que compartir una clave simétrica no es seguro, ésta es diferente para cada sesión.


Mas informacion
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


Bueno muchachos ya despues de entender estos conceptos y de que estamos hablando vamos a empezar con algunos algoritmos de la criptografia clasica


- CRIPTOGRAFIA CLASICA

Son las tecnicas utilizadas antiguamente por romanos, egipcios y guerras que pasaron hace muchos años y no querian que sus mensajes fueran revelados, entre estas tecnicas se encuentran:

Cifrado Cesar
 
Segun Wikipedia:

En criptografía, el cifrado César, también conocido como cifrado por desplazamiento, código de César o desplazamiento de César, es una de las técnicas de cifrado más simples y más usadas. Es un tipo de cifrado por sustitución en el que una letra en el texto original es reemplazada por otra letra que se encuentra un número fijo de posiciones más adelante en el alfabeto. Por ejemplo, con un desplazamiento de 3, la A sería sustituida por la D (situada 3 lugares a la derecha de la A), la B sería reemplazada por la E, etc. Este método debe su nombre a Julio César, que lo usaba para comunicarse con sus generales.



Como se ve en la imagen solo se trata de correr un caracter 3 posiciones mas adelante, bueno y ahora si empezamos a codear:

Voy a crear una Clase  main que se llame CifradoCesar, luego creare un scanner para leer por medio del teclado y luego pedire el mensaje, de esta forma:

Código: Java
  1.  
  2. public class CifradoCesar {
  3.  
  4.         public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  5.                 // TODO Auto-generated method stub
  6.                
  7.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ------------------");
  8.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO CESAR * |");
  9.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ------------------");
  10.                
  11.                 //Scanner
  12.                 Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  13.  
  14.  
  15.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  16.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  17.                 }
  18.         }
  19.  
  20.                


Listo, ahora voy a crear una funcion que se llame Cifrar_Cesar y me reciba por parametros un mensaje que sera tipo String, esta funcion se encarga de convertir el mensaje en un array de caracteres (char) para luego por medio el codigo ascii obtener el numero del caracter y sumarle 3, por ejemplo la letra 'a' en codigo ascci sera el numero 97 y si a ese numero le sumamos 3,  97+3 = 100;
y 100 es el codigo ascii de la letra  'd' y como se ve en la imagen anterior se corre 3 letras, y de esta manera vamos a realizar el cifrado caracter por caracter y luego lo concatenamos a un String que sera nuestra salida de la funcion o cipher (texto ya cifrado)

Tabla de CODIGO ASCII: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Código: Java
  1.        
  2.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Cifrar_Cesar(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje){
  3.                 //Texto a salir (cfrado)
  4.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher = "";
  5.                 //Posiciones a adelantar
  6.                 int adelantar = 3;
  7.                
  8.                 //Convertimos el mansaje en un array de caracteres
  9.                 char [] letras = mensaje.toCharArray();
  10.  
  11.                 //Vamos por cada caracter sumandole 3
  12.                 for(int i=0;i<letras.length;i++){
  13.                        
  14.                         // de esta manera obtenemos el codigo ascii del caracter  ((int) letras[i])
  15.                         // luego a ese numero le sumamos 3 ( ((int) letras[i])+ adelantar)  <- quedaria asi
  16.                         // y luego convertimos ese numero en la letra a la que hace
  17.                         // referencia en el codigo ascii solo casteando el numero a (char)
  18.  
  19.                         cipher += (char)( ((int) letras[i])+ adelantar) ;
  20.                 }
  21.  
  22.                 //Texto cifrado
  23.                 return cipher;
  24.         }
  25.  



Listo ya tenemos nuestra funcion que cifra, la podre a prueba cifrando el mensaje:  Alan Mathison Turing


Y nos dio como resultado: Dodq#Pdwklvrq#Wxulqj 
que si lo revisamos nos damos cuenta que si hace lo que esperabamos,
la letra A + 3posiciones = letra D, luego la letra 'l' + 3 posiciones = letra 'o' y asi sucesivamente, listo ya tenemos nuestra funcion de cifrar.


Bueno ahora necesitamos una funcion que coja el cipher(texto cifrado) y nos devuelva nuestro mensaje normal
Para esto creare una funcion que se llamara Descifrar_Cesar y me reciba por parametro un String que sera el cipher para luego hacer casi lo anterior de la funcion cifrar pero en vez de sumarle 3 al codigo ascii le voy a restar 3 para volverlo a la posicion normal, no la comentare tanto porque hace casi lo mismo que la anterior solo que no suma sino resta posiciones

Código: Java
  1.  
  2.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Descifrar_Cesar(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher){
  3.                
  4.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje = "";
  5.                 //Posiciones a atrasar
  6.                 int adelantar = 3;
  7.                 //Caracteres del mensaje
  8.                 char [] letras = cipher.toCharArray();
  9.                 for(int i=0;i<letras.length;i++){
  10.                         mensaje += (char)( ((int) letras[i])- adelantar) ;
  11.                 }
  12.                 return mensaje;
  13.         }
  14.  

Listo ya tenemos nuestras dos funciones de cifrar y descifrar vamos a ponerlas a prueba!, en el main  pido un mensaje y lo mando a cifrar, luego ese mensaje cifrado lo mando a descifrar y nos debe mostrar nuestro texto cifrado y nuestro texto normal luego de pasar por estas funciones, quedaria algo asi:

Código: Java
  1.  
  2. public class CifradoCesar {
  3.  
  4.         public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  5.                 // TODO Auto-generated method stub
  6.                
  7.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ------------------");
  8.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO CESAR * |");
  9.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ------------------");
  10.                
  11.                 //Scanner
  12.                 Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  13.  
  14.  
  15.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  16.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  17.                
  18.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n-------------------------------");
  19.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher =Cifrar_Cesar(mensaje);
  20.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Cifrado: "+cipher);
  21.  
  22.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login descifrado = Descifrar_Cesar(cipher);
  23.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("-------------------------------");
  24.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Descifrado: "+descifrado);
  25.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("-------------------------------");
  26.  
  27.         }
  28.        
  29.        
  30.        
  31.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Cifrar_Cesar(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje){
  32.                 //Texto a salir (cfrado)
  33.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher = "";
  34.                 //Posiciones a adelantar
  35.                 int adelantar = 3;
  36.                
  37.                 //Convertimos el mansaje en un array de caracteres
  38.                 char [] letras = mensaje.toCharArray();
  39.  
  40.                 //Vamos por cada caracter sumandole 3
  41.                 for(int i=0;i<letras.length;i++){
  42.                        
  43.                         // de esta manera obtenemos el codigo ascii del caracter
  44.                         //  ((int) letras[i]) y luego a ese numero le sumamos 3
  45.                         // ( ((int) letras[i])+ adelantar) <- quedaria asi
  46.                         // y luego convertimos ese numero en la letra a la que hace
  47.                         // referencia en el codigo ascii solo casteando el numero a (char)
  48.                         cipher += (char)( ((int) letras[i])+ adelantar) ;
  49.                 }
  50.                 //Texto cifrado
  51.                 return cipher;
  52.         }
  53.        
  54.        
  55.        
  56.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Descifrar_Cesar(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher){
  57.                
  58.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje = "";
  59.                 //Posiciones a atrasar
  60.                 int adelantar = 3;
  61.                 //Caracteres del mensaje
  62.                 char [] letras = cipher.toCharArray();
  63.                 for(int i=0;i<letras.length;i++){
  64.                         mensaje += (char)( ((int) letras[i])- adelantar) ;
  65.                 }
  66.                 return mensaje;
  67.         }
  68.  
  69. }
  70.  
  71.  

y al ejecutarlo daria este resultado:


Listo ya tenemos nuestro algoritmo de Cifrado del Cesar!

EJERCICIO #1
Utilize el algoritmo para descifra este mensaje: r{>tzA-r??n-y|p|
Pero ahora en vez de correr solo 3 caracteres lo tendra que hacer corriendo 13 caracteres, igual para descifrar, suerte!



Cifrado Polibio

Se trata de un algoritmo trivial, donde cada letra del alfabeto es reemplazada por las coordenadas de su posición en un cuadrado. Es un caso particular de transposición mono-alfabética. osea tenemos una matriz llena de caracteres y vamos por cada caracter del mensaje y el cipher resultante seran las posiciones del caracter en la matriz

Link:
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Por ejemplo tenemos esta matriz llena de caracteres, (el abecedario)


Por ejemplo si queremos cifrar el texto HOLA en base a esta matriz lo que tendriamos que hacer seria ubicar la posicion de cada letra del mensaje , la letra H se encuentra en la fila 2 columna 3 entonces nuestro ciper seria 23 por ahora, luego vamos con la O que esta en la fila 3 - columna 3, nuestro cipher ahoa sera 23 33 y asi con todas las letras del mensaje en base a la posicion en que se encuentren en la matriz

HOLA = 23 33 31 11

Para que el mensaje sea correctamente cifrado, en la matriz se deben encontrar todos los caracteres que lo componten, osea en este ejemplo si nuestro mensaje hubiera llevado alguna numero no cifraria bien ya que en la matriz no hay ningun numero y asi, pero se puede hacer una matriz mas grande, para el algoritmo utilizare una de 7x7 para agregar los numeros y algunos signos

Listo sabiendo esto ahora empezaremos a codear:

Voy a crear una clase main llamada CifradoPolibio en la cual como anteriormente lo hicimos voy a pedir un mensaje:


Código: Java
  1.  
  2.  
  3. public class CifradoPolibio {
  4.  
  5.         public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  6.  
  7.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  8.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO POLIBIO * |");
  9.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  10.                 Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  11.  
  12.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  13.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  14.         }
  15.                   }
  16.  


Bueno y como este tipo de cifrado requiere una matriz voy a crear la mia, que sera de 7*7 , contendre numeros y signos, quedaria algo asi:

Código: Java
  1.  
  2. public class CifradoPolibio {
  3.  
  4.         public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  5.                 // TODO Auto-generated method stub
  6.  
  7.        
  8.                
  9.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  10.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO POLIBIO * |");
  11.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  12.                 Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  13.  
  14.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  15.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  16.  
  17.                             char [][] matris = {{'a','b','c','d','e','f','g'},
  18.                                                         {'h','i','j','k','l','m','n'},
  19.                                                         {'ñ','o','p','q','r','s','t'},
  20.                                                         {'u','v','w','x','y','z','1'},
  21.                                                         {'2','3','4','5','6','7','8'},
  22.                                                         {'9','0','_','-',' ','.',','},
  23.                                                         {'$','#','%','&','+','*','/'}};
  24.                     }
  25.              }
  26.  
  27.  


Listo ya tenemos nuestra matriz y en base a esta todos nuestros mensajes se van a cifrar

Bueno ahora vamos a crear una funcion que se llame Cifrar_Polibio que nos reciba por parametro un String que sera nuestro mensaje y una matriz de caracteres char [][], y en base a estos datos cifrar


Código: Java
  1.  
  2.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] Cifrar_Polibio(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje, char [][] matris ){
  3.                
  4.                 //Se crea un array de el tamaño del mensaje ingresado
  5.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] cipher = new You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [mensaje.toCharArray().length];
  6.  
  7.                 //Se convierte el mensaje en un array de char
  8.                 char [] msj =  mensaje.toCharArray();
  9.                
  10.                
  11.                
  12.                 //Va por todas las letras del mensaje
  13.                 for(int h=0;h<msj.length;h++){
  14.                
  15.                         //Va por todas las filas y columnas de la matriz
  16.                         //Hasta encontrar el caracter
  17.                 for(int i=0;i<matris.length;i++){
  18.                        
  19.                         for(int j=0;j<matris[1].length;j++){
  20.                                
  21.                                 //Si lo encuentra
  22.                                 if(matris[i][j]== msj[h]){
  23.                                        
  24.                                         //Guarda en nuestro array cipher las posiciones
  25.                                         //de el caracter i para las filas y j para las columnas
  26.                                         cipher[h]=You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.toString(i)+You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.toString(j);
  27.                                
  28.                                         //sale del ciclo apenas lo encuentra
  29.                                         break;
  30.                                 }      
  31.                         }
  32.                 }
  33.                         // Va imprimiendo el cipher (mensaje ya cifrado)
  34.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(cipher[h]+" ");
  35.                 }
  36.                 //Retorna el cipher
  37.                 return cipher;
  38.                
  39.         }
  40.        
  41.  

y listo ya tendremos nuestra funcion que cifra, ahora haremos el paso inverso, vamos a cojer el cipher(texto cifrado) y como en este estan las posiciones de el caracter del mensaje en la matriz solo seria ir a la matriz y buscar en esa posicion y alla esta la letra a la que corresponde, vamos a crear una funcion que nos haga esto, la funcion recibe un cipher (texto cifrado), que sera un array de char, el mismo que la funcion cifrar retorna y una matriz de caracteres como parametros:

Código: Java
  1.        
  2.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Descifrar_Polibio(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] cipher,char [][] matris){
  3.                
  4.                 //Un array con la direccion de el caracter [fila][columna]
  5.                 char [] direccion;
  6.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje ="";
  7.                 //
  8.                 //Vamos por todas las posiciones del cipher
  9.                 for(int i=0;i<cipher.length;i++){
  10.  
  11.                         //Convertimos la direccion en un array de char
  12.                  direccion = cipher[i].toCharArray();
  13.                
  14.                         // sabemos que en la posicion 0 esta la fila y en la posicion 1 esta la columna
  15.                  //buscamos en la matriz el caracter que este en esa posicion y lo vamos concatenando al mensaje normal
  16.                
  17.                          mensaje+=matris[You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.getNumericValue( direccion[0])][You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.getNumericValue(direccion[1])];
  18.                  
  19.         }
  20.                 //Imprime el mensaje ya descifrado
  21.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println(mensaje);
  22.                        
  23.                         //Retorna el mensaje
  24.                 return mensaje;
  25.         }
  26.        
  27.  

Y listo ya tendriamos nuestras dos funciones listas, mandamos a cifrar y descifrar en el main y nos quedari algo asi:
(no olviden que en java las posiciones empiezan en 0, ademas de esto cree una funcion imprimir para ver la matriz

Código: Java
  1. import java.util.Scanner;
  2.  
  3.         public class CifradoPolibio {
  4.        
  5.                 public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  6.                         // TODO Auto-generated method stub
  7.        
  8.                         char [][] matris = {{'a','b','c','d','e','f','g'},
  9.                                                                 {'h','i','j','k','l','m','n'},
  10.                                                                 {'ñ','o','p','q','r','s','t'},
  11.                                                                 {'u','v','w','x','y','z','1'},
  12.                                                                 {'2','3','4','5','6','7','8'},
  13.                                                                 {'9','0','_','-',' ','.',','},
  14.                                                                 {'$','#','%','&','+','*','/'}};
  15.                        
  16.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  17.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO POLIBIO * |");
  18.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  19.                         Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  20.        
  21.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  22.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  23.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\nMatriz");
  24.                         Imprimir(matris);
  25.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print("\nCifrado: ");
  26.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] cipher = Cifrar_Polibio(mensaje,matris);
  27.                 sc.close();
  28.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print("\nDescifrado: ");
  29.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login msj = Descifrar_Polibio(cipher,matris);
  30.                
  31.                
  32.                
  33.         }
  34.        
  35.         public static void Imprimir(char [][] matris){
  36.                 for(int i=0;i<matris.length;i++){
  37.                        
  38.                         for(int j=0;j<matris[i].length;j++){
  39.                                
  40.                                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(matris[i][j]+" ");
  41.                         }
  42.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("");
  43.                 }
  44.         }
  45.        
  46.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] Cifrar_Polibio(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje, char [][] matris ){
  47.                
  48.                 //Se crea un array de el tamaño del mensaje ingresado
  49.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] cipher = new You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [mensaje.toCharArray().length];
  50.  
  51.                 //Se convierte el mensaje en un array de char
  52.                 char [] msj =  mensaje.toCharArray();
  53.                
  54.                
  55.                
  56.                 //Va por todas las letras del mensaje
  57.                 for(int h=0;h<msj.length;h++){
  58.                
  59.                         //Va por todas las filas y columnas de la matriz
  60.                         //Hasta encontrar el caracter
  61.                 for(int i=0;i<matris.length;i++){
  62.                        
  63.                         for(int j=0;j<matris[1].length;j++){
  64.                                
  65.                                 //Si lo encuentra
  66.                                 if(matris[i][j]== msj[h]){
  67.                                        
  68.                                         //Guarda en nuestro array cipher las posiciones
  69.                                         //de el caracter i para las filas y j para las columnas
  70.                                         cipher[h]=You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.toString(i)+You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.toString(j);
  71.                                
  72.                                         //sale del ciclo apenas lo encuentra
  73.                                         break;
  74.                                 }      
  75.                         }
  76.                 }
  77.                         // Va imprimiendo el cipher (mensaje ya cifrado)
  78.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(cipher[h]+" ");
  79.                 }
  80.                 //Retorna el cipher
  81.                 return cipher;
  82.                
  83.         }
  84.        
  85.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Descifrar_Polibio(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] cipher,char [][] matris){
  86.                
  87.                 //Un array con la direccion de el caracter [fila][columna]
  88.                 char [] direccion;
  89.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje ="";
  90.                 //
  91.                 //Vamos por todas las posiciones del cipher
  92.                 for(int i=0;i<cipher.length;i++){
  93.                         //Convertimos la direccion en un array de char
  94.                  direccion = cipher[i].toCharArray();
  95.                
  96.                         // sabemos que en la posicion 0 esta la fila y en la posicion 1 esta la columna
  97.                  //buscamos en la matriz el caracter que este en esa posicion y lo vamos concatenando al mensaje normal
  98.                
  99.                          mensaje+=matris[You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.getNumericValue( direccion[0])][You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.getNumericValue(direccion[1])];
  100.                  
  101.         }
  102.                 //Imprime el mensaje ya descifrado
  103.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println(mensaje);
  104.                        
  105.                         //Retorna el mensaje
  106.                 return mensaje;
  107.         }
  108.        
  109. }
  110.  
  111.  


Vamos a utilizarlo cifrando el mensaje: en1gm4 programa
(recuerden que los caracteres del mensaje deben estar en la matriz si no nunca encontrar la posicion y nos generara error)


nos da como cipher: 04 16 36 06 15 42 54 22 24 21 06 24 00 15 00
y si revisamos la posicion: fila 0 columna 4 = e , y si lo hacemos con todo el cipher nos daremos cuenta que si hace lo que queriamos, listo!

EJERCICIO #2
Utilize el algoritmo para descifra este mensaje:
 00 14 06 30 16 54 03 11 00 54 04 16 02 21 16 26 24 00 24 00 25 54 14 21 25 54 23 30 04 54 01 30 25 02 00 25

En base a la matriz que se ve anteriormente en el programa, a mano!



Cifrado Playfair

Les dejare un video para que entiendan este tipo de cifrado ya que graficamente se entiende mucho mejor que si me pongo a copiar aca toda la teoria, necesito que entiendan bien como funciona para luego empezar a codearlo

Videos





Basicamente el cifrado consiste en una matriz con la que se cifra, la matriz se genera en base a la clave ya que esta se escribe en la matriz sin caracteres repetidos y luego si se termina de llenar la matriz con el resto de caracteres del abecedario sin repetir, numeros y signos si se desea

Se parte el mensaje en parejas por ejemplo HOLA quedaria HO LA y asi con todo el mensaje, luego ubicamos las dos letras en la matriz y miramos:

- Si estan en la misma fila se le suma una posicion a la columna de cada letra
- Si estan en la misma Columna se le suma una posicion a la fila de cada letra
-Si no estan ni en la misma Columna ni en la misma fila, se coloca su diagonal opuesta
 

Y listo sabiendo como funciona este cifrado vamos a empezar, primero voy a crear una clase main llamada CifradoPlayfair y hare lo mismo de siempre pedire un mensaje pero ahora tambien necesitaremos una clave asi que tambien la pediremos, seria algo asi:


Código: Java
  1. public class CifradoPlayfair {
  2.  
  3.        
  4.         public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  5.                 // TODO Auto-generated method stub
  6.  
  7.                
  8.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  9.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO PLAYFAIR * |");
  10.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  11.                 Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  12.  
  13.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  14.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  15.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese la Clave:  ");
  16.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave  = sc.nextLine();
  17.                                    }
  18.             }
  19.  

Bueno ya teniendo estos datos ahora voy a crear una funciona que se llame Cifrado_Playfair que recibe como parametro el mensaje y la clave, bueno antes de concentrarnos en esta funcion tambien eh creado unas funciones auxiliares que me ayudan a generar la matris y a generar las parejas de caracteres del mensaje

Con esta funcion genero la matriz en base a la clave:

Código: Java
  1. public static char [][] GenerarMatriz (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave){
  2.                  char [][] matris = new char [7][7];
  3.  
  4.                 char [] caracteresClave = clave.toCharArray();
  5.                 char [] numeros = {'0','1','2','3','4','5','6','7','8','9'};
  6.                 char [] letras = new char [26];
  7.                 char [] signos = {'+','-','$','&',',','.',' ','_','*','%','=','?','¿'};
  8.                 LinkedHashSet<Character> caracteresMatriz = new LinkedHashSet<>();
  9.                
  10.        
  11.                
  12.                 //Eliminamos las letras repetidas de a clave
  13.                 //Se ingresa la clave sin caracteres repetidos a la coleccion que tendra todos los caracteres de la matris
  14.                
  15.                 for(int k=0;k<caracteresClave.length;k++){
  16.                         caracteresMatriz.add(caracteresClave[k]);      
  17.                 }
  18.                
  19.                 //Se generan las letras del abecedario en base al codigo ASCII
  20.                 for(int i=97;i<123;i++){
  21.                         letras[i-97] = (char)i;
  22.                 }
  23.                
  24.                
  25.                
  26.                 //Se ingresa el resto del abecedario
  27.                 for(int i=0;i<letras.length;i++){
  28.                         caracteresMatriz.add(letras[i]);
  29.                 }
  30.                
  31.                 //Se ingresan los numeros
  32.                 for(int i=0;i<numeros.length;i++){
  33.                         caracteresMatriz.add(numeros[i]);
  34.                 }
  35.                
  36.                 //Se ingresan los signos
  37.                 for(int i=0;i<signos.length;i++){
  38.                         caracteresMatriz.add(signos[i]);
  39.                         }
  40.                
  41.                 //Se convierte el linkedhashSet en un array para luego meterlo en la matriz
  42.                 int cont;
  43.                 char [] arrayTemporal = new char [caracteresMatriz.size()];
  44.                 cont=0;
  45.                 for(char caracter:caracteresMatriz){
  46.                         arrayTemporal[cont]=caracter;
  47.                         cont++;
  48.                 }
  49.                
  50.                
  51.                
  52.                 //Se ingresan a la matriz todos los caracteres (con esto tendriamos nuestra matriz lista)
  53.                 cont=0;
  54.                 for(int i=0;i<matris.length;i++){
  55.                         for(int j=0;j<matris[0].length;j++){
  56.                                 matris[i][j]=arrayTemporal[cont];
  57.                                 cont++;
  58.                         }
  59.                        
  60.                 }
  61.                
  62.                 return matris;
  63.         }
  64.  


y Listo con esta funcion ya generamos nuestra matriz en base a la clave, ahora necesitamos una funcion que nos forme cadenas de caracteres, si la cadena tiene un tamaño impar se le agrega el caracter 'x' al final para que sea par y tambien sabiendo que si hay dos caractere repetidos coloque una x en la mitad, por ejemplo:
LLAVE -> LXLAVE 
para que en el momento de cifrar no queden cifras iguales pegadas y pues un sabrian que es una letra que se repite como la ll o la rr algo asi.

Esta funcion recibe por parametro el mensaje y nos devuelve una matris de parejas de caracteres con la anterior regla, una salvedad, en los videos dice que al mensaje se le deben eliminar los espacios, yo en la matriz  ingrese en caracter espacio para no tener que hacer esto y que los mensajes se descifren igual como el original:

Código: Java
  1.         public static char [][] GenerarParejas(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje){
  2.                
  3.                 int tam = mensaje.length();
  4.                
  5.                 //Se revisa que no alla caracteres repetidos consecutivamente como "llave"
  6.                 //tendria que queda lxlave
  7.                
  8.                 char [] revision= mensaje.toCharArray();
  9.                 ArrayList<Character> arrayRevision = new ArrayList<>();
  10.                 for(int i=0;i<mensaje.length();i++){
  11.                         arrayRevision.add(revision[i]);
  12.                
  13.                         if(i+1<revision.length){
  14.                         if(revision[i]==revision[i+1]){
  15.                                 arrayRevision.add('x');
  16.                                
  17.                                                                                 }
  18.                                                 }
  19.                                 }
  20.                
  21.                 //Revisamos que el mensaje quede de un tamaño par si no es asi agregamos x al final para volverlo par
  22.                 if(arrayRevision.size()%2!=0){
  23.                         arrayRevision.add('x');
  24.                 }
  25.                
  26.                
  27.                 //Se forma una matris de 2 columnas para las parejas de caracteres
  28.                 char [][] parejaCaracteres= new char [arrayRevision.size()/2][2];
  29.                 int cont =0;
  30.                 for(int i=0;i<parejaCaracteres.length;i++){
  31.                         for(int j=0;j<parejaCaracteres[1].length;j++){
  32.                                 parejaCaracteres[i][j]=arrayRevision.get(cont);
  33.                                 cont++;
  34.                         }
  35.                 }
  36.                
  37.                 return parejaCaracteres;
  38.         }
  39.  


Listo ya tenemos dos funciones listas, pero ahora vamos a necesitar ayuda de una tercera funcion que se va a encargar de darme la posicion  de un caracter en la matriz para poder aplicar las reglas de que si esta en la misma fila o columna... etc
Bueno la funcion me recibe como parametros un caracter que sera en que vamos a buscar y una matriz en la cual vamos a buscar el caracter, quedaria algo asi:

Código: Java
  1.        
  2. public static int[] ObtenerPosicionCaracter(char caracter,char [][] matris){
  3.                
  4.                 int [] direccion = new int [2];
  5.                
  6.                
  7.                 for(int i =0;i<matris.length;i++ ){
  8.                        
  9.                         for(int j=0;j<matris[i].length;j++){
  10.                                
  11.                                 if(caracter == matris[i][j]){
  12.                                         //fila
  13.                                           direccion[0]=i;
  14.                                            //columna
  15.                                         direccion[1]=j;
  16.                                 }
  17.                         }
  18.        
  19.                 }
  20.        
  21.                 return direccion;
  22.                
  23.         }
  24.  

y Listo ya tenemos nuestras funciones listas para utilizar en nuestra funcion de cifrar, que nos recibe un mensaje y una clave como parametros, genera la matriz en base a la clave, genera las parejas de caracteres y va por cada pareja de caracteres aplicando las reglas, quedaria algo asi:

Código: Java
  1.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Cifrado_Playfair(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje,You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave){
  2.  
  3.                 //Se genera la matriz
  4.                 char [][] matris = GenerarMatriz(clave);
  5.                 //Se generan las parejas de caracteres
  6.                 char [][] parejaCaracteres = GenerarParejas(mensaje);
  7.                
  8.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n \t Matriz");
  9.                 //Imprimimos la matriz con la misma funcion que hemos utilizado
  10.                 //en todo el taller
  11.                 Imprimir(matris);
  12.                
  13.                 //Se imprimen las parejas de caracteres
  14.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n \t Parejas de caracteres");
  15.                 Imprimir(parejaCaracteres);
  16.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher = "";
  17.                
  18.                 //Los array de direcciones de las dos letras
  19.                 int [] direcciones ;   
  20.                 int [] direcciones2;
  21.                 int columna =0;
  22.                 //Se va por todas las parejas de caracteres
  23.                 for(int i=0;i<parejaCaracteres.length;i++){
  24.                
  25.                
  26.                         // Se manda a obtener las posiciones de los caracteres
  27.                         direcciones= ObtenerPosicionCaracter(parejaCaracteres[i][columna],matris);
  28.                         columna++;
  29.                         direcciones2= ObtenerPosicionCaracter(parejaCaracteres[i][columna],matris);
  30.                        
  31.                        
  32.                         if(columna==1){
  33.                                 columna=0;
  34.                         }
  35.                        
  36.                         // Se guardan en variables para asi comparar las reglas
  37.                         int fila1= direcciones[0];
  38.                         int columna1= direcciones[1];
  39.                        
  40.                         int fila2= direcciones2[0];
  41.                         int columna2= direcciones2[1];
  42.                        
  43.                        
  44.                         // Si estan en la misma fila se le suma +1 a la columna
  45.                         int fTemporal;
  46.                         if(fila1==fila2){
  47.                                 fTemporal= columna1+1;
  48.                                 if(fTemporal==matris.length){
  49.                                         fTemporal=0;
  50.                                 }
  51.                                
  52.                                 cipher+=matris[fila1][fTemporal];
  53.                                
  54.                                
  55.                                 fTemporal = columna2+1;
  56.                                 if(fTemporal==matris.length){
  57.                                         fTemporal=0;
  58.                                 }
  59.                                
  60.                                 cipher+=matris[fila2][fTemporal];
  61.                         }              
  62.                        
  63.                        
  64.                         // si estan en la misma columna se le suma +1 a la fila
  65.                         int cTemporal;
  66.                         if(columna1==columna2){
  67.                                
  68.                                 cTemporal = fila1+1;
  69.                                
  70.                                 if(cTemporal == matris.length){
  71.                                         cTemporal=0;
  72.                                 }
  73.                                
  74.                                 cipher+= matris[cTemporal][columna1];
  75.                                
  76.                                 cTemporal = fila2+1;
  77.                                
  78.                                 if(cTemporal == matris.length){
  79.                                         cTemporal=0;
  80.                                 }
  81.                                
  82.                                 cipher+= matris[cTemporal][columna2];
  83.                                
  84.                                
  85.                         }      
  86.                        
  87.                         // si no cumple ninguna de las anteriores
  88.                         // se coloca la diagonal opuesta, se invierten las columnas
  89.                        
  90.                         if(fila1!=fila2 & columna1!=columna2){
  91.                                
  92.                                 cipher+=matris[fila1][columna2];
  93.                                 cipher+=matris[fila2][columna1];
  94.                                
  95.  
  96.                                                 }
  97.                 }
  98.                
  99.                 // se retorna el cipher
  100.                 return cipher;
  101.         }
  102.  

Y listo ya tendriamos nuestra funcion de cifrar lista!, ahora vamos a programar nuestra funcion de descifrar que hace casi lo mismo que la anterior pero de para atras xd, esta funcion nos recibe como parametros el mensaje y la clave, quedari algo asi


Código: Java
  1.  
  2.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Descifrado_Playfair(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher,You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave){
  3.                
  4.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje ="";
  5.                
  6.                 char [][] matris= GenerarMatriz(clave);
  7.                 char [][] parejas = GenerarParejas(cipher);
  8.                
  9.                 int [] direcciones;
  10.                 int [] direcciones2;
  11.                
  12.                 int columnas=0;
  13.                 for(int i=0;i<parejas.length;i++){
  14.                        
  15.                        
  16.                         direcciones= ObtenerPosicionCaracter(parejas[i][columnas],matris);
  17.                         columnas++;
  18.                        
  19.  
  20.                         int fila1= direcciones[0];
  21.                         int columna1= direcciones[1];
  22.  
  23.                        
  24.                         direcciones2= ObtenerPosicionCaracter(parejas[i][columnas],matris);
  25.                         if(columnas==1){columnas=0;}
  26.                        
  27.                         int fila2= direcciones2[0];
  28.                         int columna2= direcciones2[1];
  29.                        
  30.                         //Filas iguales ya no se suma , si no que ahora se resta -1 a la columna
  31.                         int fTemporal;
  32.                         if(fila1==fila2){
  33.                                 fTemporal= columna1-1;
  34.                                 if(fTemporal<0){
  35.                                         fTemporal=matris.length-1;
  36.                                 }
  37.                                
  38.                                 mensaje+=matris[fila1][fTemporal];
  39.                                
  40.                                
  41.                                 fTemporal = columna2-1;
  42.                                 if(fTemporal<0){
  43.                                         fTemporal=matris.length-1;
  44.                                 }
  45.                                
  46.                                 mensaje+=matris[fila2][fTemporal];
  47.                         }              
  48.                        
  49.                        
  50.                         int cTemporal;
  51.                         //Columnas iguales ya no se suma , si no que ahora se resta -1 a la fila
  52.  
  53.                         if(columna1==columna2){
  54.                                
  55.                                 cTemporal = fila1-1;
  56.                                
  57.                                 if(cTemporal<0){
  58.                                         cTemporal=matris.length-1;
  59.                                 }
  60.                                
  61.                                 mensaje+= matris[cTemporal][columna1];
  62.                                
  63.                                 cTemporal = fila2-1;
  64.                                
  65.                                 if(cTemporal<0){
  66.                                         cTemporal=matris.length-1;
  67.                                 }
  68.                                
  69.                                 mensaje+= matris[cTemporal][columna2];
  70.                                
  71.                                
  72.                         }      
  73.                        
  74.                         //Si no se cumple ninguna se coloca la diagonal opuesta, esto no cambia
  75.                         if(fila1!=fila2 & columna1!=columna2){
  76.                                
  77.                                 mensaje+=matris[fila1][columna2];
  78.                                 mensaje+=matris[fila2][columna1];
  79.  
  80.                         }
  81.                        
  82.                 }
  83.                
  84.                 return mensaje;
  85.         }
  86.        
  87.        
  88.  



Aca la funcion imprimir por si les genera error :v, es una simple funcion que me imprime una matriz:

Código: Java
  1. public static void Imprimir(char [][] matris){
  2.                 for(int i=0;i<matris.length;i++){
  3.                         for(int j=0;j<matris[i].length;j++){
  4.                                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(matris[i][j]+" ");
  5.  
  6.                         }
  7.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("");
  8.  
  9.                 }
  10.         }
  11.  

Y bueno ya tendriamos nuestra funcion de cifrado y descifrado compañer@s!
el programa completo quedaria algo asi:

Código: Java
  1. import java.util.ArrayList;
  2. import java.util.LinkedHashSet;
  3. import java.util.Scanner;
  4.  
  5. public class CifradoPlayfair {
  6.  
  7.        
  8.         public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  9.                 // TODO Auto-generated method stub
  10.  
  11.                
  12.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  13.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO PLAYFAIR * |");
  14.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ---------------------");
  15.                 Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  16.  
  17.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  18.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  19.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese la Clave:  ");
  20.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave  = sc.nextLine();
  21.                        
  22.                
  23.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher = Cifrado_Playfair(mensaje,clave);
  24.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje2 = Descifrado_Playfair(cipher,clave);
  25.                
  26.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\nCipher: "+cipher);
  27.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Mensaje descifrado: "+mensaje2);
  28.                
  29.         }
  30.        
  31.  
  32.        
  33.        
  34.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Descifrado_Playfair(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher,You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave){
  35.                
  36.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje ="";
  37.                
  38.                 char [][] matris= GenerarMatriz(clave);
  39.                 char [][] parejas = GenerarParejas(cipher);
  40.                
  41.                 int [] direcciones;
  42.                 int [] direcciones2;
  43.                
  44.                 int columnas=0;
  45.                 for(int i=0;i<parejas.length;i++){
  46.                        
  47.                        
  48.                         direcciones= ObtenerPosicionCaracter(parejas[i][columnas],matris);
  49.                         columnas++;
  50.                        
  51.  
  52.                         int fila1= direcciones[0];
  53.                         int columna1= direcciones[1];
  54.  
  55.                        
  56.                         direcciones2= ObtenerPosicionCaracter(parejas[i][columnas],matris);
  57.                         if(columnas==1){columnas=0;}
  58.                        
  59.                         int fila2= direcciones2[0];
  60.                         int columna2= direcciones2[1];
  61.                        
  62.                         //Filas iguales ya no se suma , si no que ahora se resta -1 a la columna
  63.                         int fTemporal;
  64.                         if(fila1==fila2){
  65.                                 fTemporal= columna1-1;
  66.                                 if(fTemporal<0){
  67.                                         fTemporal=matris.length-1;
  68.                                 }
  69.                                
  70.                                 mensaje+=matris[fila1][fTemporal];
  71.                                
  72.                                
  73.                                 fTemporal = columna2-1;
  74.                                 if(fTemporal<0){
  75.                                         fTemporal=matris.length-1;
  76.                                 }
  77.                                
  78.                                 mensaje+=matris[fila2][fTemporal];
  79.                         }              
  80.                        
  81.                        
  82.                         int cTemporal;
  83.                         //Columnas iguales ya no se suma , si no que ahora se resta -1 a la fila
  84.  
  85.                         if(columna1==columna2){
  86.                                
  87.                                 cTemporal = fila1-1;
  88.                                
  89.                                 if(cTemporal<0){
  90.                                         cTemporal=matris.length-1;
  91.                                 }
  92.                                
  93.                                 mensaje+= matris[cTemporal][columna1];
  94.                                
  95.                                 cTemporal = fila2-1;
  96.                                
  97.                                 if(cTemporal<0){
  98.                                         cTemporal=matris.length-1;
  99.                                 }
  100.                                
  101.                                 mensaje+= matris[cTemporal][columna2];
  102.                                
  103.                                
  104.                         }      
  105.                        
  106.                         //Si no se cumple ninguna se coloca la diagonal opuesta, esto no cambia
  107.                         if(fila1!=fila2 & columna1!=columna2){
  108.                                
  109.                                 mensaje+=matris[fila1][columna2];
  110.                                 mensaje+=matris[fila2][columna1];
  111.  
  112.                         }
  113.                        
  114.                 }
  115.                
  116.                 return mensaje;
  117.         }
  118.        
  119.        
  120.        
  121.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login Cifrado_Playfair(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje,You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave){
  122.  
  123.                 //Se genera la matriz
  124.                 char [][] matris = GenerarMatriz(clave);
  125.                 //Se generan las parejas de caracteres
  126.                 char [][] parejaCaracteres = GenerarParejas(mensaje);
  127.                
  128.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n \t Matriz");
  129.                 //Imprimimos la matriz con la misma funcion que hemos utilizado
  130.                 //en todo el taller
  131.                 Imprimir(matris);
  132.                
  133.                 //Se imprimen las parejas de caracteres
  134.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n \t Parejas de caracteres");
  135.                 Imprimir(parejaCaracteres);
  136.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login cipher = "";
  137.                
  138.                 //Los array de direcciones de las dos letras
  139.                 int [] direcciones ;   
  140.                 int [] direcciones2;
  141.                 int columna =0;
  142.                 //Se va por todas las parejas de caracteres
  143.                 for(int i=0;i<parejaCaracteres.length;i++){
  144.                
  145.                
  146.                         // Se manda a obtener las posiciones de los caracteres
  147.                         direcciones= ObtenerPosicionCaracter(parejaCaracteres[i][columna],matris);
  148.                         columna++;
  149.                         direcciones2= ObtenerPosicionCaracter(parejaCaracteres[i][columna],matris);
  150.                        
  151.                        
  152.                         if(columna==1){
  153.                                 columna=0;
  154.                         }
  155.                        
  156.                         // Se guardan en variables para asi comparar las reglas
  157.                         int fila1= direcciones[0];
  158.                         int columna1= direcciones[1];
  159.                        
  160.                         int fila2= direcciones2[0];
  161.                         int columna2= direcciones2[1];
  162.                        
  163.                        
  164.                         // Si estan en la misma fila se le suma +1 a la columna
  165.                         int fTemporal;
  166.                         if(fila1==fila2){
  167.                                 fTemporal= columna1+1;
  168.                                 if(fTemporal==matris.length){
  169.                                         fTemporal=0;
  170.                                 }
  171.                                
  172.                                 cipher+=matris[fila1][fTemporal];
  173.                                
  174.                                
  175.                                 fTemporal = columna2+1;
  176.                                 if(fTemporal==matris.length){
  177.                                         fTemporal=0;
  178.                                 }
  179.                                
  180.                                 cipher+=matris[fila2][fTemporal];
  181.                         }              
  182.                        
  183.                        
  184.                         // si estan en la misma columna se le suma +1 a la fila
  185.                         int cTemporal;
  186.                         if(columna1==columna2){
  187.                                
  188.                                 cTemporal = fila1+1;
  189.                                
  190.                                 if(cTemporal == matris.length){
  191.                                         cTemporal=0;
  192.                                 }
  193.                                
  194.                                 cipher+= matris[cTemporal][columna1];
  195.                                
  196.                                 cTemporal = fila2+1;
  197.                                
  198.                                 if(cTemporal == matris.length){
  199.                                         cTemporal=0;
  200.                                 }
  201.                                
  202.                                 cipher+= matris[cTemporal][columna2];
  203.                                
  204.                                
  205.                         }      
  206.                        
  207.                         // si no cumple ninguna de las anteriores
  208.                         // se coloca la diagonal opuesta, se invierten las columnas
  209.                        
  210.                         if(fila1!=fila2 & columna1!=columna2){
  211.                                
  212.                                 cipher+=matris[fila1][columna2];
  213.                                 cipher+=matris[fila2][columna1];
  214.                                
  215.  
  216.                                                 }
  217.                 }
  218.                
  219.                 // se retorna el cipher
  220.                 return cipher;
  221.         }
  222.        
  223.        
  224. public static int[] ObtenerPosicionCaracter(char caracter,char [][] matris){
  225.                
  226.                 int [] direccion = new int [2];
  227.                
  228.                
  229.                 for(int i =0;i<matris.length;i++ ){
  230.                        
  231.                         for(int j=0;j<matris[i].length;j++){
  232.                                
  233.                                 if(caracter == matris[i][j]){
  234.                                         direccion[0]=i;
  235.                                         direccion[1]=j;
  236.                                 }
  237.                         }
  238.        
  239.                 }
  240.        
  241.                 return direccion;
  242.                
  243.         }
  244.        
  245.         public static char [][] GenerarParejas(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje){
  246.                
  247.                 int tam = mensaje.length();
  248.                
  249.                 //Se revisa que no alla caracteres repetidos consecutivamente como "llave"
  250.                 //tendria que queda lxlave
  251.                
  252.                 char [] revision= mensaje.toCharArray();
  253.                 ArrayList<Character> arrayRevision = new ArrayList<>();
  254.                 for(int i=0;i<mensaje.length();i++){
  255.                         arrayRevision.add(revision[i]);
  256.                
  257.                         if(i+1<revision.length){
  258.                         if(revision[i]==revision[i+1]){
  259.                                 arrayRevision.add('x');
  260.                                
  261.                                                                                 }
  262.                                                 }
  263.                                 }
  264.                
  265.                 //Revisamos que el mensaje quede de un tamaño par si no es asi agregamos x al final para volverlo par
  266.                 if(arrayRevision.size()%2!=0){
  267.                         arrayRevision.add('x');
  268.                 }
  269.                
  270.                
  271.                 //Se forma una matris de 2 columnas para las parejas de caracteres
  272.                 char [][] parejaCaracteres= new char [arrayRevision.size()/2][2];
  273.                 int cont =0;
  274.                 for(int i=0;i<parejaCaracteres.length;i++){
  275.                         for(int j=0;j<parejaCaracteres[1].length;j++){
  276.                                 parejaCaracteres[i][j]=arrayRevision.get(cont);
  277.                                 cont++;
  278.                         }
  279.                 }
  280.                
  281.                 return parejaCaracteres;
  282.         }
  283.        
  284.        
  285.        
  286.        
  287.         public static char [][] GenerarMatriz (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave){
  288.                  char [][] matris = new char [7][7];
  289.  
  290.                 char [] caracteresClave = clave.toCharArray();
  291.                 char [] numeros = {'0','1','2','3','4','5','6','7','8','9'};
  292.                 char [] letras = new char [26];
  293.                 char [] signos = {'+','-','$','&',',','.',' ','_','*','%','=','?','¿'};
  294.                 LinkedHashSet<Character> caracteresMatriz = new LinkedHashSet<>();
  295.                
  296.        
  297.                
  298.                 //Eliminamos las letras repetidas de a clave
  299.                 //Se ingresa la clave sin caracteres repetidos a la coleccion que tendra todos los caracteres de la matris
  300.                
  301.                 for(int k=0;k<caracteresClave.length;k++){
  302.                         caracteresMatriz.add(caracteresClave[k]);      
  303.                 }
  304.                
  305.                 //Se generan las letras del abecedario en base al codigo ASCII
  306.                 for(int i=97;i<123;i++){
  307.                         letras[i-97] = (char)i;
  308.                 }
  309.                
  310.                
  311.                
  312.                 //Se ingresa el resto del abecedario
  313.                 for(int i=0;i<letras.length;i++){
  314.                         caracteresMatriz.add(letras[i]);
  315.                 }
  316.                
  317.                 //Se ingresan los numeros
  318.                 for(int i=0;i<numeros.length;i++){
  319.                         caracteresMatriz.add(numeros[i]);
  320.                 }
  321.                
  322.                 //Se ingresan los signos
  323.                 for(int i=0;i<signos.length;i++){
  324.                         caracteresMatriz.add(signos[i]);
  325.                         }
  326.                
  327.                 //Se convierte el linkedhashSet en un array para luego meterlo en la matriz
  328.                 int cont;
  329.                 char [] arrayTemporal = new char [caracteresMatriz.size()];
  330.                 cont=0;
  331.                 for(char caracter:caracteresMatriz){
  332.                         arrayTemporal[cont]=caracter;
  333.                         cont++;
  334.                 }
  335.                
  336.                
  337.                
  338.                 //Se ingresan a la matriz todos los caracteres (con esto tendriamos nuestra matriz lista)
  339.                 cont=0;
  340.                 for(int i=0;i<matris.length;i++){
  341.                         for(int j=0;j<matris[0].length;j++){
  342.                                 matris[i][j]=arrayTemporal[cont];
  343.                                 cont++;
  344.                         }
  345.                        
  346.                 }
  347.                
  348.                 return matris;
  349.         }
  350.        
  351.         public static void Imprimir(char [][] matris){
  352.                 for(int i=0;i<matris.length;i++){
  353.                         for(int j=0;j<matris[i].length;j++){
  354.                                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(matris[i][j]+" ");
  355.  
  356.                         }
  357.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("");
  358.  
  359.                 }
  360.         }
  361.        
  362.        
  363.  
  364. }
  365.  
  366.  
  367.  


Listo ahora lo pondre a funcionar con el mensaje: colombia tierra querida
y con la clave:  user_$
(recuerden que los caracteres del mensaje deben estar en la matriz, para este taller no utilizare nada de mayusculas ni simbolos raros)



y me da como resultado:

Cipher: hkmpjfpis1da_w_u.tsrafie
Mensaje descifrado: colombia tierxra querida

queda tierxra porque le pusimos la regla de que en las repetidas colocara una x en la mitad recuerden,

Y listo ya tendriamos otro algoritmo listo!

EJERCICIO #e
Utilize el algoritmo para descifrar este mensaje:
 vc4kb2b1sk%kpsebk_nx1cqv

Esta es la clave: en1gm4




Cifrado XOR


Bueno si han llegado hasta aca ya saben masomenos como funciona todo ese mundo de la criptografia, mueva alla, corrase tantos puestos y asi, ahora vamos a implementar otro algoritmo de cifrado pero esta vez utilizando una compuerta logica XOR

primero que todo tenemos que saber que es una compuerta logica XOR y antes de eso tener conceptos de numeros binarios ya que estas compuertas se les aplican a los binarios,

sabemos que toda la informacion en nuestra computadora por debajo al final no son las que 1 y 0;

Les dejare esta guia para que aprendan que es un bit y un byte, los que ya saben la pueden obviar

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

Bueno ya sabiendo esto que 1 byte representa 8 bits y lo demas vamos a estudiar que es una compuerta logica, para lo cual les dejo aca la informacion, no la colocare aca porque seria nada mas copiar y pegar y ps para que.

CompuertaXOR

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login (pueden buscar informacion adicional si no quedo muy claro es importante que sepan como funciona)

bueno despues de saber como funciona esta compuerta tenemos esta tabla de verdad que nos ayuda a entender mejor:


Bueno ya sabiendo esto y como funciona ahora si vamos a proceder a codear el algoritmo:

Primero debemos saber que un caracter es representado por un byte, osea 8 bits que al sumarlos por medio de codigo binario nos dara el codigo ascii del caracter

lean esto para que entiendan como funciona el cifrado xor:
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


por cuestiones de tiempo no explicare este algoritmo paso a paso si no que mostrare su funcionamiento, basicamente lo que hace es convertir el mensaje en un arreglo de caracteres, obtiene el codigo binario de ese caracter, luego convierte la clave en un arreglo de caracter y obtiene el binario de cada caracter y le aplica una compuerta XOR a estos dos binarios y para descrifrar hace lo mismo con el mensaje cifrado y la clave

Código: Java
  1. import java.util.Scanner;
  2.  
  3. public class CifradoXOR {
  4.  
  5.  
  6.         public static void main(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] args) {
  7.                 // TODO Auto-generated method stub
  8.  
  9.                 Scanner sc = new Scanner(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.in);
  10.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ------------------");
  11.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t  | *  CIFRADO XOR * |");
  12.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t   ------------------");
  13.  
  14.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese el Mensaje: ");
  15.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login mensaje  = sc.nextLine();
  16.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Ingrese clave");
  17.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login clave = sc.nextLine();
  18.                        
  19.                         //Se convierte el mensaje a array de binarios
  20.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] mensajeB = TextoABinario(mensaje);
  21.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] claveB = TextoABinario(clave);
  22.        
  23.                        
  24.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("");
  25.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Mensaje: "+mensaje);
  26.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("Clave: "+clave);
  27.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("");
  28.  
  29.                 sc.close();
  30.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("-------------------------------------------------------");
  31.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t\t* Cifrando *");
  32.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("-------------------------------------------------------");
  33.                
  34.                 //Se manda a cifrar
  35.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] resultado = Cifrado_Descifrado_XOR(mensajeB,claveB);
  36.  
  37.                
  38.                 Imprimir(mensajeB);
  39.        
  40.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(": <-- bytes del mensaje");
  41.  
  42.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("");
  43.                
  44.                 Imprimir(claveB);
  45.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(": <-- bytes de clave");
  46.                
  47.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n-------------------------------------------------------");
  48.                
  49.                 Imprimir(resultado);
  50.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(": <-- bytes de cipher");
  51.                
  52.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n-------------------------------------------------------");
  53.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(" - Mensaje Cifrado: ");
  54.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(BinarioATexto(resultado));
  55.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n-------------------------------------------------------");
  56.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\t\t* Descifrando *");
  57.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("-------------------------------------------------------");
  58.                
  59.                 //Se manda a descifrar;
  60.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login[] resultado2 = Cifrado_Descifrado_XOR(resultado,claveB);
  61.  
  62.        
  63.         Imprimir(resultado);
  64.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(": <-- bytes del cipher");
  65.  
  66.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("");
  67.         Imprimir(claveB);
  68.        
  69.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(": <-- bytes de clave");
  70.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n-------------------------------------------------------");
  71.        
  72.         Imprimir(resultado2);
  73.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println(": <-- bytes del mensaje desencriptado");
  74.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n-------------------------------------------------------");
  75.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(" - Mensaje Descrifrado: ");
  76.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(BinarioATexto(resultado2));
  77.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.println("\n-------------------------------------------------------");
  78.         }
  79.        
  80.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login CompuertaXOR (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login binario1 , You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login binario2){
  81.                
  82.                 char [] operando1 = binario1.toCharArray();
  83.                 char [] operando2 = binario2.toCharArray();
  84.                 char [] r =new char [operando1.length];
  85.                
  86.         for(int i=0;i<operando1.length ;i++){
  87.                
  88.                
  89.                 if(operando1[i]!=operando2[i]){
  90.                                 r [i]='1';
  91.                         }else {
  92.                                 r [i]= '0';
  93.                         }
  94.         }      
  95.  
  96.         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login re="";
  97.         for(int j=0;j<r.length;j++){
  98.                 re+=r[j];
  99.         }
  100.  
  101.                 return re;
  102.         }
  103.        
  104.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] Cifrado_Descifrado_XOR (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] mensaje,You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] clave){
  105.                
  106.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] resultado = new You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [mensaje.length];
  107.                 int puntero=0;
  108.        
  109.                 for(int i =0 ;i<mensaje.length;i++){
  110.                        
  111.                         if(puntero>=clave.length){
  112.                                 puntero =0;
  113.                         }
  114.                         resultado[i]= CompuertaXOR(mensaje[i],clave[puntero]);
  115.                        
  116.                         puntero++;
  117.                 }
  118.                
  119.                 return resultado;
  120.         }
  121.  
  122.        
  123.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] TextoABinario(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login texto){
  124.                
  125.                 char caracter;
  126.                 int codigoASCII;
  127.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login binario;
  128.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] binarios = new You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [texto.length()];
  129.                
  130.                 for (int i=0;i<texto.length();i++){
  131.                        
  132.                         caracter = texto.charAt(i);
  133.                         codigoASCII = (int) caracter;
  134.                        
  135.                         binario = "";
  136.                        
  137.                        
  138.                         for(int j=7;j>=0;j--){
  139.                                 if(codigoASCII>=You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.pow(2, j)){
  140.                                         codigoASCII-=You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.pow(2,j);
  141.                                         binario +="1";
  142.                                 }else{
  143.                                         binario+="0";
  144.                                 }
  145.                         }
  146.                
  147.                         binarios[i]= binario.toString();
  148.  
  149.                        
  150.                 }
  151.                 return binarios;
  152.         }
  153.        
  154.        
  155.         public static You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login BinarioATexto(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] binarios){
  156.                 You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login texto="";
  157.                
  158.                 for(int j=0;j<binarios.length;j++){
  159.                 char [] bin = binarios[j].toCharArray();
  160.                
  161.                 int decimal =0;
  162.                
  163.                 int contador=0;
  164.                 for(int i=bin.length-1;i>-1;i--){
  165.        
  166.                         if(bin[contador]=='1'){
  167.                                 decimal+=You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.pow(2, i);
  168.                         }
  169.                        
  170.                         contador++;
  171.                 }
  172.                
  173.                 texto+= (char) decimal;
  174.                
  175.                 }
  176.                
  177.                 return texto;
  178.         }
  179.        
  180.         public static void Imprimir(You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login [] arreglo){
  181.                
  182.                 for(int i=0;i<arreglo.length;i++){
  183.                         You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.out.print(arreglo[i]+" ");
  184.                 }
  185.         }
  186.        
  187.  
  188. }
  189.  

Lo pobrare con el mensaje: Colombia
y la clave: hacking


me da como cipher: + 
y luego de descifrar: Colombia


Bueno amigos esto es todo por hoy, aca no acaba este post seguire agregando algoritmos mas complejos con el paso del tiempo, espero les sirva de algo, ami me sirvio para profundizar mis conocimientos, me gusta todo esto de la criptografia y pues si esto lo ve algun programador lo podria utilizar en sus desarrollos para mejorar su seguridad, un saludo desde Colombia!

« Última modificación: Abril 23, 2018, 12:13:50 am por user_en1gm4 »
En1gm4

Conectado Zentraedi

  • *
  • Underc0der
  • Mensajes: 26
  • Actividad:
    11.67%
  • Reputación 0
    • Ver Perfil
    • Email
« Respuesta #1 en: Abril 22, 2018, 02:22:53 pm »
Muy bueno el post, me gusta mucho el tema y la explicación está muy bien, saludos.

Enviado desde mi XT1034 mediante Tapatalk


 

¿Te gustó el post? COMPARTILO!



Descargar Curso de criptografía (21 Lecciones)

Iniciado por graphixx

Respuestas: 2
Vistas: 2605
Último mensaje Marzo 01, 2016, 08:53:48 pm
por graphixx
[Paper] Criptografía para principiantes

Iniciado por LucaSthefano

Respuestas: 1
Vistas: 2717
Último mensaje Junio 30, 2011, 03:15:57 pm
por darkangel2125
Criptografia y metodos de cifrado.

Iniciado por Cl0udswX

Respuestas: 8
Vistas: 4259
Último mensaje Marzo 08, 2018, 12:23:57 am
por F0xst3rb3n
Criptografía. Seguridad informatica

Iniciado por Mayk0

Respuestas: 2
Vistas: 2143
Último mensaje Febrero 10, 2015, 01:16:17 am
por Aniimuz
[Aporte] Criptografía - Básico

Iniciado por Mortal_Poison

Respuestas: 1
Vistas: 905
Último mensaje Febrero 03, 2018, 09:59:55 pm
por D0Nkey