TripleDES con Java II (bouncyCastle)


Hace unos días escribí un post acerca de como poder cifrar y descifrar cadenas o textos completos utilizando el algoritmo TripleDES desde Java y bueno buscando formas de mejorar este proceso me tope con una API muy interesante que me permite realizar este tipo de cifrado utilizando TripleDES y ademas de otros (DES, AES, etc.). Esta API es desarrollada por un grupo de personas que se hacen llamar «Legion of the Bouncy Castle« y cuyo nombre es «Bouncy Castle Crypto APIs», lo cual consiste en un conjunto de librerías especificas para trabajos de criptografia, actualmente la tenemos en su versión 1.45 para Java compatibles desde el JDK 1.2 al JDK 1.6 y su versión 1.6.1 para trabajar desde C# .NET.

Bueno, aquí les propongo una forma de poder utilizar esta librería justamente con una clase para trabajar con TripleDES, para esto cree una clase a la que llame EncriptionSource y esta a su vez con los métodos Encrypt y Decrypt respectivamente:

Encriptionsource.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package appayudas;

/**
 *
 * @author nachxs
 */

import org.bouncycastle.crypto.*;
import org.bouncycastle.crypto.paddings.*;
import org.bouncycastle.crypto.engines.*;
import org.bouncycastle.crypto.modes.*;
import org.bouncycastle.crypto.params.*;

public class EncriptionSource {

    BlockCipher engine = new DESedeEngine();

    public byte[] Encrypt(byte[] key, String plainText) {
        byte[] ptBytes = plainText.getBytes();
        BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine));
        cipher.init(true, new KeyParameter(key));
        byte[] rv = new byte[cipher.getOutputSize(ptBytes.length)];
        int tam = cipher.processBytes(ptBytes, 0, ptBytes.length, rv, 0);
        try {
            cipher.doFinal(rv, tam);
        } catch (Exception ce) {
            ce.printStackTrace();
        }
        return rv;
    }

    public String Decrypt(byte[] key, byte[] cipherText) {
        BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine));
        cipher.init(false, new KeyParameter(key));
        byte[] rv = new byte[cipher.getOutputSize(cipherText.length)];
        int tam = cipher.processBytes(cipherText, 0, cipherText.length, rv, 0);
        try {
            cipher.doFinal(rv, tam);
        } catch (Exception ce) {
            ce.printStackTrace();
        }
        return new String(rv).trim();
    }
}

Y luego solo haríamos lo siguiente para llamarla desde una clase Main.java:

Main.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package appayudas;

/**
 *
 * @author nachxs
 */

public class Main {
    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) throws Exception {
        EncriptionSource esource = new EncriptionSource();
        String key = "DC101AB52CF894CEE52F61731643B94F";
        String cad = "https://nachxs.wordpress.com";
        byte[] keyb = FunctionByte.hex2byte(key);
        System.out.println("Cadena Ingreso: " + cad);
        String enc = FunctionByte.toHEX1(esource.Encrypt(keyb, cad));
        System.out.println("Encripta: " + enc);
        String des = esource.Decrypt(keyb, FunctionByte.hex2byte(enc));
        System.out.println("Desencripta: " + des);
    }
}

Como podran observar estoy utilizando la clase Functionbyte la cual lo pueden descargar de aquí. Hago la aclaración que esta clase (FunctionByte) esta dentro de las clases que descargue para poder trabajar con DES tal como lo mencione en el post anterior, si no que esta con el nombre de Util.java. Espero les sirve y puedan mejorarlo y comentarlo.

2 comentarios en “TripleDES con Java II (bouncyCastle)

Deja un comentario