Cryptographie Java - Guide rapide

La cryptographie est l'art et la science de créer un système cryptographique capable d'assurer la sécurité de l'information.

La cryptographie traite de la sécurisation effective des données numériques. Il fait référence à la conception de mécanismes basés sur des algorithmes mathématiques qui fournissent des services fondamentaux de sécurité de l'information. Vous pouvez considérer la cryptographie comme l'établissement d'une grande boîte à outils contenant différentes techniques dans les applications de sécurité.

Qu'est-ce que la cryptanalyse?

L'art et la science de la rupture du texte chiffré sont connus sous le nom de cryptanalyse.

La cryptanalyse est la branche sœur de la cryptographie et les deux coexistent. Le processus cryptographique aboutit au texte chiffré pour la transmission ou le stockage. Il s'agit de l'étude des mécanismes cryptographiques avec l'intention de les briser. La cryptanalyse est également utilisée lors de la conception des nouvelles techniques cryptographiques pour tester leurs forces de sécurité.

Primitives de cryptographie

Les primitives de cryptographie ne sont rien d'autre que les outils et techniques de cryptographie qui peuvent être utilisés de manière sélective pour fournir un ensemble de services de sécurité souhaités -

  • Encryption
  • Fonctions de hachage
  • Codes d'authentification de message (MAC)
  • Signatures numériques

Cryptographie en Java

L'architecture de cryptographie Java (JCA) est un ensemble d'API permettant de mettre en œuvre des concepts de cryptographie moderne tels que les signatures numériques, les résumés de messages, les certificats, le cryptage, la génération et la gestion de clés et la génération de nombres aléatoires sécurisés, etc.

À l'aide de JCA, les développeurs peuvent créer leurs applications en y intégrant la sécurité.

Pour intégrer la sécurité dans vos applications plutôt que de dépendre des algorithmes de sécurité complexes, vous pouvez facilement appeler les API respectives fournies dans JCA pour les services requis.

Les fonctions de hachage sont extrêmement utiles et apparaissent dans presque toutes les applications de sécurité de l'information.

Une fonction de hachage est une fonction mathématique qui convertit une valeur d'entrée numérique en une autre valeur numérique compressée. L'entrée de la fonction de hachage est de longueur arbitraire mais la sortie est toujours de longueur fixe.

Les valeurs renvoyées par une fonction de hachage sont appelées message digest ou simplement hash values. L'image suivante illustre la fonction de hachage.

Java fournit une classe nommée MessageDigestqui appartient au package java.security. Cette classe prend en charge des algorithmes tels que les algorithmes SHA-1, SHA 256, MD5 pour convertir un message de longueur arbitraire en résumé de message.

Pour convertir un message donné en résumé de message, suivez les étapes ci-dessous -

Étape 1: créer un objet MessageDigest

La classe MessageDigest fournit une méthode nommée getInstance(). Cette méthode accepte une variable String spécifiant le nom de l'algorithme à utiliser et renvoie un objet MessageDigest implémentant l'algorithme spécifié.

Créez un objet MessageDigest à l'aide de getInstance() méthode comme indiqué ci-dessous.

MessageDigest md = MessageDigest.getInstance("SHA-256");

Étape 2: transmettre les données à l'objet MessageDigest créé

Après avoir créé l'objet de résumé de message, vous devez lui transmettre le message / les données. Vous pouvez le faire en utilisant leupdate() méthode de la MessageDigest class, cette méthode accepte un tableau d'octets représentant le message et l'ajoute / le transmet à l'objet MessageDigest créé ci-dessus.

md.update(msg.getBytes());

Étape 3: générer le résumé du message

Vous pouvez générer le résumé de message à l'aide du digest() méthode de la classe MessageDigest cette méthode calcule la fonction de hachage sur l'objet actuel et renvoie le résumé du message sous la forme d'un tableau d'octets.

Générez le résumé du message à l'aide de la méthode digest.

byte[] digest = md.digest();

Exemple

Voici un exemple qui lit les données d'un fichier, génère un résumé de message et l'imprime.

import java.security.MessageDigest;
import java.util.Scanner;

