Cifrado Blowfish en Java

Java Agregar comentario

A continuacion una implementacion de algoritmo de cifrado de datos Blowfish.

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
 
public class BlowFish {
	public static String encriptar(String cleartext, String key) throws Exception{
		try {
			return crypt(cleartext, key, Cipher.ENCRYPT_MODE);
		} catch (Exception ex) {
			throw new Exception("Imposible encriptar los datos.");
		}
	}
 
	public static String desEncriptar(String ciphertext, String key) throws Exception {
		try {
			return crypt(ciphertext, key, Cipher.DECRYPT_MODE);
		} catch (Exception ex) {
			throw new Exception("Imposible desencriptar los datos.");
		}
	}
 
	private static String crypt(String input, String key, int mode) throws Exception {
		// Install SunJCE provider
		Provider sunJce = new com.sun.crypto.provider.SunJCE();
		Security.addProvider(sunJce);
 
		KeyGenerator kgen = KeyGenerator.getInstance("Blowfish");
		kgen.init(448);
		SecretKey skey = kgen.generateKey();
 
		byte[] raw = key.getBytes();
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "Blowfish");
 
		Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
		cipher.init(mode, skeySpec);
 
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ByteArrayInputStream bis = new ByteArrayInputStream(input.getBytes());
		CipherOutputStream cos = new CipherOutputStream(bos, cipher);
 
		int length = 0;
		byte[] buffer = new byte[8192];
 
		while ((length = bis.read(buffer)) != -1) {
			cos.write(buffer, 0, length);
		}
 
		bis.close();
		cos.close();
 
		return bos.toString();
	}
}

Modo de Uso:

   //Encriptado
   String datos="Informacion a encriptar";
   datos=BlowFish.encriptar(datos, "ClavePrivada");
   //Desencriptado
   datos=BlowFish.desEncriptar(datos, "ClavePrivada");

8 Comentarios en “Cifrado Blowfish en Java”

  1. arthuro Dice:

    oie muchas gracias por tu aporte se agradece me sirvio para darme una idea del funcionamiento del algoritmo nadamas una cosita si tienes algun documento o algo asi para investigar acerca del algoritmo

  2. yo Dice:

    Tio esto no funciona ni a la de 3

  3. sebas Dice:

    Primero que nada, esta COPIADO de otra pagina…solo has cambiado algunas palabras al español.

    Segundo, NO FUNCIONA

    lamentable post…

  4. Gero Dice:

    Obviamente no reinvente la rueda.
    Bravo! Supiste leer que dice…
    import java.security.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.io.*;
    Si dijeras porque no te funciona te podriamos ayudar, pero con esa actitud no vas a lograr mucho.
    Saludos!

  5. Fernando Dice:

    Estoy implementando esta clase pero tengo algunos problemas… radica en que encripto y cuando desencripto no “es lo mismo”…. Espero me peudan colaborar a solucionar esta incidencia

  6. Ady Dice:

    Hola a todos, yo tenia el mismo problema al utilizar esa implementacion, lo resolvi de la siguiente forma, este es el metodo principal dentro mi clase Blowfish:

    public static String crypt(String inputText, String key, int mode)throws Exception {

    SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), “Blowfish”);
    Cipher cipher = Cipher.getInstance(”Blowfish/ECB/PKCS5Padding”);
    cipher.init(mode, skeySpec);

    String generated = “”;

    if (mode == Cipher.ENCRYPT_MODE) {

    byte[] encrypted = cipher.doFinal(inputText.getBytes());
    generated = new sun.misc.BASE64Encoder().encode(encrypted);

    } else if (mode == Cipher.DECRYPT_MODE) {

    byte[] decrypted = cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer((inputText)));
    generated = new String(decrypted);
    }
    return generated;

    }
    }

    el llamado seria
    Blowfish.cryp(”originalText”, “key”,Cipher.ENCRYPT_MODE);
    Blowfish.crypt(”cipherText”, key, Cipher.DECRYPT_MODE);

    Me di cuenta que en algunas ocaciones al querer desencriptar el texto encriptado y convertido a String me sustituia un valor de un byte, siempre que quieras cambiar bytes a String debes de hacerlo pero con Base64.

    Espero les sirva a mi me funciono. :-)

  7. Gero Dice:

    Gracias Ady… me paso lo mismo que a vos pero con otros algoritmos de cifrado, como DSA, y la verdad que es muy buena practica codificar en BASE64 antes de mandarle realmente la codificacion.
    Saludos!

  8. ROJASDee21 Dice:

    Houses are expensive and not everybody can buy it. However, loan are invented to aid people in such situations.

Deja un Comentario

WP Theme & Icons by N.Design Studio
Posts en RSS Comentarios en RSS Iniciar sesión