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).
Recibe notificaciones por correo
24 Comentarios
Escribir Comentariohola soy camilo una consulta en que programa esta hecho este codigo?
ResponderCamilo: 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
ResponderHola, 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....
ResponderEsto 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.
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.
Responderpara 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
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....
ResponderFí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!!
camilo : voy a probar amigo te cuento cuando lo pruebe gracias
ResponderCamilo : 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?
ResponderRecuerda 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:
ResponderDES 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!
ok amigo te aviso
Respondercarlitox ya lo he hecho pero que se supone que debiera hacer de diferente ya que conpilo y me parece el programa como antes :O
ResponderOk, volvamos a lo básico:
Responder- 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()));
}
Camilo: no pude carlitox me complique soy un novato en esto :)Mis Disculpas
ResponderOk 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!
Respondervale men ya te envie el correo!
Responderhola, 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
ResponderHola 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....
ResponderSi 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!
se agradece de antemano, prueba con mas tipos de encriptacion de claves seguras, pero asimetrica tal vez con alguna firma digital
ResponderMe resulto bastante util gracias
Responderen que momento me pide la clave para encriptar.........
ResponderLee bien el artículo, es para encriptar, tu defines la clave que quieres utilizar.....
Respondereres un crack tienes algun foro en youtube ??
ResponderGracias.... 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.
ResponderHola 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.
ResponderSi 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!!
ResponderLamentablemente 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