public class MessageDigestExample {
   public static void main(String args[]) throws Exception{
      //Reading data from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter the message");
      String message = sc.nextLine();
	  
      //Creating the MessageDigest object  
      MessageDigest md = MessageDigest.getInstance("SHA-256");

      //Passing data to the created MessageDigest Object
      md.update(message.getBytes());
      
      //Compute the message digest
      byte[] digest = md.digest();      
      System.out.println(digest);  
     
      //Converting the byte array in to HexString format
      StringBuffer hexString = new StringBuffer();
      
      for (int i = 0;i<digest.length;i++) {
         hexString.append(Integer.toHexString(0xFF & digest[i]));
      }
      System.out.println("Hex format : " + hexString.toString());     
   }
}

Production

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

Enter the message
Hello how are you
[B@55f96302
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3

MAC (Message Authentication Code) est une technique cryptographique à clé symétrique pour fournir une authentification de message. Pour établir le processus MAC, l'expéditeur et le destinataire partagent une clé symétrique K.

Essentiellement, un MAC est une somme de contrôle chiffrée générée sur le message sous-jacent qui est envoyé avec un message pour garantir l'authentification du message.

Le processus d'utilisation de MAC pour l'authentification est décrit dans l'illustration suivante:

À Java, le Mac classe de la javax.cryptopackage fournit la fonctionnalité du code d'authentification de message. Suivez les étapes ci-dessous pour créer un code d'authentification de message à l'aide de cette classe.

Étape 1: créer un objet KeyGenerator

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

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

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

Étape 2: créer un objet SecureRandom

le SecureRandom classe de la java.SecurityLe package fournit un puissant générateur de nombres aléatoires qui est utilisé pour générer des nombres aléatoires en Java. Instanciez cette classe comme indiqué ci-dessous.

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

Étape 3: initialiser le KeyGenerator

le KeyGenerator classe fournit une méthode nommée init() cette méthode accepte le SecureRandom objet et initialise le courant KeyGenerator.

Initialisez l'objet KeyGenerator créé à l'étape précédente à l'aide de cette méthode.

//Initializing the KeyGenerator
keyGen.init(secRandom);

Étape 4: générer la clé

Générer la clé en utilisant generateKey() méthode de la KeyGenerator classe comme indiqué ci-dessous.

//Creating/Generating a key
Key key = keyGen.generateKey();

Étape 5: Initialisez l'objet Mac

le init() La méthode de la classe Mac accepte un objet Key et initialise l'objet Mac actuel à l'aide de la clé donnée.

//Initializing the Mac object
mac.init(key);

Étape 6: Terminez l'opération Mac

le doFinal()La méthode de la classe Mac est utilisée pour terminer l'opération Mac. Transmettez les données requises sous forme de tableau d'octets à cette méthode et terminez l'opération comme indiqué ci-dessous.

//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);

Exemple

L'exemple suivant illustre la génération du code d'authentification de message (MAC) à l'aide de JCA. Ici, nous prenons un simple message "Salut, comment allez-vous" et générons un Mac pour ce message.

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;

public class MacSample {
   public static void main(String args[]) throws Exception{
      //Creating a KeyGenerator object
      KeyGenerator keyGen = KeyGenerator.getInstance("DES");

      //Creating a SecureRandom object
      SecureRandom secRandom = new SecureRandom();

      //Initializing the KeyGenerator
      keyGen.init(secRandom);

      //Creating/Generating a key
      Key key = keyGen.generateKey();	 

      //Creating a Mac object
      Mac mac = Mac.getInstance("HmacSHA256");

      //Initializing the Mac object
      mac.init(key);

      //Computing the Mac
      String msg = new String("Hi how are you");
      byte[] bytes = msg.getBytes();      
      byte[] macResult = mac.doFinal(bytes);

      System.out.println("Mac result:");
      System.out.println(new String(macResult));     
   }
}

Production

Le programme ci-dessus générera la sortie suivante -

Mac result:
HÖ„^ǃÎ_Utbh…?š_üzØSSÜh_ž_œa0ŽV?

Un cryptosystème est une mise en œuvre de techniques cryptographiques et de leur infrastructure associée pour fournir des services de sécurité de l'information. Un cryptosystème est également appelécipher system.

Les différents composants d'un cryptosystème de base sont Plaintext, Encryption Algorithm, Ciphertext, Decryption Algorithm, Clé de chiffrement et clé de déchiffrement.

Où,

  • Encryption Keyest une valeur connue de l'expéditeur. L'expéditeur entre la clé de chiffrement dans l'algorithme de chiffrement avec le texte en clair afin de calculer le texte chiffré.

  • Decryption Keyest une valeur connue du récepteur. La clé de déchiffrement est liée à la clé de chiffrement, mais ne lui est pas toujours identique. Le récepteur entre la clé de déchiffrement dans l'algorithme de déchiffrement avec le texte chiffré afin de calculer le texte en clair.

Fondamentalement, il existe deux types de clés / cryptosystèmes basés sur le type d'algorithmes de cryptage-décryptage.

Chiffrement par clé symétrique

Le processus de cryptage où same keys are used for encrypting and decrypting l'information est connue sous le nom de cryptage à clé symétrique.

L'étude des cryptosystèmes symétriques est appelée symmetric cryptography. Les cryptosystèmes symétriques sont également parfois appeléssecret key cryptosystems.

Voici quelques exemples courants de chiffrement à clé symétrique -

  • Norme de cryptage numérique (DES)
  • Triple-DES (3DES)
  • IDEA
  • BLOWFISH

Chiffrement de clé asymétrique

Le processus de cryptage où different keys are used for encrypting and decrypting the informationest connu sous le nom de cryptage par clé asymétrique. Bien que les clés soient différentes, elles sont mathématiquement liées et, par conséquent, il est possible de récupérer le texte brut en déchiffrant le texte chiffré.

Les clés et certificats utilisés / générés sont stockés dans une base de données appelée keystore. Par défaut, cette base de données est stockée dans un fichier nommé.keystore.

Vous pouvez accéder au contenu de cette base de données en utilisant le KeyStore classe de la java.securitypaquet. Cela gère trois entrées différentes à savoir, PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Stockage d'une clé dans le keystore

Dans cette section, nous allons apprendre à stocker une clé dans un keystore. Pour stocker une clé dans le keystore, suivez les étapes ci-dessous.

Étape 1: créer un objet KeyStore

le getInstance() méthode de la KeyStore classe de la java.security package accepte une valeur de chaîne représentant le type du keystore et renvoie un objet KeyStore.

Créez un objet de la classe KeyStore à l'aide du getInstance() méthode comme indiqué ci-dessous.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

Étape 2: chargez l'objet KeyStore

le load() La méthode de la classe KeyStore accepte un objet FileInputStream représentant le fichier keystore et un paramètre String spécifiant le mot de passe du KeyStore.

En général, le KeyStore est stocké dans le fichier nommé cacerts, à l'emplacement C:/Program Files/Java/jre1.8.0_101/lib/security/ et son mot de passe par défaut est changeit, chargez-le en utilisant le load() méthode comme indiqué ci-dessous.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

Étape 3: Créez l'objet KeyStore.ProtectionParameter

Instanciez le KeyStore.ProtectionParameter comme indiqué ci-dessous.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Étape 4: créer un objet SecretKey

Créer le SecretKey (interface) objet en instanciant sa sous-classe SecretKeySpec. Lors de l'instanciation, vous devez transmettre le mot de passe et l'algorithme en tant que paramètres à son constructeur, comme indiqué ci-dessous.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Étape 5: créer un objet SecretKeyEntry

Créez un objet du SecretKeyEntry classe en passant le SecretKey objet créé à l'étape ci-dessus comme indiqué ci-dessous.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

Étape 6: définir une entrée dans le KeyStore

le setEntry() méthode de la KeyStore la classe accepte un paramètre String représentant l'alias d'entrée du keystore, un SecretKeyEntry object, un objet ProtectionParameter et, stocke l'entrée sous l'alias donné.

Définissez l'entrée dans le fichier de clés à l'aide du setEntry() méthode comme indiqué ci-dessous.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Example

L'exemple suivant stocke les clés dans le keystore existant dans le fichier «cacerts» (système d'exploitation Windows 10).

