Encriptación DES

   Luego de un largo tiempo sin publicar en el blog vuelvo con una entrada interesante, últimamente estoy muy de lleno en lo que es el tema de la seguridad informática, es un punto de vital importancia para nosotros, lo desarrolladores, quienes queremos que nuestros programas no sean solo seguros, sino que brindemos un sistema robusto y con acceso controlado al mismo....

   Encriptar un archivo para ocultar su contenido es algo muy común en la mayoría de los programas de hoy en día, la mayoría los utiliza para ocultar parámetros, configuraciones, limitaciones, entre otros. Y ahora debemos entrar un poco en teoría para luego ver en que consiste el algorítmo.

   En los años 70's los expertos en informática y los asesores en materia de defensa y seguridad nacional de los Estados Unidos, de forma paradójica concluyeron que en una sociedad democrática y libre no toda la información debe estar disponible al público, y no toda persona debe tener acceso a cierta información considerada muy crucial, lo cual redunda en beneficio de la adecuada marcha de la vida en sociedad. Por eso se recomendó el uso de la encriptación para mantener bajo clasificación ciertos documentos muy importantes y para preservar la confidencialidad de ciertas comunicaciones privadas entre las entidades gubernamentales, los altos mandos de las fuerzas militares, las agencias de seguridad (CIA, FBI, policía, etc.), las entidades financieras o bancarias, etc.


   No voy a entrar en tanta teoría porque no es lo mismo (aunque si tuve que leerme bastante para comprender de que va todo)... Para mas información acerca de la encriptación DES (Data Encryption Standard o Encriptación de Data Estandar en español), puedes ver este enlace: Encriptación DES.

   Y ahora si, vamos con el código para ver como va esto, primero, la clase para la encriptar / desencriptar:
import java.io.UnsupportedEncodingException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

public class DES {

    Cipher ecipher;
    Cipher dcipher;

