Crittografia Java - Verifica della firma

È possibile creare una firma digitale utilizzando Java e verificarla seguendo i passaggi indicati di seguito.

Passaggio 1: crea un oggetto KeyPairGenerator

Il KeyPairGenerator classe fornisce getInstance() che accetta una variabile String che rappresenta l'algoritmo di generazione delle chiavi richiesto e restituisce un oggetto KeyPairGenerator che genera le chiavi.

Creare KeyPairGenerator oggetto utilizzando il getInstance() metodo come mostrato di seguito.

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

Passaggio 2: inizializza l'oggetto KeyPairGenerator

Il KeyPairGenerator class fornisce un metodo denominato initialize()metodo. Questo metodo viene utilizzato per inizializzare il generatore di coppie di chiavi. Questo metodo accetta un valore intero che rappresenta la dimensione della chiave.

Inizializza l'oggetto KeyPairGenerator creato nel passaggio precedente utilizzando l'estensione initialize() metodo come mostrato di seguito.

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

Passaggio 3: genera il KeyPairGenerator

Puoi generare il file KeyPair usando il generateKeyPair()metodo. Genera la coppia di chiavi utilizzando questo metodo come mostrato di seguito.

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

Passaggio 4: ottieni la chiave privata dalla coppia

È possibile ottenere la chiave privata dall'oggetto KeyPair generato utilizzando il getPrivate() metodo.

Ottieni la chiave privata utilizzando il getPrivate() metodo come mostrato di seguito.

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

Passaggio 5: crea un oggetto firma

Il getInstance() metodo del Signature class accetta un parametro stringa che rappresenta l'algoritmo di firma richiesto e restituisce il rispettivo oggetto Signature.

Crea un oggetto della classe Signature utilizzando il file getInstance() metodo.

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

Passaggio 6: inizializza l'oggetto Firma

Il initSign() metodo della classe Signature accetta a PrivateKey object e inizializza l'oggetto Signature corrente.

Inizializza l'oggetto Firma creato nel passaggio precedente utilizzando il file initSign() metodo come mostrato di seguito.

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

Passaggio 7: aggiungere dati all'oggetto Firma

Il update() Il metodo della classe Signature accetta un array di byte che rappresenta i dati da firmare o verificare e aggiorna l'oggetto corrente con i dati forniti.

Aggiorna l'oggetto Signature inizializzato passando i dati da firmare al file update() metodo sotto forma di array di byte come mostrato di seguito.

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

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

Passaggio 8: calcolare la firma

Il sign() metodo del Signature class restituisce i byte di firma dei dati aggiornati.

Calcola la firma utilizzando il metodo sign () come mostrato di seguito.

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

Passaggio 9: inizializza l'oggetto firma per la verifica

Per verificare un oggetto Signature è necessario inizializzarlo prima utilizzando il initVerify() metodo it metodo accetta a PublicKey oggetto.

Pertanto, inizializza l'oggetto Signature per la verifica utilizzando il file initVerify() metodo come mostrato di seguito.

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

Passaggio 10: aggiorna i dati da verificare

Aggiorna l'oggetto inizializzato (per la verifica) con i dati da verificare utilizzando il metodo di aggiornamento come mostrato di seguito.

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

Passaggio 11: verifica della firma

Il verify()Il metodo della classe Signature accetta un altro oggetto firma e lo verifica con quello corrente. Se si verifica una corrispondenza, restituisce true altrimenti restituisce false.

Verificare la firma utilizzando questo metodo come mostrato di seguito.

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

Esempio

Il seguente programma Java accetta un messaggio dall'utente, genera una firma digitale per il messaggio dato e 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");
      }
   }
}

Produzione

Il programma di cui sopra genera il seguente output:

Signature verified