jueves, 8 de marzo de 2012

Cifrado datos

Una de las cuestiones importantes hoy en día son los diferentes aspectos de la seguridad, cifrado de datos, firmas digitales, etc. En un sólo post me parece mucho recorrer todos los aspectos, por tanto, para ir abriendo boca empezaremos con un simple cifrador que podemos usar para proteger de miradas indiscretas aquella información de nuestra preferencia.

Primero tenemos que definir una clave que usaremos para cifrar los datos:

            byte[] iv = new byte[]{
                    (byte)0x8E, 0x12, 0x39, (byte)0x9C,
                    0x6F, 0x6F, 0x6F, 0x5A
            };

Después tendremos que crear dos objetos de cifrado, uno para cifrar y otro para descifrar:

            Cipher ecipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            Cipher dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding");


Después de inicializarlos sólo tenemos que copiar un stream de entrada en otro de salida de la siguiente forma:

a) Para cifrar:

        out = new CipherOutputStream(out, cipher);
        copyStreams(in,out);

b) Para descifrar:

        in = new CipherInputStream(in, cipher);
        copyStreams(in,out);

Bueno, el código completo es el siguiente:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.spec.AlgorithmParameterSpec;
import java.util.logging.Logger;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

public class Encrypt {

    private final static Logger myLogger= Logger.getLogger( Encrypt.class.getName() );
    private static int tamBuffer=2048;

    protected static void copyStreams (InputStream in, OutputStream out){
        byte[] buffer = new byte[tamBuffer];
        
        try {
            // Leer del stream de entrada, y escribir en el de salida usando el buffer.
            int numLeidos = 0;
            while ((numLeidos = in.read(buffer)) >= 0) {
                out.write(buffer, 0, numLeidos);
            }
            out.close();
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void encrypt(Cipher cipher, InputStream in, OutputStream out) {
        myLogger.info("Iniciando encriptado de datos...");
        out = new CipherOutputStream(out, cipher);
        copyStreams(in,out);
        myLogger.info("Finalizado encriptado de datos...");
    }

    public static void decrypt(Cipher cipher, InputStream in, OutputStream out) {
        myLogger.info("Iniciando desencriptado de datos...");
        in = new CipherInputStream(in, cipher);
        copyStreams(in,out);
        myLogger.info("Finalizado desencriptado de datos..."); 
    }
    

    public static void main(String[] args) {

        String ficheroACodificar="fichTxt.txt";
        String ficheroCodificado="fichCod.cod";
        String ficheroOriginal="fichOrig.txt";

        //Creamos las claves asimétricas
        try{

            SecretKey key = KeyGenerator.getInstance("DES").generateKey();

            //Creo una clave para la generación de los Cipher
            byte[] iv = new byte[]{
                    (byte)0x8E, 0x12, 0x39, (byte)0x9C,
                    0x6F, 0x6F, 0x6F, 0x5A
            };

            AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

            Cipher ecipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            Cipher dcipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

            // Creamos los dos cifradores, para cifrar y para descifrar.
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

            encrypt(ecipher, 
                    new FileInputStream(new File(ficheroACodificar)), 
                    new FileOutputStream(new File( ficheroCodificado)));
            
            decrypt(dcipher,
                    new FileInputStream(new File(ficheroCodificado)),
                    new FileOutputStream(new File(ficheroOriginal)));
            
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

}

2 comentarios:

  1. Que tal, muy bueno tu codigo, y como lo descifras?

    ResponderEliminar
    Respuestas
    1. Livio,

      Tienes dos métodos. Uno para cifrar y otro para descifrar.

      b) Para descifrar:

      in = new CipherInputStream(in, cipher);
      copyStreams(in,out);

      Eliminar