import javax.crypto.*;
import java.security.*;
import java.nio.charset.Charset;

public class Blowfish {
// Definimos cadena a encriptar
public static final String cadena = "cadena a encriptar";
public static final Charset CHARSET_ISO_8859_1 = Charset.forName("ISO-8859-1");

public static void main(String[] args) throws Exception {
System.out.println("El texto original es: " + cadena);

// Generar una clave Blowfish
System.out.println("Aplicando cifrado Blowfish....");

try {

	// Seleccionar proveedor del tipo JCE
	KeyGenerator generador = KeyGenerator.getInstance("Blowfish");
	System.out.println("Proveedor de cifrado: " + generador.getProvider().getInfo());
	System.out.println("Algoritmo de cifrado: " + generador.getAlgorithm());
	Provider provider=generador.getProvider();
	System.out.println("Proveedor seleccionado:"+String.valueOf(provider.getName()));
	generador.init(128);
	Key clave = generador.generateKey();

	// encriptar texto
	System.out.print("Encriptando texto entrada...");
	Cipher cifrador = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
	cifrador.init(Cipher.ENCRYPT_MODE, clave);
	byte[] textoCifrado = cifrador.doFinal(cadena.getBytes("UTF8"));
	String encryptedString = new String(textoCifrado, CHARSET_ISO_8859_1);
	System.out.println("El texto cifrado es: " + encryptedString);

	// descifrar texto
	System.out.print("Descifrando texto cifrado...");	
	cifrador.init(Cipher.DECRYPT_MODE, clave);
	byte[] textodesCifrado = cifrador.doFinal(encryptedString.getBytes(CHARSET_ISO_8859_1));
	String decryptedString = new String(textodesCifrado	, CHARSET_ISO_8859_1);
	System.out.println("El texto descifrado es: " + decryptedString);

	}catch (NoSuchAlgorithmException e) {
		System.out.println("NoSuchAlgorithmException: " + e.getMessage());
    } catch (NoSuchPaddingException e) {
        System.out.println("NoSuchPaddingException: " + e.getMessage());
    } catch (InvalidKeyException e) {
        System.out.println("InvalidKeyException: " + e.getMessage());
    } catch (IllegalStateException e) {
        System.out.println("IllegalStateException: " + e.getMessage());
    } catch (IllegalBlockSizeException e) {
        System.out.println("IllegalBlockSizeException: " + e.getMessage());
    } catch (BadPaddingException e) {
        System.out.println("BadPaddingException: " + e.getMessage());
    }
}
}