Criptografía Java: verificación de la firma

Puede crear una firma digital utilizando Java y verificarla siguiendo los pasos que se indican a continuación.

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()método. 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. 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: obtenga la clave privada del par

Puede obtener la clave privada del objeto KeyPair generado utilizando el getPrivate() método.

Obtenga la clave privada usando el getPrivate() método como se muestra a continuación.

//Getting the private key from the key pair
PrivateKey privKey = pair.getPrivate();

Paso 5: crea un objeto de firma

los getInstance() método del Signature La clase acepta un parámetro de cadena que representa el algoritmo de firma requerido y devuelve el objeto Signature correspondiente.

Cree un objeto de la clase Signature usando el getInstance() método.

//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withDSA");

Paso 6: inicializar el objeto Signature

los initSign() El método de la clase Signature acepta un PrivateKey objeto e inicializa el objeto Signature actual.

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

//Initialize the signature
sign.initSign(privKey);

Paso 7: agregue datos al objeto Firma

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

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

byte[] bytes = "Hello how are you".getBytes();      

//Adding data to the signature
sign.update(bytes);

Paso 8: Calcule la firma

los sign() método del Signature class devuelve los bytes de firma de los datos actualizados.

Calcule la firma usando el método sign () como se muestra a continuación.

//Calculating the signature
byte[] signature = sign.sign();

Paso 9: inicialice el objeto de firma para su verificación

Para verificar un objeto Signature, primero debe inicializarlo usando el initVerify() método el método acepta un PublicKey objeto.

Por lo tanto, inicialice el objeto Signature para su verificación utilizando el initVerify() método como se muestra a continuación.

//Initializing the signature
sign.initVerify(pair.getPublic());

Paso 10: actualice los datos a verificar

Actualice el objeto inicializado (para verificación) con los datos que se van a verificar utilizando el método de actualización que se muestra a continuación.

//Update the data to be verified
sign.update(bytes);

Paso 11: verificar la firma

los verify()El método de la clase Signature acepta otro objeto de firma y lo verifica con el actual. Si se produce una coincidencia, devuelve verdadero; de lo contrario, devuelve falso.

Verifique la firma usando este método como se muestra a continuación.

//Verify the signature
boolean bool = sign.verify(signature);

Ejemplo

El siguiente programa Java acepta un mensaje del usuario, genera una firma digital para el mensaje dado y lo verifica.

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

import java.util.Scanner;

public class SignatureVerification {
   public static void main(String args[]) throws Exception{
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
	      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
	      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();
      
      //Getting the privatekey from the key pair
      PrivateKey privKey = pair.getPrivate();

      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withDSA");

      //Initializing the signature
      sign.initSign(privKey);
      byte[] bytes = "Hello how are you".getBytes();
      
      //Adding data to the signature
      sign.update(bytes);
      
      //Calculating the signature
      byte[] signature = sign.sign();      
      
      //Initializing the signature
      sign.initVerify(pair.getPublic());
      sign.update(bytes);
      
      //Verifying the signature
      boolean bool = sign.verify(signature);
      
      if(bool) {
         System.out.println("Signature verified");   
      } else {
         System.out.println("Signature failed");
      }
   }
}

Salida

El programa anterior genera la siguiente salida:

Signature verified