Cifrar y descifrar datos con DES

Autor: José Luis Álvarez

Lectura de una clave por teclado, conversión de la clave leída para utilizar en el algoritmo DES para cifrado y descifrado.
Al programa se le pasan 3 parámetros:

  • el primer parámetro indicará si elegimos cifrar "-c" o descifrar "-d"
  • el segundo parámetro indica el fichero de entrada desde donde se leen los datos
  • el tercer párametro es un nombre de un fichero donde se dejará el resultado de cifrar o descifrar
Si este fichero no existe lo crea programa.

import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.security.*;
import java.util.*;

public class cifrar_descifrar
{
   public static void main(String [] args)
   {
   
      String comando1 = "-c";
      String comando2 = "-d";
      
      //COMANDO 1 o COMANDO 2
      if ((comando1.equals(args[0]))||(comando2.equals(args[0]))){   
    //leer clave por teclado
    try{
         InputStreamReader leer_clave = new InputStreamReader(System.in);
         BufferedReader buff_clave = new BufferedReader(leer_clave);
         System.out.print("Escriba una clave: ");
         String clave = buff_clave.readLine();
      
         //pasar clave a la clase SecretKey
      try{
       SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
       DESKeySpec kspec = new DESKeySpec(clave.getBytes());
       SecretKey ks = skf.generateSecret(kspec);
      
      //Inicializar el cifrado
         try{
            Cipher cifrado = Cipher.getInstance("DES");
         
            //Escojo modo cifrado o descifrado segun sea el caso
         
            if (comando1.equals(args[0])){
               cifrado.init(Cipher.ENCRYPT_MODE, ks);}//MODO CIFRAR
            if (comando2.equals(args[0])){
               cifrado.init(Cipher.DECRYPT_MODE, ks);}//MODO DESCIFRAR

               
            //Leer fichero
      
            InputStream archivo = new FileInputStream( args[1] );
            OutputStream fich_out = new FileOutputStream ( args[2] );
         
            byte[] buffer = new byte[1024];
            byte[] bloque_cifrado;
            String textoCifrado = new String();
            int fin_archivo = -1;
            int leidos;//numero de bytes leidos
         
            leidos = archivo.read(buffer);
         
            while( leidos != fin_archivo ) {
               bloque_cifrado = cifrado.update(buffer,0,leidos);
               textoCifrado = textoCifrado + new String(bloque_cifrado,"ISO-8859-1");
               leidos = archivo.read(buffer);         
            }
         
            archivo.close();
         
            bloque_cifrado = cifrado.doFinal();
            textoCifrado = textoCifrado + new String(bloque_cifrado,"ISO-8859-1");
            //ISO-8859-1 es ISO-Latin-1
         
            fich_out.write(textoCifrado.getBytes("ISO-8859-1"));//escribir fichero
         
            }
            //Inicializacion de cifrado
            catch(javax.crypto.NoSuchPaddingException nspe) {} //Instanciacion DES
            catch(javax.crypto.IllegalBlockSizeException ibse) {}//metodo doFinal
            catch(javax.crypto.BadPaddingException bpe) {}//metodo doFinal
         }
         //pasar clave a la clase SecretKey
         catch(java.security.InvalidKeyException ike) {}
         catch(java.security.spec.InvalidKeySpecException ikse) {}
         catch(java.security.NoSuchAlgorithmException nsae) {}
         }
         //leer del teclado la clave como String
         catch(java.io.IOException ioex) {}
      }
   }
}


Ejemplos de llamadas
Cifrado de los datos del fichero entrada, escribiendo el resultado en el fichero salida.
>>java cifrar_descifrar -c entrada salida

Descifrado de los datos del fichero entrada, depositando el mensaje obtenido en el fichero salida.
>>java cifrar_descifrar -d entrada salida