Crittografia Java - Creazione della firma

Le firme digitali ci consentono di verificare l'autore, la data e l'ora delle firme, autenticare il contenuto del messaggio. Include anche la funzione di autenticazione per funzionalità aggiuntive.

Vantaggi della firma digitale

In questa sezione, apprenderemo i diversi motivi che richiedono l'uso della firma digitale. Ci sono diversi motivi per implementare le firme digitali nelle comunicazioni:

Autenticazione

Le firme digitali aiutano ad autenticare le origini dei messaggi. Ad esempio, se la filiale di una banca invia un messaggio all'ufficio centrale, richiedendo la modifica del saldo di un conto. Se l'ufficio centrale non è in grado di autenticare il messaggio inviato da una fonte autorizzata, agire su tale richiesta potrebbe essere un grave errore.

Integrità

Una volta che il messaggio è stato firmato, qualsiasi modifica nel messaggio invaliderebbe la firma.

Non ripudio

Con questa proprietà, qualsiasi entità che ha firmato alcune informazioni non può in un secondo momento negare di averle firmate.

Creazione della firma digitale

Impariamo ora come creare una firma digitale. È possibile creare una firma digitale utilizzando Java 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()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 ilgenerateKeyPair() 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 sign() metodo come mostrato di seguito.

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

Example

Il seguente programma Java accetta un messaggio dall'utente e genera una firma digitale per il messaggio specificato.

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

public class CreatingDigitalSignature {
   public static void main(String args[]) throws Exception {
      //Accepting text from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter some text");
      String msg = sc.nextLine();
      
      //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 private key from the key pair
      PrivateKey privKey = pair.getPrivate();
      
      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withDSA");
      
      //Initialize the signature
      sign.initSign(privKey);
      byte[] bytes = "msg".getBytes();
      
      //Adding data to the signature
      sign.update(bytes);
      
      //Calculating the signature
      byte[] signature = sign.sign();
      
      //Printing the signature
      System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
   }
}

Output

Il programma di cui sopra genera il seguente output:

Enter some text
Hi how are you
Digital signature for given text: 0=@gRD???-?.???? /yGL?i??a!?