org.jajim.utilidades.cifrado.Cifrador.java Source code

Java tutorial

Introduction

Here is the source code for org.jajim.utilidades.cifrado.Cifrador.java

Source

/*
 Jabber client.
 Copyright (C) 2010  Florencio Caizal Calles
    
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
    
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
    
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.jajim.utilidades.cifrado;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.jajim.excepciones.ImposibleCifrarDescifrarException;
import org.jajim.excepciones.ImposibleCifrarException;
import org.jajim.excepciones.ImposibleDescifrarException;
import org.jajim.utilidades.log.ManejadorDeLogs;

/**
 * @author Florencio Caizal Calles
 * @version 1.2 Clase que cifra y descrifa cadenas de caracteres.
 */
public class Cifrador {

    private SecretKey sk;
    private Cipher cifrado;

    /**
     * Constructor de la clase. Inicializa el cifrador.
     * <p>
     * @throws ImposibleCifrarDescifrarException Si no se puede instanciar un ci frador adecuado.
     */
    public Cifrador() throws ImposibleCifrarDescifrarException {

        try {
            // Inicializacin de la clave
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            String clave = "cjliamve";
            DESKeySpec kspec = new DESKeySpec(clave.getBytes());
            sk = skf.generateSecret(kspec);
            // Inicializacin del cifrador
            cifrado = Cipher.getInstance("DES");
        } catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException
                | NoSuchPaddingException e) {
            // En caso de que se produzca un error se escribe en el fichero
            // de log y se lanza una excepcin
            ManejadorDeLogs mdl = ManejadorDeLogs.getManejadorDeLogs();
            mdl.escribir("No se puede crear un cifrador de DES");
            throw new ImposibleCifrarDescifrarException();
        }
    }

    /**
     * Cifra la cadena que se le suministra como parmetro.
     * <p>
     * @param cadena Cadena que se desea cifrar.
     * @return Resultado de la cadena cifrada.
     * <p>
     * @throws ImposibleCifrarException Si no se puede cifrar la cadena.
     */
    public String cifrar(String cadena) throws ImposibleCifrarException {

        String c = null;

        try {
            // Arrancar en modo cifrar
            cifrado.init(Cipher.ENCRYPT_MODE, sk);
            // Cifrar
            byte[] bloqueCifrado = cifrado.doFinal(cadena.getBytes(), 0, cadena.getBytes().length);
            byte[] bloqueCifradoCodificado = Base64.encodeBase64(bloqueCifrado);
            c = new String(bloqueCifradoCodificado);
        } catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            // En caso de que se produzca un error se escribe en el fichero
            // de log y se lanza una excepcin
            ManejadorDeLogs mdl = ManejadorDeLogs.getManejadorDeLogs();
            mdl.escribir("No se puede cifrar la cadena");
            throw new ImposibleCifrarException();
        }

        return c;
    }

    /**
     * Descrifra la cadena que se le suministra como parmetro.
     * <p>
     * @param cadena Cadena que se desea descrifrar.
     * @return Resultado con la cadena descifrada.
     * <p>
     * @throws ImposibleDescifrarException Si no se puede descifrar la cadena.
     */
    public String descifrar(String cadena) throws ImposibleDescifrarException {

        String c = null;

        try {
            // Arrancar en modo descifrar
            cifrado.init(Cipher.DECRYPT_MODE, sk);
            // Descifrar
            byte[] bloqueDescifrado = cifrado.doFinal(Base64.decodeBase64(cadena));
            c = new String(bloqueDescifrado, "ISO-8859-1");
        } catch (InvalidKeyException | UnsupportedEncodingException | IllegalBlockSizeException
                | BadPaddingException e) {
            // En caso de que se produzca un error se escribe en el fichero
            // de log y se lanza una excepcin
            ManejadorDeLogs mdl = ManejadorDeLogs.getManejadorDeLogs();
            mdl.escribir("No se puede descifrar la cadena");
            throw new ImposibleDescifrarException();
        }

        return c;
    }
}