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