elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Algoritmo en Java [SOLUCIONADO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Algoritmo en Java [SOLUCIONADO]  (Leído 9,769 veces)
Azulf

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Algoritmo en Java [SOLUCIONADO]
« en: 18 Octubre 2007, 00:14 am »

Pues aqui un ejercicio que me tomaron en una calificada de Progra (no se donde diablos el profe saco este problema), muy tedioso, ya lo he solucionado, pero quisiera saber si alguno de ustds podria hacerlo de una manera diferente o en todo caso mas eficiente, en fin como para que practiques.  ;)

Citar

PRACTICA CALIFICADA DE PROGRAMACION

La situacion del ejercito aliado es desesperada.El ejercito de Adolf Hitler amenza con adueñarse definitivamente de Europa y comenzar su expansion por el mundo.Sus comunicaciones, ademas, estan cifradas con una poderosa máquina llamada ENIMGMA, que desafia toda intercepcepcion.

En BletChley Par, las mentes más poderosas del mundo libre se han reunido en secreto para tratar de encontrar la forma de romper los codigos alemanes.Han conseguido comprender el funcionamiento de ENIGMA, pero no resulta viable descifrar los mensajes manualmente.Para dificultar las cosas los mensajes alemanes originales estan escritor en español.

En un proyecto ultrasecreto, un grupo de fisicos aliados consiguen secuestrar a un programador español del siglo XXI con su máquina de computo (o sea tú). Su única esperanza es que este individuo los ayude a descifrar los mensajes alemantes, antes de que sea demasiado tarde...

Los mensajes alemanes utilizan el juego de 29 carácteres siguientes, codificados a partir de 0(los tres últimos son el espacio, el punto y la coma).

A B C D E F G H I  J  K  L   M   N   O   P   Q   R   S  T   U   V  W  X   Y   Z       .    ,
0 1 2  3  4 5 6 7 8 9 10 11 12  13  14  15 16  17 18 19 20 21 22 23 24 25 26 27 28

La máquina enigma tiene ruedas con esta secuencia de caracteres igual que el cuentakilometros de un auto,tiene ruedas con los digitos del 0 al 9. Si una rueda esta en la posicion A y se avanza 1, pasara a B; si avanza 29 pasos, volvera a la posicion A.

Tras traducirlo al español, lo primero que hacen  los alemanes para codificar un mensaje es elegir una secuencia especial de 5 letras, que hara de semilla.Colocan esta secuencia al principio y el mensaje inmediatamente a continuacion.

EJEMPLO:

Supongase el mensaje MATAR A LOS HUMANOS

Para codificarlos, Enigma podia enteponder una semilla cualquiera, por ejemplo RUDER preparando el mensaje asi:

RUDERMATAR A LOS HUMANOS


Se multiplican y suman los codigos de RUDER (que son 17,20,3,4,17); por tanto tenemeros:
(17x20x3x4x17 + 17+20+3+4+17), y ese (69421 en este caso) es el numero de pasos que avanzará la rueda de la M. Eso nos lleva a la H. Por tanto, el mensaje pasa a ser:

RUDERHATAR A LOS HUMANOS

La misma operacion se haria para la A, con los codigos de las letras UDERH. Y así sucesivamente. Eso nos llevaría al mensaje codificado:

RUDERHRML.EMG,AKYRMRNGNU

Hay que realizar un programa que lea cadenas de textos y los alamcene en un vector(siempre limitando a los caracteres mencionados arriba)con un mensaje codificado, y grabe en otro vector dichos mensajes codificados.EL programa tendra que realizar los cáclculos segun la "codificacion alemana".


Y aqui mi solucion:

Código
  1. /**
  2.  * @(#)codificados.java
  3.  *
  4.  * @author  JEANS AZULF RUIZ
  5.  * @version 1.00 2007/6/8
  6.  */
  7. import java.awt.*;
  8. import javax.swing.*;
  9. import java.awt.event.*;
  10. import java.util.*;
  11. public class codificados extends JFrame implements ActionListener{
  12.  
  13.    JLabel label;
  14.    JTextField texto;
  15.    JTextArea area,area2;
  16.    JButton b_deco;
  17.   char Arreglo[]=new char[29];
  18.  
  19.   Vector codi=new Vector();
  20.   Vector deco=new Vector();
  21.  
  22.    public codificados() {
  23.  
  24.     label =new JLabel("Ingrese aqui Texo Codificado");
  25.     texto=new JTextField();
  26.  
  27.     texto.addKeyListener(new ValidaNumero() );
  28.  
  29.     area=new JTextArea();
  30.     area.setEditable(false);
  31.     area.setToolTipText("Esta ***** no se Edita");
  32.     area2=new JTextArea();
  33.     area2.setEditable(false);
  34.     area2.setToolTipText("Esta ***** no se Edita");
  35.  
  36.     b_deco=new JButton("Decodificalo!!!");
  37.  
  38.     JPanel panel=new JPanel( new GridLayout(1,2) );
  39.     panel.add(label);
  40.     panel.add(texto);
  41.  
  42.     JPanel panel2=new JPanel(new GridLayout(1,2) );
  43.  
  44.     JPanel sub_panel= new JPanel(new BorderLayout() );
  45.     sub_panel.setBorder(BorderFactory.createTitledBorder("Textos Codificados... :"));
  46.     sub_panel.add(new JScrollPane(area) ,BorderLayout.CENTER);
  47.  
  48.  
  49.     JPanel sub_panel2=new JPanel(new BorderLayout() );
  50.     sub_panel2.setBorder(BorderFactory.createTitledBorder("Textos Decodificados... :"));
  51.     sub_panel2.add(new JScrollPane(area2),BorderLayout.CENTER);
  52.  
  53.     panel2.add(sub_panel);
  54.     panel2.add(sub_panel2);
  55.  
  56.     add(panel,BorderLayout.NORTH);
  57.     add(panel2,BorderLayout.CENTER);
  58.     add(b_deco,BorderLayout.SOUTH);
  59.  
  60.     b_deco.addActionListener(this);
  61.  
  62.     iniciar();
  63.  
  64.     setTitle(".::CODIFICADOS::.");
  65.     setSize(450,300);
  66.     setLocation(300,300);
  67.     setResizable(false);
  68.     setDefaultCloseOperation(EXIT_ON_CLOSE);
  69.     setVisible(true);
  70.    }
  71.  
  72.    public void actionPerformed(ActionEvent e){
  73.     if(b_deco==e.getSource()){
  74.     if( texto.getText().length()<=5 ) JOptionPane.showMessageDialog(this,"Por favor ingrese Texto a decodificar VALIDO.\nRecuerde que el texto debe tener mas de 5 caracteres","Title",JOptionPane.INFORMATION_MESSAGE);
  75.     else decodificar();
  76.     }
  77.    }
  78.  
  79.  
  80.    public void iniciar(){
  81.     for (int i = 0; i<26; i++)
  82.     Arreglo[ i ]=(char)(i+65) ;
  83.  
  84.    Arreglo[26]=(char)(32) ;
  85.    Arreglo[27]=(char)(46) ;
  86.    Arreglo[28]=(char)(44) ;
  87.  
  88.    System.out.println(Arrays.toString(Arreglo) );
  89.    }
  90.  
  91.    public int buscar(char car){
  92.     for(int i=0;i<Arreglo.length;i++ )
  93.     if( Arreglo[ i ]==car  ) return i;
  94.     return (-1);
  95.    }
  96.  
  97.    public void decodificar(){
  98.  
  99.     //Creo mi arreglo con la longitud del texto menos los 05 caractereres que son los que han servido de semilla
  100.     char arreglo[]=new char[ ( texto.getText().length() ) -5 ];
  101.  
  102.     //agrego al vector
  103.     codi.addElement( texto.getText().toUpperCase() );
  104.  
  105.     String N=texto.getText().toUpperCase();
  106.     int tope= N.length()-5;
  107.     for(int i=0;i<tope;i++){
  108.     //formo la subcadena que contiene los numeros antecesores
  109.     String n= N.substring(tope-i-1 , tope+5-i-1);
  110.  
  111.  
  112.     //multiplico los digitos
  113.     int Pro=1;
  114.     int Sum=0;
  115.  
  116.     for(int j=0;j<n.length();j++ ){
  117.     Pro*= buscar(n.charAt(j));
  118.     Sum+= buscar(n.charAt(j));
  119.     }
  120.     Pro+=Sum;
  121.     //obtengo el residuo
  122.     Pro=(Pro%29);
  123.  
  124.  
  125.     int t=0,k=0;
  126.     int resi= buscar( N.charAt(N.length()-1-i ) );
  127.  
  128.     do{
  129.     t= (29*k)+ resi;
  130.     k++;
  131.     }while(Pro>t);
  132.  
  133.     arreglo[arreglo.length-i-1]= Arreglo[t-Pro];
  134.  
  135.     }
  136.  
  137.     String s_deco=new String(arreglo);
  138.     //agrego al otro vector
  139.     deco.addElement(s_deco);
  140.     String s_codi=new String();
  141.     String s_decodi=new String();
  142.     for(int h=0;h<deco.size();h++ ){
  143.     s_codi+=(String)codi.elementAt(h);
  144.     s_decodi+= (String)deco.elementAt(h);
  145.     s_codi+="\n";
  146.     s_decodi+="\n";
  147.     }
  148.  
  149.     area.setText(s_codi);
  150.     area2.setText(s_decodi);
  151.  
  152.     texto.setText("");
  153.    }
  154.  
  155.    //clase para que la caja de texto solo acepte LETRAS
  156. class ValidaNumero extends KeyAdapter {
  157.  public void keyTyped(KeyEvent e) {
  158.      char c = e.getKeyChar();
  159.      if ( !(!Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) ||(c == KeyEvent.VK_DELETE)) ) {
  160.            getToolkit().beep();
  161.            e.consume();
  162.      }
  163.  
  164.      if(c==KeyEvent.VK_ENTER ){
  165.       if( texto.getText().length()<=5 ) JOptionPane.showMessageDialog(null,"Por favor ingrese Texto a decodificar VALIDO.\nRecuerde que el texto debe tener mas de 5 caracteres","Title",JOptionPane.INFORMATION_MESSAGE);
  166.     else decodificar();
  167.  
  168.      }
  169.  
  170.  }
  171. }
  172.  
  173.  
  174.  
  175.    public static void main(String[] args) {
  176.       new codificados();
  177.    }
  178. }
  179.  


Y aparte de decodificar los mensajes, para verificiar que estaba en lo correcto, tuve que hacer otra aplicacion en la cual me codificara los mensajes, que es esta:

Código
  1. /**
  2.  * @(#)decodificados.java
  3.  *
  4.  * @author JEANS AZULF RUIZ
  5.  * @version 1.00 2007/6/8
  6.  *
  7.  * APLICACION EN JAVA QUE ME VA A CODIFICAR MENSAJES,PARA LUEGO UTILIZARLOS EN LA OTRA APLICACION
  8.  */
  9. import java.awt.*;
  10. import javax.swing.*;
  11. import java.awt.event.*;
  12. import java.util.*;
  13. public class decodificados extends JFrame implements ActionListener{
  14.  
  15.    JLabel label;
  16.    JTextField texto;
  17.    JTextArea area,area2;
  18.    JButton b_deco;
  19.   char Arreglo[]=new char[29];
  20.  
  21.    public decodificados() {
  22.     crea_objetos();
  23.     agrega_objetos();
  24.     listar_objetos();
  25.     propiedades_ventana();
  26.    }
  27.  
  28.    public void crea_objetos(){
  29.  
  30.     label =new JLabel("Ingrese aqui Texo A codificar");
  31.     texto=new JTextField();
  32.  
  33.     area=new JTextArea();
  34.     area.setEditable(false);
  35.     area.setToolTipText("Esta ***** no se Edita");
  36.  
  37.     area2=new JTextArea();
  38.     area2.setEditable(false);
  39.     area2.setToolTipText("Esta ***** no se Edita");
  40.  
  41.     b_deco=new JButton("Codificalo!!!");
  42.    }
  43.  
  44.    public void agrega_objetos(){
  45.     JPanel panel=new JPanel( new GridLayout(1,2) );
  46.     panel.add(label);
  47.     panel.add(texto);
  48.  
  49.     JPanel panel2=new JPanel(new GridLayout(1,2) );
  50.  
  51.     JPanel sub_panel= new JPanel(new BorderLayout() );
  52.     sub_panel.setBorder(BorderFactory.createTitledBorder("Textos Sin Codificar... :"));
  53.     sub_panel.add(new JScrollPane(area) ,BorderLayout.CENTER);
  54.  
  55.     JPanel sub_panel2=new JPanel(new BorderLayout() );
  56.     sub_panel2.setBorder(BorderFactory.createTitledBorder("Textos Codificados... :"));
  57.     sub_panel2.add(new JScrollPane(area2),BorderLayout.CENTER);
  58.  
  59.     panel2.add(sub_panel);
  60.     panel2.add(sub_panel2);
  61.  
  62.     add(panel,BorderLayout.NORTH);
  63.     add(panel2,BorderLayout.CENTER);
  64.     add(b_deco,BorderLayout.SOUTH);
  65.    }
  66.  
  67.    public void listar_objetos(){
  68.     b_deco.addActionListener(this);
  69.     texto.addKeyListener(new ValidaNumero() );
  70.     iniciar();
  71.    }
  72.  
  73.    public void propiedades_ventana(){
  74.     setTitle(".::DECODIFICADOS::.");
  75.     setSize(450,300);
  76.     setLocation(300,300);
  77.     setResizable(false);
  78.     setDefaultCloseOperation(EXIT_ON_CLOSE);
  79.     setVisible(true);
  80.    }
  81.  
  82.  
  83.    public void actionPerformed(ActionEvent e){    
  84.     if(b_deco==e.getSource()){
  85.     if(texto.getText().length()<=5) JOptionPane.showMessageDialog(this,"Por favor ingrese datos validos");
  86.     else codificar();
  87.     }    
  88.    }
  89.  
  90.  
  91.  
  92.    //METODO QUE ME PERMITE CODIFICAR LAS CADENAS
  93.    public void codificar(){
  94.     String semilla=crea_semilla();
  95.     String cadena= ( texto.getText() ).toUpperCase();
  96.     int limite=cadena.length() ;
  97.  
  98.     cadena= semilla.concat(cadena);
  99.     String cadena_codificada=new String(semilla);
  100.  
  101.     for(int i=0;i<limite;i++){
  102.     String sub= cadena_codificada.substring(i,i+5);
  103.     int suma=0,produc=1;
  104.     for(int j=0;j<5;j++){
  105.     suma+= buscar(sub.charAt(j) );
  106.     produc*= buscar(sub.charAt(j) );
  107.     }
  108.     suma+=produc;
  109.     suma%=29;
  110.     int tempo= suma+ buscar(cadena.charAt(i+5));
  111.     int resul=tempo%29;
  112.     cadena_codificada+=String.valueOf(Arreglo[resul]);
  113.     }
  114.  
  115.     area.append( (texto.getText()).toUpperCase() +"\n" );
  116.     area2.append(cadena_codificada +"\n" );
  117.     texto.setText("");
  118.    }
  119.  
  120.  
  121.  
  122.    public void iniciar(){
  123.     for (int i = 0; i<26; i++)
  124.     Arreglo[ i ]=(char)(i+65) ;
  125.  
  126.    Arreglo[26]=(char)(32) ;
  127.    Arreglo[27]=(char)(46) ;
  128.    Arreglo[28]=(char)(44) ;
  129.  
  130.    System.out.println(Arrays.toString(Arreglo) );
  131.    }
  132.  
  133.    public int buscar(char car){
  134.     for(int i=0;i<Arreglo.length;i++ )
  135.     if( Arreglo[ i ]==car  ) return i;
  136.     return (-1);
  137.    }
  138.  
  139.  
  140.    //clase para que la caja de texto solo acepte LETRAS
  141. class ValidaNumero extends KeyAdapter {
  142.  public void keyTyped(KeyEvent e) {
  143.      char c = e.getKeyChar();
  144.      if (!( !Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) ||(c == KeyEvent.VK_DELETE)) ) {
  145.            getToolkit().beep();
  146.            e.consume();
  147.      }
  148.  
  149.      if(c==KeyEvent.VK_ENTER ){
  150.       if(texto.getText().length()<=5) JOptionPane.showMessageDialog(null,"Por favor ingrese datos validos");
  151.     else codificar();      
  152.      }
  153.  
  154.  }
  155. }
  156.  
  157.  
  158. /* A ----> 65
  159.     * Z ----> 90
  160.     * ESTE METODO CREA UNA SEMILLA  AL AZAR DE CINCO CARACTERES PARA UN TEXTO QUE SE VA A CODIFICAR*/
  161.    public  String crea_semilla(){
  162.   int temporal=0;
  163.       int k=0;
  164.       String cadena="";
  165.       do{
  166.       temporal=(int)(Math.random()*91);
  167.       if(temporal>=65 && temporal <=90){
  168.       //char tmp= (char)temporal;
  169.       cadena+=String.valueOf( (char)temporal);
  170.       k++;
  171.       }
  172.       }
  173.       while(k!=5);
  174.       return cadena;
  175. }
  176.  
  177.  
  178.  
  179.  
  180. // EL MAIN    
  181.    public static void main(String[] args) {
  182.       new decodificados();
  183.  
  184.  
  185.  
  186.    }
  187. }
  188.  
  189.  

Pd: me falto validar para cuando el usuario ingrese caracteres como : "  "" ! · $ % & / () = ? ¿ etc."

Si crees que ya lo haz terminado, puedes probar con estos codigos, o en todo caso codicarlos con la segunda aplicacion, esa que se llama decodificados

Citar
MATAR A LOS HUMANOS          WCNBIXRAU. DPVFHF.ON,GYY
ENCONTRAR EL TESORO          JRHOAWPCJD UKJSIQKDOFWQP
APAGA EL COMPUTADOR         WJVASMRKFFG.WQMOG,FDORUU
QUITATE LAS MEDIAS             NTJSE THR.WYAOAU OUZEPC
ROMPE LA VENTANA                VGVYWIYB,KERSOZH,EWLY


Saludos

Azulf


« Última modificación: 18 Octubre 2007, 00:39 am por Azulf » En línea

Ragnarok
Colaborador
***
Desconectado Desconectado

Mensajes: 4.590


Shrödingerificado


Ver Perfil
Re: Algoritmo en Java [SOLUCIONADO]
« Respuesta #1 en: 18 Octubre 2007, 00:24 am »

En ningún sitio pone que la aplicación tenga que tener interfaz gráfica, eso la haría mucho menos tediosa.

¿Coincide que  ' ', '.' y ',' son los caracteres siguientes a la 'Z' conforme a la codificación utilizada o cómo es eso? (por ahorrarme el mirarlo)