    byte[] salt = {
        (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
        (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
    };

    int iterationCount = 19;

    DES(String passPhrase) {
        try {
            KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
            SecretKey key = SecretKeyFactory.getInstance(
                "PBEWithMD5AndDES").generateSecret(keySpec);
            ecipher = Cipher.getInstance(key.getAlgorithm());
            dcipher = Cipher.getInstance(key.getAlgorithm());

            AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        } catch (java.security.InvalidAlgorithmParameterException e) {
        } catch (java.security.spec.InvalidKeySpecException e) {
        } catch (javax.crypto.NoSuchPaddingException e) {
        } catch (java.security.NoSuchAlgorithmException e) {
        } catch (java.security.InvalidKeyException e) {
        }
    }

    public String encrypt(String str) {
        try {
            byte[] utf8 = str.getBytes("UTF8");

            byte[] enc = ecipher.doFinal(utf8);

            return new sun.misc.BASE64Encoder().encode(enc);
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
    }

    public String decrypt(String str) {
        try {
            byte[] dec = DatatypeConverter.parseBase64Binary(str);

            byte[] utf8 = dcipher.doFinal(dec);

            return new String(utf8, "UTF8");
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
        } catch (UnsupportedEncodingException e) {
        } catch (java.io.IOException e) {
        }
        return null;
    }
}

   Luego el "Front-End" o interfáz gráfica que nos simplifica la vida un montón:
import javax.swing.*;
import java.awt.event.*;
import java.awt.GridLayout;

class Encriptar extends JFrame implements ActionListener {

 //carga del algoritmo
 DES clase_encript = new DES("carlitoxenlaweb");
 JLabel etiqueta = new JLabel("Probando DES: Carlitox en la Web");

 //cajas de texto
 JTextArea texto_desencriptado = new JTextArea(" ");
  JScrollPane scroll_desencript=new JScrollPane(texto_desencriptado,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 JTextArea texto_encriptado = new JTextArea(" ");
  JScrollPane scroll_encript=new JScrollPane(texto_encriptado,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

 //botones
 JButton encriptar = new JButton ("Encriptar");
 JButton desencriptar = new JButton ("Desencriptar");

 Encriptar() {

  //el diseño
  setLayout(new GridLayout(0,2));

  //los elementos
  add(scroll_desencript);
  add(scroll_encript);
  add(encriptar);
  add(desencriptar);
  add(etiqueta);

  //implementamos la accion
  encriptar.addActionListener(this);
  desencriptar.addActionListener(this);

  //Cerrar Ventana
  addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent we) {
     System.exit(0);
    }
  });

  setTitle("Encriptación DES Carlitox en la Web");
     setSize(800,600);
  setVisible(true);

 }


 //el escucha o listener
 public void actionPerformed(ActionEvent evt) {
  if(evt.getSource()==encriptar)
    texto_encriptado.setText(clase_encript.encrypt(texto_desencriptado.getText()));

  if(evt.getSource()==desencriptar)
    texto_desencriptado.setText(clase_encript.decrypt(texto_encriptado.getText()));
 }

 //la clase principal
 public static void main (String []args) {
  new Encriptar();
 }
}

   La parte realmente importante de todo esto esta en esta línea:
byte[] salt = {
        (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
        (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
    };

   Es donde se define la posición y ubicación de cada uno de los caracteres en el arreglo de bytes para la llave. Para no generar claves dinámicas como lo explica el API de Java, colocamos una personalizada en esta línea de código y la enviamos a la clase como clave base para el algoritmo:
DES clase_encript = new DES("AQUI LA CLAVE");

   Una vez ya tiene la clave la instanciamos con el tipo de seguridad (en este caso "PBE / MD5 / DES") inicializamos las variables para encriptar / desencriptar a partir del algoritmo generado por la instancia de la llave o clave que le enviamos anteriormente a la clase:
ecipher = Cipher.getInstance(key.getAlgorithm());
dcipher = Cipher.getInstance(key.getAlgorithm());

AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);

ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

   NOTA: guardamos la codificación todo el tiempo en UTF-8 para evitar conflicto entre sistemas y lectura de caracteres.

   Y con esto ya tenemos un algoritmo de encriptación DES, el cual podemos combinar con la lectura de archivos para cargar parámetros y valores ocultos en nuestro sistema sin que el usuario deba enterarse de cuales son estos valores. También podemos agregarle una opción de "Abrir" y "Guardar" en un menú para no tener que copiar y pegar todo el tiempo la llave generada.

   Ya por último les dejo el siguiente dato extraido de Eye In The Sky:
   En enero de 1998 la RSA Data Security convocó al concurso DES Challenge II-1, ofreciendo esta vez el premio de $10.000 dólares para quien en menos tiempo que el vencedor del concurso anterior pudiera descifrar un mensaje encriptado mediante el sistema DES de 56 bits. En esa ocasión el concurso fue ganado en sólo 41 días por un grupo de miles de PCs de voluntarios y colaboradores de Distributed.Net, una organización mundial sin ánimo de lucro dedicada al avance de la informática. El mensaje descifrado decía lo siguiente: «The secret message is: Many hands make light work» (Muchas manos hacen el trabajo ligero).


24 Comentarios

Escribir Comentario
Anónimo
AUTOR
19 de mayo de 2011, 15:45 delete

hola soy camilo una consulta en que programa esta hecho este codigo?

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 16:08 delete

Camilo: necesito saber si existe algun codigo en netbeans para hacer un programa que cifre y descifre datos en des con entorno grafico si me pueden ayudar seria espectacular gracias

Responder
avatar
19 de mayo de 2011, 16:17 delete

Hola, bueno, primero lo primero, cifrar no es lo mismo que encriptar y menos lo mismo que codificar... Con eso de que necesitas un código en Netbeans no entiendo, es decir, Netbeans es un IDE, nada mas que eso....

Esto es un ejemplo, si compilas y ejecutas creo que es lo que buscas, esta hecho en Java y la interfaz gráfica es de lo mas sencillo que se me ocurrió. Ahora bien, para aclarar que es cada cosa te lo explico así:

-Encriptar: En terminos de computación normalmente se refiere a proteger uno o varios archivos con una contraseña.

-Cifrar: El nombre lo dice, es el metodo para descubrir la contraseña misma.

-Codificar: Es el proceso por el cual la información de una fuente es convertida en símbolos para ser comunicada.

Entonces básicamente esta clase lo que hace es codificar, saludos.

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 16:29 delete

Camilo: gracias amigo te cuento lo que nececito es un programa que pueda realizar tanto la encriptación como la desencriptación de un texto mediante una clave.
para eso se debe ingresar un texto plano a cifrar y la clave
y para saber el proceso de desencriptar el mismo procedimiento
estoy algo complicado con el programa ya que no encuentro ninguno que haga esto en java netbeans
espero me puedas ayudar saludos

Responder
avatar
19 de mayo de 2011, 16:48 delete

Ok entiendo, aquí tienes un ejemplo explicando como hacerlo, si lo que estas es desarrollando en Netbeans una aplicación Desktop lo que debes hacer es adaptar la clase a tus necesidades....

Fíjate en los listener, es lo que debes colocar en los eventos del botón o botones que tendrá tu aplicación, si estas un poco confuso primero compila el código y ve de que trata, la primera clase se llama "DES.java" y la segunda "Encriptar.java"...

Para correr el ejemplo en el este IDE crea un nuevo proyecto con cualquier nombre, dentro del paquete principal crea 2 clases, ambas con los nombres descritos anteriormente, luego copia el contenido respectivo en cada clase y haciendo click derecho sobre "Encriptar.java" selecciona ejecutar (Run).... Prueba y dime si es lo que buscas... Saludos!!

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 17:12 delete

camilo : voy a probar amigo te cuento cuando lo pruebe gracias

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 17:24 delete

Camilo : carlitox es lo que necesito esta muy bueno lo unico que falto es que el texto se cifre mediante una clave y descifrar lo mismo pero esta muy bueno sos un dios saludos ! ¿como se podria implementar la clave?

Responder
avatar
19 de mayo de 2011, 17:29 delete

Recuerda que esto es solo a modo de ejemplo, debajo de donde esta la explicación de la matriz de bytes explico como se agrega la clave al método.... bueno, fíjate en esta línea:

DES clase_encript = new DES("carlitoxenlaweb");

Es donde instancias la clase para llamar sus métodos, donde dice "carlitoxenlaweb" puedes colocar una variable string y he instanciar una vez la seteas, algo como esto:

String mi_clave = "123456" (la ingresa el usuario)
DES clase_encript = new DES(mi_clave);

Claro, nunca es bueno trabajar con String cuando de esto se trata, te recomiendo usar JPassword para ello.... Prueba y me comentas, saludos!

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 17:34 delete

ok amigo te aviso

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 17:48 delete

carlitox ya lo he hecho pero que se supone que debiera hacer de diferente ya que conpilo y me parece el programa como antes :O

Responder
avatar
19 de mayo de 2011, 18:07 delete

Ok, volvamos a lo básico:

- Pedir datos al usuario
- Java Swing
- Los JTextField

Suponiendo que ya has agregado un JTextField al programa en cualquier parte entonces la clase en el listener te quedaría algo así:

//carga del algoritmo, se declara mas no se inicializa con new...
DES clase_encript;

..... Resto del Código .....

//el escucha o listener
public void actionPerformed(ActionEvent evt) {
clase_encript = new DES(el_text_con_la_clave.getText());
if(evt.getSource()==encriptar){
texto_encriptado.setText(clase_encript.encrypt(texto_desencriptado.getText()));
}
if(evt.getSource()==desencriptar){
texto_desencriptado.setText(clase_encript.decrypt(texto_encriptado.getText()));
}

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 18:23 delete

Camilo: no pude carlitox me complique soy un novato en esto :)Mis Disculpas

Responder
avatar
19 de mayo de 2011, 18:27 delete

Ok a ver..... Primero que nada no te disculpes de esa forma, hubieras comenzado que no sabes programar mucho en Java y necesitas ayuda con esto.... Para eso estamos no?? para poder ayudarte mejor, envíame al correo tu código con las partes que no entiendes para ayudarte mejor vale?? [mi correo esta en la sidebar, a la derecha]. Y tranquilo que nadie nace aprendido no?? Saludos!

Responder
avatar
Anónimo
AUTOR
19 de mayo de 2011, 18:38 delete

vale men ya te envie el correo!

Responder
avatar
Carlos Calvo
AUTOR
30 de junio de 2011, 13:29 delete

hola, a veces a uno se le presentan retos que por cabezoneria y a pesar de ser bastante torpe en temas de programación pues intenta resolver, tengo un archivo rar con contraseña que contiene un plugin seo de wordpress que me interesa, ni que decir tiene que intento aplicarle la fuerza bruta para sacar ese password pero eso siempre le deja a uno un poco con cara de tonto, lo saco si pero... o no lo saco y después de días de intento aun mas cara de tonto, en fin...el caso es que el que la web donde encontre ese archivo da acceso a una pagina lnkgt(punto)com(barra)6dfy ahi teóricamente te dan la clave si accedes a proporcionarles tu numero de tlfn para una campaña de publicidad cosa q ni por asomo se me ocurriría, observando esa pagina me pregunto que clase de encriptacion tiene y si tu le ves la posibilidad de trabajar en averiguar como saltarse esa seguridad, un saludo

Responder
avatar
30 de junio de 2011, 17:16 delete

Hola Carlos, verás, últimamente estoy muy de lleno en esto de la seguridad, pero no soy partidario de violarla o saltarme cualquier cosa solo para esto, el motivo de que ese archivo tenga una clave es por algo, no voy ni siquiera a intentar lo que dices porque va en contra de todo lo legal y moral que en este blog se practica....

Si tiene pass es porque ellos, el o ella así lo quisieron, no soy quien para volarme esa barrera, si necesitas ese archivo ponte en contacto con el creador del archivo y que te de la pass, sino buscalo por otro lado, la cosa es que no voy a intentar nada que tenga que ver con romper la seguridad de un archivo que alguien tiene protegido.... Saludos!

Responder
avatar
Anónimo
AUTOR
18 de julio de 2011, 13:46 delete

se agradece de antemano, prueba con mas tipos de encriptacion de claves seguras, pero asimetrica tal vez con alguna firma digital

Responder
avatar
Manuel Japon
AUTOR
27 de julio de 2011, 13:44 delete

Me resulto bastante util gracias

Responder
avatar
Anónimo
AUTOR
24 de noviembre de 2013, 16:42 delete

en que momento me pide la clave para encriptar.........

Responder
avatar
29 de marzo de 2014, 1:16 delete

Lee bien el artículo, es para encriptar, tu defines la clave que quieres utilizar.....

Responder
avatar
Anónimo
AUTOR
20 de octubre de 2015, 15:05 delete

eres un crack tienes algun foro en youtube ??

Responder
avatar
21 de octubre de 2015, 20:13 delete

Gracias.... Tengo un canal en YouTube, lo verás en la página "Acerca de" en el menú superior, pero no publico nada de código en él.

Responder
avatar
Zero-Sama
AUTOR
26 de octubre de 2015, 6:41 delete

Hola tengo un problema. Cuando pruebo el encriptador me corre perfecto, pero a la hora de compilarlo osea build el archivo .jar me sale este error. "Could not find the main class: main.Encriptar Progam will exit" he probado con prácticamente todas las clases haber si sirve y nada. No se que mas puedo hacer, si tienes alguna idea te lo agradecería.

Responder
avatar
26 de octubre de 2015, 19:47 delete

Si has cambiado el nombre a la clase recuerda cambiar también sus métodos internos, sino prueba colocando los archivos en una misma carpeta... Saludos!!

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión