Criptografía Java: descifrado de datos

Puede descifrar los datos cifrados utilizando la clase Cipher del javax.cryptopaquete. Siga los pasos que se detallan a continuación para descifrar datos dados usando Java.

Paso 1: crear un objeto KeyPairGenerator

los KeyPairGenerator la clase proporciona getInstance() método que acepta una variable String que representa el algoritmo de generación de claves requerido y devuelve un objeto KeyPairGenerator que genera claves.

Crear KeyPairGenerator objeto usando el getInstance() método como se muestra a continuación.

//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

Paso 2: inicializar el objeto KeyPairGenerator

los KeyPairGenerator la clase proporciona un método llamado initialize()este método se utiliza para inicializar el generador de pares de claves. Este método acepta un valor entero que representa el tamaño de la clave.

Inicialice el objeto KeyPairGenerator creado en el paso anterior usando el initialize() método como se muestra a continuación.

//Initializing the KeyPairGenerator
keyPairGen.initialize(2048);

Paso 3: Genere el KeyPairGenerator

Puede generar el KeyPair utilizando el generateKeyPair() método del KeyPairGeneratorclase. Genere el par de claves utilizando este método como se muestra a continuación.

//Generate the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();

Paso 4: Obtén la clave pública

Puede obtener la clave pública del objeto KeyPair generado utilizando el getPublic() método como se muestra a continuación.

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

Paso 5: Crea un objeto Cipher

los getInstance() método de Cipher La clase acepta una variable String que representa la transformación requerida y devuelve un objeto Cipher que implementa la transformación dada.

Cree el objeto Cipher utilizando el getInstance() método como se muestra a continuación.

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Paso 6: inicializar el objeto Cipher

los init() El método de la clase Cipher acepta dos parámetros.

  • Un parámetro entero que representa el modo de operación (cifrar / descifrar)
  • Objeto clave que representa la clave pública

Inicialice el objeto Cypher usando el init() método como se muestra a continuación.

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

Paso 7: agregar datos al objeto Cipher

los update() El método de la clase Cipher acepta una matriz de bytes que representa los datos a cifrar y actualiza el objeto actual con los datos proporcionados.

Actualice el objeto Cipher inicializado pasando los datos al update() método en forma de matriz de bytes como se muestra a continuación.

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

Paso 8: cifre los datos

los doFinal()El método de la clase Cipher completa la operación de cifrado. Por lo tanto, finalice el cifrado utilizando este método como se muestra a continuación.

//Encrypting the data
byte[] cipherText = cipher.doFinal();

Paso 9: inicialice el objeto Cipher para el descifrado

Para descifrar el cifrado cifrado en los pasos anteriores, debe inicializarlo para el descifrado.

Por lo tanto, inicialice el objeto de cifrado pasando los parámetros Cipher.DECRYPT_MODE y el objeto PrivateKey como se muestra a continuación.

//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());

Paso 10: descifra los datos

Finalmente, descifre el texto cifrado usando el doFinal() método como se muestra a continuación.

//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);

Ejemplo

El siguiente programa Java acepta el texto del usuario, lo cifra utilizando el algoritmo RSA e imprime el cifrado del texto dado, descifra el cifrado e imprime el texto descifrado de nuevo.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;

import javax.crypto.Cipher;

public class CipherDecrypt {
   public static void main(String args[]) throws Exception{
	   //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withRSA");
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();   
      
      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic();  

      //Creating a Cipher object
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

      //Initializing a Cipher object
      cipher.init(Cipher.ENCRYPT_MODE, publicKey);
	  
      //Add data to the cipher
      byte[] input = "Welcome to Tutorialspoint".getBytes();	  
      cipher.update(input);
	  
      //encrypting the data
      byte[] cipherText = cipher.doFinal();	 
      System.out.println( new String(cipherText, "UTF8"));

      //Initializing the same cipher for decryption
      cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
      
      //Decrypting the text
      byte[] decipheredText = cipher.doFinal(cipherText);
      System.out.println(new String(decipheredText));
   }
}

Salida

El programa anterior genera la siguiente salida:

Encrypted Text:
]/[?F3?D?p
v?w?!?H???^?A??????P?u??FA?
?
???_?? ???_jMH-??>??OP?'?j?_?n`
?_??'`????o??_GL??g???g_f?????f|???LT?|?Vz_TDu#??\?<b,,?$C2???Bq?#?lDB`??g,^??K?_?v???`}
?;LX?a?_5e???#???_?6?/B&B_???^?__Ap^#_?q?IEh????_?,??*??]~_?_?D?
_y???lp??a?P_U{

Decrypted Text:
Welcome to Tutorialspoint