El código lo miraré con más detalle en otro momento, pero parece que te ha quedado al menos bastante corto considerando que incluye la interfaz gráfica.

PD: por cierto, tenemos instalado un plugin que hace coloreado sintáctico, se usa poniendo: [c­ode=­ja­va][­/co­de]


« Última modificación: 18 Octubre 2007, 00:27 am por Ragnarok » En línea

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones
Azulf

Desconectado Desconectado

Mensajes: 7



Ver Perfil
Re: Algoritmo en Java [SOLUCIONADO]
« Respuesta #2 en: 18 Octubre 2007, 00:36 am »

1.- Disculpa si me falto especificar, lo que pasa es que en ese curso estamos llevando swing y por ende se deduce que todos los ejercicios que nos dejan deben estar hechos en interfaz grafica.

2.- Bueno he transcrito lo que decia en la hoja que me dieron, y resulta que esos caracteres de la [A-Z] tienen asignado un numero [0-25] y los caracteres
'espacio ' tiene asignado el 26
'punto' el 27
'coma' el 28

Y esos numeros que cada caracter tiene asignado, son los que se usan para codificar los mensajes(valga la redundancia) segun la codificacion ALemana.Espero me hayas entendido

Saludos

Pd: ia modifique mi codigo
« Última modificación: 18 Octubre 2007, 00:41 am por Azulf » En línea

marioly

Desconectado Desconectado

Mensajes: 239


http://marioly.hackerss.com


Ver Perfil WWW
Re: Algoritmo en Java [SOLUCIONADO]
« Respuesta #3 en: 21 Octubre 2007, 15:25 pm »

Muy bueno :D , me parece que esta bien hecho aunque se podria hacer un poco mas limpio, usando como por ejemplo listas y asi no liarte tanto con los index, y asi tmb eliminamos el metodo "buscar" :) , ejemplo:

Código
  1. import java.util.ArrayList;
  2.  
  3.  
  4. public class Codificador {
  5. private ArrayList table;
  6.  
  7. Codificador()
  8. {
  9. table = new ArrayList(29);
  10.  
  11. makeTable();
  12. }
  13.  
  14. void makeTable()
  15. {
  16. for(int i = 0; i < 29; i++)
  17. table.add((char)(65+i));
  18.  
  19.    table.add((char)(32));
  20.    table.add((char)(46));
  21.    table.add((char)(44));
  22. }
  23.  
  24. void Decodificar(String sd)
  25. {
  26. String dec = "";
  27. int uid;
  28.  
  29. int mul = 1, sum = 0;
  30. for( int i = 5; i < sd.length(); i++)
  31. {
  32. for(int j = 0; j < 5; j++)
  33. {
  34. char c = sd.charAt(j);
  35. int pos = table.indexOf(c);
  36. mul *= pos;
  37. sum += pos;
  38. }
  39.  
  40. uid = sum + mul;
  41. uid %= 29;
  42.  
  43. int t=0, k=0;
  44.  
  45. int resi = table.indexOf(sd.charAt(i));
  46.  
  47. do
  48. {
  49. t = (29*k) + resi;
  50. k++;
  51. }
  52. while( uid > t );
  53.  
  54. dec += table.get((t-uid));
  55. }
  56.  
  57. System.out.println("Cadena cifrada: " + sd + " descifrada: " + dec);
  58. }
  59.  
  60. static public void main(String[] args)
  61. {
  62. Codificador eni = new Codificador();
  63. eni.Decodificar("WCNBIX");
  64. }
  65. }
  66.  
  67.  

saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
este algoritmo es correcto en java??
Java
l9_in 5 5,068 Último mensaje 16 Junio 2011, 09:13 am
por Debci
Ayuda algoritmo en java
Java
estherlui 0 1,760 Último mensaje 27 Mayo 2012, 13:13 pm
por estherlui
Ayuda algoritmo en java
Java
estherlui 1 3,663 Último mensaje 27 Mayo 2012, 23:05 pm
por Proteus1989
[PROBLEMA] Descifrado con algoritmo TripleDES en java
Java
kondrag_X1 0 2,322 Último mensaje 25 Abril 2013, 13:45 pm
por kondrag_X1
problema algoritmo java o dfd
Ejercicios
Kacoae 1 5,168 Último mensaje 19 Julio 2015, 03:12 am
por lvs
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines