Cryptographie Java - Vérification de la signature

Vous pouvez créer une signature numérique à l'aide de Java et la vérifier en suivant les étapes ci-dessous.

Étape 1: créer un objet KeyPairGenerator

le KeyPairGenerator classe fournit getInstance() qui accepte une variable String représentant l'algorithme de génération de clé requis et renvoie un objet KeyPairGenerator qui génère des clés.

Créer KeyPairGenerator objet utilisant le getInstance() méthode comme indiqué ci-dessous.

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

Étape 2: initialiser l'objet KeyPairGenerator

le KeyPairGenerator classe fournit une méthode nommée initialize()méthode. Cette méthode est utilisée pour initialiser le générateur de paires de clés. Cette méthode accepte une valeur entière représentant la taille de la clé.

Initialisez l'objet KeyPairGenerator créé à l'étape précédente à l'aide du initialize() méthode comme indiqué ci-dessous.

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

Étape 3: générer le KeyPairGenerator

Vous pouvez générer le KeyPair en utilisant le generateKeyPair()méthode. Générez la paire de clés en utilisant cette méthode comme indiqué ci-dessous.

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

Étape 4: Obtenez la clé privée de la paire

Vous pouvez obtenir la clé privée de l'objet KeyPair généré à l'aide du getPrivate() méthode.

Obtenez la clé privée à l'aide du getPrivate() méthode comme indiqué ci-dessous.

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

Étape 5: créer un objet de signature

le getInstance() méthode de la Signature class accepte un paramètre de chaîne représentant l'algorithme de signature requis et retourne l'objet Signature respectif.

Créez un objet de la classe Signature à l'aide du getInstance() méthode.

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

Étape 6: Initialisez l'objet Signature

le initSign() méthode de la classe Signature accepte un PrivateKey objet et initialise l'objet Signature actuel.

Initialisez l'objet Signature créé à l'étape précédente à l'aide du initSign() méthode comme indiqué ci-dessous.

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

Étape 7: Ajouter des données à l'objet Signature

le update() La méthode de la classe Signature accepte un tableau d'octets représentant les données à signer ou à vérifier et met à jour l'objet courant avec les données fournies.

Mettez à jour l'objet Signature initialisé en transmettant les données à signer au update() sous la forme d'un tableau d'octets comme indiqué ci-dessous.

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

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

Étape 8: Calculez la signature

le sign() méthode de la Signature class renvoie les octets de signature des données mises à jour.

Calculez la signature en utilisant la méthode sign () comme indiqué ci-dessous.

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

Étape 9: Initialisez l'objet de signature pour vérification

Pour vérifier un objet Signature, vous devez d'abord l'initialiser à l'aide du initVerify() méthode it méthode accepte un PublicKey objet.

Par conséquent, initialisez l'objet Signature pour vérification à l'aide du initVerify() méthode comme indiqué ci-dessous.

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

Étape 10: Mettez à jour les données à vérifier

Mettez à jour l'objet initialisé (pour vérification) avec les données les données à vérifier en utilisant la méthode de mise à jour comme indiqué ci-dessous.

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

Étape 11: Vérifiez la signature

le verify()La méthode de la classe Signature accepte un autre objet de signature et le vérifie avec l'actuel. Si une correspondance se produit, elle renvoie true sinon elle retourne false.

Vérifiez la signature en utilisant cette méthode comme indiqué ci-dessous.

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

Exemple

Le programme Java suivant accepte un message de l'utilisateur, génère une signature numérique pour le message donné et le vérifie.

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");
      }
   }
}

Production

Le programme ci-dessus génère la sortie suivante -

Signature verified