import java.io.FileInputStream;
import java.security.KeyStore;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class StoringIntoKeyStore{
   public static void main(String args[]) throws Exception {
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the KeyStore object
      char[] password = "changeit".toCharArray();
      String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
      java.io.FileInputStream fis = new FileInputStream(path);
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      System.out.println("data stored");
   }
}

Output

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

System.out.println("data stored");

Dans ce chapitre, nous allons apprendre à récupérer une clé du keystore à l'aide de la cryptographie Java.

Pour récupérer une clé du keystore, suivez les étapes ci-dessous.

Étape 1: créer un objet KeyStore

le getInstance() méthode de la KeyStore classe de la java.security package accepte une valeur de chaîne représentant le type du keystore et renvoie un objet KeyStore.

Créez un objet de la classe KeyStore à l'aide de cette méthode comme indiqué ci-dessous.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

Étape 2: chargez l'objet KeyStore

le load() méthode de la classe KeyStore accepte un FileInputStream objet représentant le fichier keystore et un paramètre String spécifiant le mot de passe du KeyStore.

En général, le KeyStore est stocké dans le fichier nommé cacerts, à l'emplacement C:/Program Files/Java/jre1.8.0_101/lib/security/ et son mot de passe par défaut est changeit, chargez-le en utilisant le load() méthode comme indiqué ci-dessous.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

Étape 3: Créez l'objet KeyStore.ProtectionParameter

Instanciez le KeyStore.ProtectionParameter comme indiqué ci-dessous.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Étape 4: créer un objet SecretKey

Créer le SecretKey (interface) objet en instanciant sa sous-classe SecretKeySpec. Lors de l'instanciation, vous devez transmettre le mot de passe et l'algorithme en tant que paramètres à son constructeur, comme indiqué ci-dessous.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Étape 5: créer un objet SecretKeyEntry

Créez un objet du SecretKeyEntry classe en passant le SecretKey objet créé à l'étape ci-dessus comme indiqué ci-dessous.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

Étape 6: définir une entrée dans le KeyStore

le setEntry() méthode de la KeyStore la classe accepte un paramètre String représentant l'alias d'entrée du keystore, un SecretKeyEntry object, un objet ProtectionParameter et, stocke l'entrée sous l'alias donné.

Définissez l'entrée dans le fichier de clés à l'aide du setEntry() méthode comme indiqué ci-dessous.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Étape 7: Créez l'objet KeyStore.SecretKeyEntry

le getEntry() méthode de la classe KeyStore accepte un alias (paramètre String) et, un objet de la classe ProtectionParameter comme paramètres et retourne un KeyStoreEntry objet alors vous pouvez le lancer dans KeyStore.SecretKeyEntry objet.

Créez un objet de la classe KeyStore.SecretKeyEntry en passant l'alias de la clé requise et l'objet de paramètre de protection créé dans les étapes précédentes, au getEntry() méthode comme indiqué ci-dessous.

//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

Étape 8: Créez l'objet clé de l'entrée récupérée

le getSecretKey() méthode de la SecretKeyEntryclass renvoie un objet SecretKey. À l'aide de cette méthode, créez un objet SecretKey comme indiqué ci-dessous.

//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
System.out.println(mysecretKey);

Exemple

L'exemple suivant montre comment récupérer des clés à partir d'un magasin de clés. Ici, nous stockons une clé dans un keystore, qui se trouve dans le fichier «cacerts» (système d'exploitation Windows 10), la récupérons et en affichons certaines de ses propriétés telles que l'algorithme utilisé pour générer la clé et, le format de la clé récupérée.

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStore.ProtectionParameter;
import java.security.KeyStore.SecretKeyEntry;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class RetrievingFromKeyStore{
   public static void main(String args[]) throws Exception{
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the the KeyStore object
      char[] password = "changeit".toCharArray();
      java.io.FileInputStream fis = new FileInputStream(
         "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts");
      
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      SecretKeyEntry secretKeyEntry = new SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      
      //Creating the KeyStore.SecretKeyEntry object
      SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

      //Creating SecretKey object
      SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
      System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm());   
      System.out.println("Format used for the key: "+mysecretKey.getFormat());
   }
}

Production

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

Algorithm used to generate key: DSA
Format of the key: RAW

Java fournit KeyGenerator class cette classe est utilisée pour générer des clés secrètes et les objets de cette classe sont réutilisables.

Pour générer des clés à l'aide de la classe KeyGenerator, suivez les étapes ci-dessous.

Étape 1: créer un objet KeyGenerator

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

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

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

Étape 2: créer un objet SecureRandom

le SecureRandom classe de la java.SecurityLe package fournit un puissant générateur de nombres aléatoires qui est utilisé pour générer des nombres aléatoires en Java. Instanciez cette classe comme indiqué ci-dessous.

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

Étape 3: initialiser le KeyGenerator

le KeyGenerator classe fournit une méthode nommée init() cette méthode accepte l'objet SecureRandom et initialise le courant KeyGenerator.

Initialisez l'objet KeyGenerator créé à l'étape précédente à l'aide du init() méthode.

//Initializing the KeyGenerator
keyGen.init(secRandom);

Exemple

L'exemple suivant montre la génération de clé de la clé secrète à l'aide de la classe KeyGenerator du javax.crypto paquet.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import java.security.Key;
import java.security.SecureRandom;

public class KeyGeneratorExample {
   public static void main(String args[]) throws Exception{
      //Creating a KeyGenerator object
      KeyGenerator keyGen = KeyGenerator.getInstance("DES");
      
      //Creating a SecureRandom object
      SecureRandom secRandom = new SecureRandom();
      
      //Initializing the KeyGenerator
      keyGen.init(secRandom);
      
      //Creating/Generating a key
      Key key = keyGen.generateKey();
      
      System.out.println(key);      
      Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");      
      cipher.init(cipher.ENCRYPT_MODE, key);      

      String msg = new String("Hi how are you");
      byte[] bytes = cipher.doFinal(msg.getBytes());      
      System.out.println(bytes);      
   }
}

Production

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

com.sun.crypto.provider.DESKey@18629
[B@2ac1fdc4

Java fournit le KeyPairGeneratorclasse. Cette classe est utilisée pour générer des paires de clés publiques et privées. Pour générer des clés à l'aide duKeyPairGenerator classe, suivez 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 de cette 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 de la KeyPairGeneratorclasse. Générez la paire de clés à l'aide de cette méthode, comme indiqué ci-dessous.

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

Étape 4: Obtenez la clé privée / clé publique

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

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

Vous pouvez obtenir la clé publique de l'objet KeyPair généré à l'aide du getPublic() méthode comme indiqué ci-dessous.

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

Exemple

L'exemple suivant montre la génération de clé de la clé secrète à l'aide de la classe KeyPairGenerator du javax.crypto paquet.

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

public class KeyPairGenertor {
   public static void main(String args[]) throws Exception{
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
      
      //Initializing the KeyPairGenerator
      keyPairGen.initialize(2048);
      
      //Generating the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();
      
      //Getting the private key from the key pair
      PrivateKey privKey = pair.getPrivate();   
      
      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic(); 
      System.out.println("Keys generated");
   }
}

Production

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

Keys generated

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: 0=@gRD???-?.???? /yGL?i??a!?

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 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 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

Vous pouvez crypter des données données à l'aide de la classe Cipher du javax.cryptopaquet. Suivez les étapes ci-dessous pour crypter les données données à l'aide de Java.

É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 de la KeyPairGeneratorclasse. Générez la paire de clés à l'aide de cette méthode, comme indiqué ci-dessous.

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

Étape 4: Obtenez la clé publique

Vous pouvez obtenir la clé publique à partir du fichier généré KeyPair objet utilisant le getPublic() méthode comme indiqué ci-dessous.

Obtenez la clé publique en utilisant cette méthode comme indiqué ci-dessous.

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

Étape 5: créer un objet Cipher

le getInstance() méthode de Cipher La classe accepte une variable String représentant la transformation requise et renvoie un objet Cipher qui implémente la transformation donnée.

Créez l'objet Cipher à l'aide du getInstance() méthode comme indiqué ci-dessous.

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Étape 6: Initialisez l'objet Cipher

le init() méthode de la Cipher La classe accepte deux paramètres, un paramètre entier représentant le mode de fonctionnement (chiffrer / déchiffrer) et, un objet Key représentant la clé publique.

Initialisez l'objet Cypher à l'aide du init() méthode comme indiqué ci-dessous.

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

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

le update() La méthode de la classe Cipher accepte un tableau d'octets représentant les données à chiffrer et met à jour l'objet actuel avec les données fournies.

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

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

Étape 8: Crypter les données

le doFinal()La méthode de la classe Cipher termine l'opération de chiffrement. Par conséquent, terminez le cryptage en utilisant cette méthode comme indiqué ci-dessous.

//Encrypting the data
byte[] cipherText = cipher.doFinal();

Exemple

Le programme Java suivant accepte le texte de l'utilisateur, le crypte à l'aide de l'algorithme RSA et imprime le format crypté du texte donné.

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

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;

public class CipherSample {
   public static void main(String args[]) throws Exception{
      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withRSA");
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generating the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();      
	
      //Creating a Cipher object
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        
      //Initializing a Cipher object
      cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());
	  
      //Adding data to the cipher
      byte[] input = "Welcome to Tutorialspoint".getBytes();	  
      cipher.update(input);
	  
      //encrypting the data
      byte[] cipherText = cipher.doFinal();	 
      System.out.println(new String(cipherText, "UTF8"));
   }
}

Production

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

Encrypted Text: 
"???:]J_?]???;Xl??????*@??u???r??=T&???_?_??.??i?????(?$_f?zD??????ZGH??g??? g?E:_??bz^??f?~o???t?}??u=uzp\UI????Z??l[?G?3??Y?UAEfKT?f?O??N_?d__?????a_?15%?^? 'p?_?$,9"{??^??y??_?t???,?W?PCW??~??[?$??????e????f?Y-Zi__??_??w?_?&QT??`?`~?[?K_??_???

Vous pouvez déchiffrer les données chiffrées à l'aide de la classe Cipher du javax.cryptopaquet. Suivez les étapes ci-dessous pour décrypter les données données à l'aide de Java.

É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 de la KeyPairGeneratorclasse. Générez la paire de clés à l'aide de cette méthode, comme indiqué ci-dessous.

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

Étape 4: Obtenez la clé publique

Vous pouvez obtenir la clé publique de l'objet KeyPair généré à l'aide du getPublic() méthode comme indiqué ci-dessous.

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

Étape 5: créer un objet Cipher

le getInstance() méthode de Cipher La classe accepte une variable String représentant la transformation requise et renvoie un objet Cipher qui implémente la transformation donnée.

Créez l'objet Cipher à l'aide du getInstance() méthode comme indiqué ci-dessous.

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Étape 6: Initialisez l'objet Cipher

le init() La méthode de la classe Cipher accepte deux paramètres

  • Un paramètre entier représentant le mode de fonctionnement (chiffrer / déchiffrer)
  • Objet clé représentant la clé publique

Initialisez l'objet Cypher à l'aide du init() méthode comme indiqué ci-dessous.

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

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

le update() La méthode de la classe Cipher accepte un tableau d'octets représentant les données à chiffrer et met à jour l'objet actuel avec les données fournies.

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

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

Étape 8: Crypter les données

le doFinal()La méthode de la classe Cipher termine l'opération de chiffrement. Par conséquent, terminez le cryptage en utilisant cette méthode comme indiqué ci-dessous.

//Encrypting the data
byte[] cipherText = cipher.doFinal();

Étape 9: Initialisez l'objet Cipher pour le déchiffrement

Pour déchiffrer le chiffrement chiffré dans les étapes précédentes, vous devez l'initialiser pour le déchiffrement.

Par conséquent, initialisez l'objet de chiffrement en passant les paramètres Cipher.DECRYPT_MODE et l'objet PrivateKey comme indiqué ci-dessous.

//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());

Étape 10: décrypter les données

Enfin, décryptez le texte chiffré à l'aide du doFinal() méthode comme indiqué ci-dessous.

//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);

Exemple

Le programme Java suivant accepte le texte de l'utilisateur, le crypte à l'aide de l'algorithme RSA et, imprime le chiffre du texte donné, déchiffre le chiffre et imprime à nouveau le texte décrypté.

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

import javax.crypto.Cipher;

public class CipherDecrypt {
   public static void main(String args[]) throws Exception{
	   //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withRSA");
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();   
      
      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic();  

      //Creating a Cipher object
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

      //Initializing a Cipher object
      cipher.init(Cipher.ENCRYPT_MODE, publicKey);
	  
      //Add data to the cipher
      byte[] input = "Welcome to Tutorialspoint".getBytes();	  
      cipher.update(input);
	  
      //encrypting the data
      byte[] cipherText = cipher.doFinal();	 
      System.out.println( new String(cipherText, "UTF8"));

      //Initializing the same cipher for decryption
      cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
      
      //Decrypting the text
      byte[] decipheredText = cipher.doFinal(cipherText);
      System.out.println(new String(decipheredText));
   }
}

Production

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

Encrypted Text:
]/[?F3?D?p
v?w?!?H???^?A??????P?u??FA?
?
???_?? ???_jMH-??>??OP?'?j?_?n`
?_??'`????o??_GL??g???g_f?????f|???LT?|?Vz_TDu#??\?<b,,?$C2???Bq?#?lDB`??g,^??K?_?v???`}
?;LX?a?_5e???#???_?6?/B&B_???^?__Ap^#_?q?IEh????_?,??*??]~_?_?D?
_y???lp??a?P_U{

Decrypted Text:
Welcome to Tutorialspoint