Cryptographie Java - Création de signature

Les signatures numériques nous permettent de vérifier l'auteur, la date et l'heure des signatures, d'authentifier le contenu du message. Il comprend également une fonction d'authentification pour des capacités supplémentaires.

Avantages de la signature numérique

Dans cette section, nous découvrirons les différentes raisons qui justifient l'utilisation de la signature numérique. Il existe plusieurs raisons d'implémenter des signatures numériques dans les communications -

Authentification

Les signatures numériques aident à authentifier les sources des messages. Par exemple, si la succursale d'une banque envoie un message au bureau central, demandant la modification du solde d'un compte. Si le bureau central ne pouvait pas authentifier que le message est envoyé à partir d'une source autorisée, agir sur une telle demande pourrait être une grave erreur.

Intégrité

Une fois le message signé, tout changement dans le message invaliderait la signature.

Non-répudiation

Par cette propriété, toute entité qui a signé certaines informations ne peut plus tard nier l'avoir signée.

Création de la signature numérique

Apprenons maintenant à créer une signature numérique. Vous pouvez créer une signature numérique à l'aide de Java 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()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 à l'aide dugenerateKeyPair() 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 La classe accepte un paramètre de chaîne représentant l'algorithme de signature requis et renvoie 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 actuel 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 à l'aide du sign() méthode comme indiqué ci-dessous.

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

Example

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

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

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

Enter some text
Hi how are you
Digital signature for given text: [email protected]???-?.???? /yGL?i??a!?