Métodos para Encriptar y Desencriptar en Java

En esta oportunidad presentamos 2 métodos para proteger los datos en sus desarrollos. Los métodos contienen una llave escrita en duro “qualityinfosolutions” que es la que nos permite Encriptar y luego Desencriptar nuestros datos, si las llaves no coinciden no podrán utilizar ambos métodos por lo que es recomendable manejar esta llave como una variable global.
Librerias:

import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

Descargar commons-codec-1.9.jar  
[wpfilebase tag=file id=25 tpl=simple /]

Método de Encriptación

public static String Encriptar(String texto) {

        String secretKey = "qualityinfosolutions"; //llave para encriptar datos
        String base64EncryptedString = "";

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);

            SecretKey key = new SecretKeySpec(keyBytes, "DESede");
            Cipher cipher = Cipher.getInstance("DESede");
            cipher.init(Cipher.ENCRYPT_MODE, key);

            byte[] plainTextBytes = texto.getBytes("utf-8");
            byte[] buf = cipher.doFinal(plainTextBytes);
            byte[] base64Bytes = Base64.encodeBase64(buf);
            base64EncryptedString = new String(base64Bytes);

        } catch (Exception ex) {
        }
        return base64EncryptedString;
}
public static String Desencriptar(String textoEncriptado) throws Exception {

        String secretKey = "qualityinfosolutions"; //llave para desenciptar datos
        String base64EncryptedString = "";

        try {
            byte[] message = Base64.decodeBase64(textoEncriptado.getBytes("utf-8"));
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
            SecretKey key = new SecretKeySpec(keyBytes, "DESede");

            Cipher decipher = Cipher.getInstance("DESede");
            decipher.init(Cipher.DECRYPT_MODE, key);

            byte[] plainText = decipher.doFinal(message);

            base64EncryptedString = new String(plainText, "UTF-8");

        } catch (Exception ex) {
        }
        return base64EncryptedString;
}

Forma de uso suponiendo que fue creada en la clase utilidades como se muestra a continuación:

Clase AppUtilidades

package com.quality;

import com.quality.entidades.Utilidades;

public class AppUtilidades {

    public static void main(String[] args) throws Exception {

        String encriptado = Utilidades.Encriptar("Esto es una prueba");
        System.out.println(encriptado);
        String desencriptado = Utilidades.Desencriptar(encriptado);
        System.out.println(desencriptado);

    }
}

Clase Utilidades

package com.quality.entidades;

import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class Utilidades {

    public static String Encriptar(String texto) {

        String secretKey = "qualityinfosolutions"; //llave para encriptar datos
        String base64EncryptedString = "";

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);

            SecretKey key = new SecretKeySpec(keyBytes, "DESede");
            Cipher cipher = Cipher.getInstance("DESede");
            cipher.init(Cipher.ENCRYPT_MODE, key);

            byte[] plainTextBytes = texto.getBytes("utf-8");
            byte[] buf = cipher.doFinal(plainTextBytes);
            byte[] base64Bytes = Base64.encodeBase64(buf);
            base64EncryptedString = new String(base64Bytes);

        } catch (Exception ex) {
        }
        return base64EncryptedString;
    }

    public static String Desencriptar(String textoEncriptado) throws Exception {

        String secretKey = "qualityinfosolutions"; //llave para encriptar datos
        String base64EncryptedString = "";

        try {
            byte[] message = Base64.decodeBase64(textoEncriptado.getBytes("utf-8"));
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
            byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
            SecretKey key = new SecretKeySpec(keyBytes, "DESede");

            Cipher decipher = Cipher.getInstance("DESede");
            decipher.init(Cipher.DECRYPT_MODE, key);

            byte[] plainText = decipher.doFinal(message);

            base64EncryptedString = new String(plainText, "UTF-8");

        } catch (Exception ex) {
        }
        return base64EncryptedString;
    }
}

También te podría gustar...

43 Respuestas

  1. Luz Castillo dice:

    Hola oye, una pregunta, Si encripto un archivo en C# y este mismo lo quiero desencriptar en Java, si se puede?

    Ya hice el intento pero no lo desencripta, ocupa un método diferente?

  2. Efectivamente la lógica aplicada en los ejemplos que realice son distintos. Solo mencione alternativas de encriptación similares. Si quisieras hacerlo entre lenguajes tendrías que usar encriptaciones estándares como base 64, md5 o 3DES.

    Saludos

  3. buenas, como estas disculpa cual es el largo máximo del String que devuelve tu método «Desencriptar»?

  4. ROSA ISELA RAMIREZ ZAPATA dice:

    Hola esta linea import org.apache.commons.codec.binary.Base64; la marca como error netbeans 7.4 ayuda

    • Debe ser solo la forma en la cual la estas agregando, yo he probado esta librería desde la versión 7.0 en adelante sin mayores problemas. La forma correcta de importar la librería es clic derecho en libraries, luego add jar/folder…. luego aceptar. Si sigues con el problema me consultas, saludos

  5. jestur dice:

    muchas gracias por el aporte, disculpa estoy comenzando en esto me podrías explicar los métodos de encriptación y como se entrelazan, además de su funcionamiento

  6. Los métodos de encriptación consisten básicamente en un sistema de protección de tus datos convirtiéndolos en cadenas ininteligibles a intrusos. Esta conversión de hace a través de algoritmos como Base64, MD5, DES o Triple DES, los cuales están ya definidos. En estos ejemplos se utiliza una llave la cual sirve para posteriormente poder desencriptar tus datos cifrados.

    En cuanto a la forma de usarla aparece en este mismo articulo.

    Saludos

    • jestur dice:

      gracias por la respuesta me ha sido de gran ayuda para entender esto. Como ya mencione estoy comenzando en esto y aun resulta un poco confuso para mi.

  7. alberto dice:

    alguien sabe como desencripto esto?

    Contacta con el particular
    No te pierdas la oportunidad de conseguir este trabajo por sólo:

    Stexxxxxx

    ingxxxxxxxxxxxxxxxxxxxx@xxxxxx.xxx


    044XXXXXXXXXX

  8. Felipe dice:

    Hola Amigo, para el código C# (sacado de esta misma página) al encriptar la palabra prueba aparece esto como encriptación «YpgJN+JrRNg» y cuando encripto lo mismo en el código Java (en el ejemplo de arriba) aparece esto como encriptación «ed68owMLF7c=» Sabes a que se deberá la diferencia?

    Gracias

  9. Diego dice:

    Buenas, utilizo android studio 2.1.1 y imortando la libreria y aun asi no m reconose el Base64 al importar ni el encodeBase64().

  10. Diego dice:

    Ya resolví mi problema, pero ahora me surgió otro, esta vez es al desencriptar.
    en la parte de byte[] plainText = decipher.doFinal(message) salta directo al catch y como resultado me entrega el texto desencriptado como vacio.

    • Diego disculpa la demora estuve un poco ausente estos días, para poder ayudarte (si aun sigues con el problema), te pido envíes la forma en la que implementaste este código.

      Saludos

    • Hanna0 dice:

      Diego, a mí me pasa lo mismo. Devuelve como vacío la cadena a desencriptar.
      Da error aquí: byte[] plainTex = decipher.doFinal(message);

      Encontraste solución? Gracias

  11. Diego A dice:

    Funciona muy bien, lo único que le hice fue
    reemplazar el código de la librería de Apache
    Base64.encodeBase64(
    Base64.decodeBase64(
    por código propio de las librerías de Java java.util.Base64
    Base64.getEncoder().encode(
    Base64.getDecoder().decode(

    Anduvo a la perfección.
    Saludos.

  12. Muy buen aporte! Todo funciona a la perfeccion y me ayuda a sentirme mas seguro en mi app contra hacks!

    Mil gracias y Saludos.

  13. Miguel Cano dice:

    Gracias por tu aporte, ayuda bastante.
    Tengo una duda, como puedo hacer que el resultado de la encriptación sea sólo letras y números?

    sin afectar al método de desencriptar, osea, poder desencriptar con ese resultado

  14. Jonathan Carrillo dice:

    Amigo, tengo una duda porque cuando tratas de desencriptar una cadena («jhon1603») que devuelve valor encriptado («VCkS3TRA5LW+O0q7AAidWw==»), ese valor («VCkS3TRA5LW+O0q7AAidWw==») se lo paso como parámetro al metodo de desencripción y debería devolver el («jhon1603»), pero no es así… solo devuelve cadena vacía.

    Saludos,
    JUCM

  15. Maria dice:

    Victor buenos dìas
    Tengo que realizar el encriptado y desencriptado mediante DES y AES, alguno me puede ayudar con los còdigos. Agradecerìa su valiosa ayuda.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *