Java Cryptography - Kurzanleitung

Kryptographie ist die Kunst und Wissenschaft, ein Kryptosystem herzustellen, das Informationssicherheit bietet.

Die Kryptographie befasst sich mit der eigentlichen Sicherung digitaler Daten. Es bezieht sich auf den Entwurf von Mechanismen, die auf mathematischen Algorithmen basieren und grundlegende Informationssicherheitsdienste bereitstellen. Sie können sich Kryptografie als die Einrichtung eines großen Toolkits vorstellen, das verschiedene Techniken in Sicherheitsanwendungen enthält.

Was ist Kryptoanalyse?

Die Kunst und Wissenschaft, den Chiffretext zu brechen, ist als Kryptoanalyse bekannt.

Die Kryptoanalyse ist der Schwesterzweig der Kryptographie und beide existieren nebeneinander. Der kryptografische Prozess führt zum Verschlüsselungstext zur Übertragung oder Speicherung. Es beinhaltet die Untersuchung des kryptografischen Mechanismus mit der Absicht, sie zu brechen. Die Kryptoanalyse wird auch beim Entwurf der neuen kryptografischen Techniken verwendet, um ihre Sicherheitsstärken zu testen.

Kryptographie-Grundelemente

Kryptografie-Grundelemente sind nichts anderes als die Werkzeuge und Techniken in der Kryptografie, die selektiv verwendet werden können, um eine Reihe gewünschter Sicherheitsdienste bereitzustellen.

  • Encryption
  • Hash-Funktionen
  • Nachrichtenauthentifizierungscodes (MAC)
  • Digitale Signaturen

Kryptographie in Java

Die Java Cryptography Architecture (JCA) ist eine Reihe von APIs zur Implementierung von Konzepten der modernen Kryptographie wie digitale Signaturen, Nachrichtenübersichten, Zertifikate, Verschlüsselung, Schlüsselgenerierung und -verwaltung sowie sichere Zufallszahlengenerierung usw.

Mithilfe von JCA können Entwickler ihre Anwendungen erstellen und dabei die Sicherheit integrieren.

Um die Sicherheit in Ihre Anwendungen zu integrieren, anstatt von den komplizierten Sicherheitsalgorithmen abhängig zu sein, können Sie einfach die entsprechenden in JCA bereitgestellten APIs für die erforderlichen Dienste aufrufen.

Hash-Funktionen sind äußerst nützlich und erscheinen in fast allen Informationssicherheitsanwendungen.

Eine Hash-Funktion ist eine mathematische Funktion, die einen numerischen Eingabewert in einen anderen komprimierten numerischen Wert umwandelt. Die Eingabe in die Hash-Funktion hat eine beliebige Länge, die Ausgabe ist jedoch immer von fester Länge.

Von einer Hash-Funktion zurückgegebene Werte werden aufgerufen message digest oder einfach hash values. Das folgende Bild zeigt die Hash-Funktion.

Java bietet eine Klasse mit dem Namen MessageDigestwelches zum Paket java.security gehört. Diese Klasse unterstützt Algorithmen wie SHA-1-, SHA 256- und MD5-Algorithmen, um eine Nachricht beliebiger Länge in einen Nachrichtenauszug umzuwandeln.

Führen Sie die folgenden Schritte aus, um eine bestimmte Nachricht in einen Nachrichtenauszug zu konvertieren:

Schritt 1: Erstellen Sie ein MessageDigest-Objekt

Die MessageDigest-Klasse stellt eine Methode mit dem Namen bereit getInstance(). Diese Methode akzeptiert eine String-Variable, die den Namen des zu verwendenden Algorithmus angibt, und gibt ein MessageDigest-Objekt zurück, das den angegebenen Algorithmus implementiert.

Erstellen Sie das MessageDigest-Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Übergeben Sie Daten an das erstellte MessageDigest-Objekt

Nach dem Erstellen des Message Digest-Objekts müssen Sie die Nachricht / Daten an dieses übergeben. Sie können dies mit dem tunupdate() Methode der MessageDigest Klasse, akzeptiert diese Methode ein Byte-Array, das die Nachricht darstellt, und fügt es dem oben erstellten MessageDigest-Objekt hinzu / übergibt es.

md.update(msg.getBytes());

Schritt 3: Generieren Sie den Message Digest

Sie können den Message Digest mit dem generieren digest() Methode der MessageDigest-Klasse Diese Methode berechnet die Hash-Funktion für das aktuelle Objekt und gibt den Message Digest in Form eines Byte-Arrays zurück.

Generieren Sie den Message Digest mit der Digest-Methode.

byte[] digest = md.digest();

Beispiel

Das folgende Beispiel liest Daten aus einer Datei, generiert einen Nachrichtenauszug und druckt ihn aus.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

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

MAC (Message AAuthentifizierung CDer Ode-Algorithmus ist eine Kryptografietechnik mit symmetrischem Schlüssel zur Bereitstellung der Nachrichtenauthentifizierung. Zum Einrichten des MAC-Prozesses teilen sich Sender und Empfänger einen symmetrischen Schlüssel K.

Im Wesentlichen ist ein MAC eine verschlüsselte Prüfsumme, die für die zugrunde liegende Nachricht generiert wird und zusammen mit einer Nachricht gesendet wird, um die Nachrichtenauthentifizierung sicherzustellen.

Der Prozess der Verwendung von MAC zur Authentifizierung ist in der folgenden Abbildung dargestellt:

In Java die Mac Klasse der javax.cryptoDas Paket bietet die Funktionalität des Nachrichtenauthentifizierungscodes. Führen Sie die folgenden Schritte aus, um mit dieser Klasse einen Nachrichtenauthentifizierungscode zu erstellen.

Schritt 1: Erstellen Sie ein KeyGenerator-Objekt

Das KeyGenerator Klasse bietet getInstance() Methode, die eine String-Variable akzeptiert, die den erforderlichen Algorithmus zur Schlüsselgenerierung darstellt, und a zurückgibt KeyGenerator Objekt, das geheime Schlüssel generiert.

Erstellen KeyGenerator Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Erstellen Sie ein SecureRandom-Objekt

Das SecureRandom Klasse der java.SecurityDas Paket bietet einen starken Zufallszahlengenerator, mit dem Zufallszahlen in Java generiert werden. Instanziieren Sie diese Klasse wie unten gezeigt.

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

Schritt 3: Initialisieren Sie den KeyGenerator

Das KeyGenerator Klasse stellt eine Methode mit dem Namen bereit init() Diese Methode akzeptiert die SecureRandom Objekt und initialisiert den aktuellen KeyGenerator.

Initialisieren Sie das im vorherigen Schritt erstellte KeyGenerator-Objekt mit dieser Methode.

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

Schritt 4: Schlüssel generieren

Schlüssel generieren mit generateKey() Methode der KeyGenerator Klasse wie unten gezeigt.

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

Schritt 5: Initialisieren Sie das Mac-Objekt

Das init() Die Methode der Mac-Klasse akzeptiert ein Schlüsselobjekt und initialisiert das aktuelle Mac-Objekt mit dem angegebenen Schlüssel.

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

Schritt 6: Beenden Sie den Mac-Vorgang

Das doFinal()Die Methode der Mac-Klasse wird verwendet, um den Mac-Vorgang zu beenden. Übergeben Sie die erforderlichen Daten in Form eines Byte-Arrays an diese Methode und schließen Sie die Operation wie unten gezeigt ab.

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

Beispiel

Das folgende Beispiel zeigt die Generierung von Message Authentication Code (MAC) mithilfe von JCA. Hier nehmen wir eine einfache Nachricht "Hallo, wie geht es dir?" Und generieren einen Mac für diese Nachricht.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

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

Ein Kryptosystem ist eine Implementierung kryptografischer Techniken und der dazugehörigen Infrastruktur zur Bereitstellung von Informationssicherheitsdiensten. Ein Kryptosystem wird auch als bezeichnetcipher system.

Die verschiedenen Komponenten eines grundlegenden Kryptosystems sind Plaintext, Encryption Algorithm, Ciphertext, Decryption Algorithm, Verschlüsselungsschlüssel und Entschlüsselungsschlüssel.

Wo,

  • Encryption Keyist ein Wert, der dem Absender bekannt ist. Der Absender gibt den Verschlüsselungsschlüssel zusammen mit dem Klartext in den Verschlüsselungsalgorithmus ein, um den Chiffretext zu berechnen.

  • Decryption Keyist ein Wert, der dem Empfänger bekannt ist. Der Entschlüsselungsschlüssel bezieht sich auf den Verschlüsselungsschlüssel, ist jedoch nicht immer mit diesem identisch. Der Empfänger gibt den Entschlüsselungsschlüssel zusammen mit dem Chiffretext in den Entschlüsselungsalgorithmus ein, um den Klartext zu berechnen.

Grundsätzlich gibt es zwei Arten von Schlüsseln / Kryptosystemen, die auf der Art der Verschlüsselungs- / Entschlüsselungsalgorithmen basieren.

Symmetrische Schlüsselverschlüsselung

Der Verschlüsselungsprozess wo same keys are used for encrypting and decrypting Die Informationen werden als symmetrische Schlüsselverschlüsselung bezeichnet.

Die Untersuchung symmetrischer Kryptosysteme wird als bezeichnet symmetric cryptography. Symmetrische Kryptosysteme werden manchmal auch als bezeichnetsecret key cryptosystems.

Im Folgenden finden Sie einige gängige Beispiele für die Verschlüsselung mit symmetrischen Schlüsseln:

  • Digital Encryption Standard (DES)
  • Triple-DES (3DES)
  • IDEA
  • BLOWFISH

Asymmetrische Schlüsselverschlüsselung

Der Verschlüsselungsprozess wo different keys are used for encrypting and decrypting the informationwird als asymmetrische Schlüsselverschlüsselung bezeichnet. Obwohl die Schlüssel unterschiedlich sind, sind sie mathematisch verwandt, und daher ist es möglich, den Klartext durch Entschlüsseln von Chiffretext abzurufen.

Die verwendeten / generierten Schlüssel und Zertifikate werden in einer Datenbank gespeichert, die als Keystore bezeichnet wird. Standardmäßig wird diese Datenbank in einer Datei mit dem Namen gespeichert.keystore.

Sie können mit dem auf den Inhalt dieser Datenbank zugreifen KeyStore Klasse der java.securityPaket. Dies verwaltet drei verschiedene Einträge, nämlich PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Speichern eines Schlüssels im Keystore

In diesem Abschnitt erfahren Sie, wie Sie einen Schlüssel in einem Schlüsselspeicher speichern. Führen Sie die folgenden Schritte aus, um einen Schlüssel im Schlüsselspeicher zu speichern.

Schritt 1: Erstellen Sie ein KeyStore-Objekt

Das getInstance() Methode der KeyStore Klasse der java.security Das Paket akzeptiert einen Zeichenfolgenwert, der den Typ des Schlüsselspeichers darstellt, und gibt ein KeyStore-Objekt zurück.

Erstellen Sie ein Objekt der KeyStore-Klasse mit getInstance() Methode wie unten gezeigt.

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

Schritt 2: Laden Sie das KeyStore-Objekt

Das load() Die Methode der KeyStore-Klasse akzeptiert ein FileInputStream-Objekt, das die Keystore-Datei darstellt, und einen String-Parameter, der das Kennwort des KeyStore angibt.

Im Allgemeinen wird der KeyStore in der genannten Datei gespeichert cacerts, in der Lage C:/Program Files/Java/jre1.8.0_101/lib/security/ und sein Standardkennwort ist changeit, laden Sie es mit dem load() Methode wie unten gezeigt.

//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);

Schritt 3: Erstellen Sie das KeyStore.ProtectionParameter-Objekt

Instanziieren Sie den KeyStore.ProtectionParameter wie unten gezeigt.

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

Schritt 4: Erstellen Sie ein SecretKey-Objekt

Erstellen Sie die SecretKey (Schnittstellen-) Objekt durch Instanziieren seiner Unterklasse SecretKeySpec. Während der Instanziierung müssen Sie Kennwort und Algorithmus als Parameter an den Konstruktor übergeben, wie unten gezeigt.

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

Schritt 5: Erstellen Sie ein SecretKeyEntry-Objekt

Erstellen Sie ein Objekt der SecretKeyEntry Klasse durch das Bestehen der SecretKey Objekt, das im obigen Schritt wie unten gezeigt erstellt wurde.

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

Schritt 6: Legen Sie einen Eintrag für den KeyStore fest

Das setEntry() Methode der KeyStore Klasse akzeptiert einen String-Parameter, der den Keystore-Eintragsalias darstellt, a SecretKeyEntry object, ein ProtectionParameter-Objekt und, speichert den Eintrag unter dem angegebenen Alias.

Stellen Sie den Eintrag in den Keystore mit dem ein setEntry() Methode wie unten gezeigt.

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

Example

Im folgenden Beispiel werden Schlüssel in dem Schlüsselspeicher gespeichert, der in der Datei "cacerts" (Windows 10-Betriebssystem) vorhanden ist.

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

Das obige Programm erzeugt die folgende Ausgabe -

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

In diesem Kapitel erfahren Sie, wie Sie mithilfe von Java Cryptography einen Schlüssel aus dem Keystore abrufen.

Führen Sie die folgenden Schritte aus, um einen Schlüssel aus dem Schlüsselspeicher abzurufen.

Schritt 1: Erstellen Sie ein KeyStore-Objekt

Das getInstance() Methode der KeyStore Klasse der java.security Das Paket akzeptiert einen Zeichenfolgenwert, der den Typ des Schlüsselspeichers darstellt, und gibt ein KeyStore-Objekt zurück.

Erstellen Sie mit dieser Methode ein Objekt der KeyStore-Klasse, wie unten gezeigt.

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

Schritt 2: Laden Sie das KeyStore-Objekt

Das load() Methode der KeyStore-Klasse akzeptiert a FileInputStream Objekt, das die Keystore-Datei darstellt, und ein String-Parameter, der das Kennwort des KeyStore angibt.

Im Allgemeinen wird der KeyStore in der genannten Datei gespeichert cacerts, in der Lage C:/Program Files/Java/jre1.8.0_101/lib/security/ und sein Standardkennwort ist changeit, laden Sie es mit dem load() Methode wie unten gezeigt.

//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);

Schritt 3: Erstellen Sie das KeyStore.ProtectionParameter-Objekt

Instanziieren Sie den KeyStore.ProtectionParameter wie unten gezeigt.

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

Schritt 4: Erstellen Sie ein SecretKey-Objekt

Erstellen Sie die SecretKey (Schnittstellen-) Objekt durch Instanziieren seiner Unterklasse SecretKeySpec. Während der Instanziierung müssen Sie Kennwort und Algorithmus als Parameter an den Konstruktor übergeben, wie unten gezeigt.

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

Schritt 5: Erstellen Sie ein SecretKeyEntry-Objekt

Erstellen Sie ein Objekt der SecretKeyEntry Klasse durch das Bestehen der SecretKey Objekt, das im obigen Schritt wie unten gezeigt erstellt wurde.

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

Schritt 6: Legen Sie einen Eintrag für den KeyStore fest

Das setEntry() Methode der KeyStore Klasse akzeptiert einen String-Parameter, der den Keystore-Eintragsalias darstellt, a SecretKeyEntry object, ein ProtectionParameter-Objekt und, speichert den Eintrag unter dem angegebenen Alias.

Stellen Sie den Eintrag in den Keystore mit dem ein setEntry() Methode wie unten gezeigt.

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

Schritt 7: Erstellen Sie das KeyStore.SecretKeyEntry-Objekt

Das getEntry() Die Methode der KeyStore-Klasse akzeptiert einen Alias ​​(String-Parameter) und ein Objekt der ProtectionParameter-Klasse als Parameter und gibt a zurück KeyStoreEntry Objekt dann können Sie dieses es in werfen KeyStore.SecretKeyEntry Objekt.

Erstellen Sie ein Objekt der KeyStore.SecretKeyEntry-Klasse, indem Sie den Alias ​​für den erforderlichen Schlüssel und das in den vorherigen Schritten erstellte Schutzparameterobjekt an das übergeben getEntry() Methode wie unten gezeigt.

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

Schritt 8: Erstellen Sie das Schlüsselobjekt des abgerufenen Eintrags

Das getSecretKey() Methode der SecretKeyEntryKlasse gibt ein SecretKey-Objekt zurück. Erstellen Sie mit dieser Methode ein SecretKey-Objekt wie unten gezeigt.

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

Beispiel

Das folgende Beispiel zeigt, wie Schlüssel aus einem Schlüsselspeicher abgerufen werden. Hier speichern wir einen Schlüssel in einem Schlüsselspeicher, der sich in der Datei "cacerts" (Windows 10-Betriebssystem) befindet, rufen ihn ab und zeigen einige seiner Eigenschaften an, z. B. den zum Generieren des Schlüssels verwendeten Algorithmus und das Format von der abgerufene Schlüssel.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

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

Java bietet KeyGenerator Klasse Diese Klasse wird verwendet, um geheime Schlüssel zu generieren, und Objekte dieser Klasse können wiederverwendet werden.

Führen Sie die folgenden Schritte aus, um Schlüssel mit der KeyGenerator-Klasse zu generieren.

Schritt 1: Erstellen Sie ein KeyGenerator-Objekt

Das KeyGenerator Klasse bietet getInstance() Methode, die eine String-Variable akzeptiert, die den erforderlichen Algorithmus zur Schlüsselgenerierung darstellt, und ein KeyGenerator-Objekt zurückgibt, das geheime Schlüssel generiert.

Erstellen KeyGenerator Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Erstellen Sie ein SecureRandom-Objekt

Das SecureRandom Klasse der java.SecurityDas Paket bietet einen starken Zufallszahlengenerator, mit dem Zufallszahlen in Java generiert werden. Instanziieren Sie diese Klasse wie unten gezeigt.

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

Schritt 3: Initialisieren Sie den KeyGenerator

Das KeyGenerator Klasse stellt eine Methode mit dem Namen bereit init() Diese Methode akzeptiert das SecureRandom-Objekt und initialisiert den aktuellen KeyGenerator.

Initialisieren Sie das im vorherigen Schritt erstellte KeyGenerator-Objekt mit dem init() Methode.

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

Beispiel

Das folgende Beispiel zeigt die Schlüsselgenerierung des geheimen Schlüssels mithilfe der KeyGenerator-Klasse des javax.crypto Paket.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

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

Java bietet die KeyPairGeneratorKlasse. Diese Klasse wird verwendet, um Paare von öffentlichen und privaten Schlüsseln zu generieren. So generieren Sie Schlüssel mit demKeyPairGenerator Klasse, befolgen Sie die unten angegebenen Schritte.

Schritt 1: Erstellen Sie ein KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse bietet getInstance() Methode, die eine String-Variable akzeptiert, die den erforderlichen Algorithmus zur Schlüsselgenerierung darstellt, und ein KeyPairGenerator-Objekt zurückgibt, das Schlüssel generiert.

Erstellen KeyPairGenerator Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Initialisieren Sie das KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse stellt eine Methode mit dem Namen bereit initialize()Diese Methode wird verwendet, um den Schlüsselpaargenerator zu initialisieren. Diese Methode akzeptiert einen ganzzahligen Wert, der die Schlüsselgröße darstellt.

Initialisieren Sie das im vorherigen Schritt erstellte KeyPairGenerator-Objekt mit dieser Methode (siehe unten).

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

Schritt 3: Generieren Sie den KeyPairGenerator

Sie können die generieren KeyPair Verwendung der generateKeyPair() Methode der KeyPairGeneratorKlasse. Generieren Sie das Schlüsselpaar mit dieser Methode wie unten gezeigt.

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

Schritt 4: Holen Sie sich den privaten Schlüssel / öffentlichen Schlüssel

Sie können den privaten Schlüssel aus dem generierten KeyPair-Objekt mit dem abrufen getPrivate() Methode wie unten gezeigt.

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

Sie können den öffentlichen Schlüssel aus dem generierten KeyPair-Objekt mit dem abrufen getPublic() Methode wie unten gezeigt.

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

Beispiel

Das folgende Beispiel zeigt die Schlüsselgenerierung des geheimen Schlüssels mithilfe der KeyPairGenerator-Klasse des javax.crypto Paket.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

Keys generated

Mit digitalen Signaturen können wir den Autor, das Datum und die Uhrzeit der Signaturen überprüfen und den Inhalt der Nachricht authentifizieren. Es enthält auch eine Authentifizierungsfunktion für zusätzliche Funktionen.

Vorteile der digitalen Signatur

In diesem Abschnitt lernen wir die verschiedenen Gründe kennen, die die Verwendung digitaler Signaturen erfordern. Es gibt mehrere Gründe, digitale Signaturen für die Kommunikation zu implementieren -

Authentifizierung

Digitale Signaturen helfen bei der Authentifizierung der Nachrichtenquellen. Wenn beispielsweise die Zweigstelle einer Bank eine Nachricht an die Zentrale sendet und eine Änderung des Kontostands anfordert. Wenn die Zentrale nicht authentifizieren konnte, dass diese Nachricht von einer autorisierten Quelle gesendet wurde, kann die Ausführung einer solchen Anfrage ein schwerwiegender Fehler sein.

Integrität

Sobald die Nachricht signiert ist, würde jede Änderung in der Nachricht die Signatur ungültig machen.

Nicht-Zurückweisung

Durch diese Eigenschaft kann eine Entität, die einige Informationen signiert hat, zu einem späteren Zeitpunkt nicht leugnen, dass sie signiert wurden.

Erstellen der digitalen Signatur

Lassen Sie uns nun lernen, wie Sie eine digitale Signatur erstellen. Sie können mit Java eine digitale Signatur erstellen, indem Sie die folgenden Schritte ausführen.

Schritt 1: Erstellen Sie ein KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse bietet getInstance() Methode, die eine String-Variable akzeptiert, die den erforderlichen Algorithmus zur Schlüsselgenerierung darstellt, und ein KeyPairGenerator-Objekt zurückgibt, das Schlüssel generiert.

Erstellen KeyPairGenerator Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Initialisieren Sie das KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse stellt eine Methode mit dem Namen bereit initialize()Diese Methode wird verwendet, um den Schlüsselpaargenerator zu initialisieren. Diese Methode akzeptiert einen ganzzahligen Wert, der die Schlüsselgröße darstellt.

Initialisieren Sie das im vorherigen Schritt erstellte KeyPairGenerator-Objekt mit dem initialize() Methode wie unten gezeigt.

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

Schritt 3: Generieren Sie den KeyPairGenerator

Sie können die generieren KeyPair Verwendung der generateKeyPair()Methode. Generieren Sie das Schlüsselpaar mit demgenerateKeyPair() Methode wie unten gezeigt.

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

Schritt 4: Holen Sie sich den privaten Schlüssel vom Paar

Sie können den privaten Schlüssel aus dem generierten KeyPair-Objekt mit dem abrufen getPrivate() Methode.

Holen Sie sich den privaten Schlüssel mit dem getPrivate() Methode wie unten gezeigt.

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

Schritt 5: Erstellen Sie ein Signaturobjekt

Das getInstance() Methode der Signature Die Klasse akzeptiert einen Zeichenfolgenparameter, der den erforderlichen Signaturalgorithmus darstellt, und gibt das entsprechende Signaturobjekt zurück.

Erstellen Sie ein Objekt der Signaturklasse mit der getInstance() Methode.

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

Schritt 6: Initialisieren Sie das Signaturobjekt

Das initSign() Methode der Signaturklasse akzeptiert a PrivateKey Objekt und initialisiert das aktuelle Signaturobjekt.

Initialisieren Sie das im vorherigen Schritt erstellte Signaturobjekt mit initSign() Methode wie unten gezeigt.

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

Schritt 7: Fügen Sie dem Signaturobjekt Daten hinzu

Das update() Die Methode der Signaturklasse akzeptiert ein Byte-Array, das die zu signierenden oder zu überprüfenden Daten darstellt, und aktualisiert das aktuelle Objekt mit den angegebenen Daten.

Aktualisieren Sie das initialisierte Signaturobjekt, indem Sie die zu signierenden Daten an das übergeben update() Methode in Form eines Byte-Arrays wie unten gezeigt.

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

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

Schritt 8: Berechnen Sie die Signatur

Das sign() Methode der Signature Klasse gibt die Signaturbytes der aktualisierten Daten zurück.

Berechnen Sie die Signatur mit dem sign() Methode wie unten gezeigt.

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

Example

Das folgende Java-Programm akzeptiert eine Nachricht vom Benutzer und generiert eine digitale Signatur für die angegebene Nachricht.

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

Das obige Programm erzeugt die folgende Ausgabe -

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

Sie können mit Java eine digitale Signatur erstellen und diese anhand der folgenden Schritte überprüfen.

Schritt 1: Erstellen Sie ein KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse bietet getInstance() Methode, die eine String-Variable akzeptiert, die den erforderlichen Algorithmus zur Schlüsselgenerierung darstellt, und ein KeyPairGenerator-Objekt zurückgibt, das Schlüssel generiert.

Erstellen KeyPairGenerator Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Initialisieren Sie das KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse stellt eine Methode mit dem Namen bereit initialize()Methode. Diese Methode wird verwendet, um den Schlüsselpaargenerator zu initialisieren. Diese Methode akzeptiert einen ganzzahligen Wert, der die Schlüsselgröße darstellt.

Initialisieren Sie das im vorherigen Schritt erstellte KeyPairGenerator-Objekt mit dem initialize() Methode wie unten gezeigt.

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

Schritt 3: Generieren Sie den KeyPairGenerator

Sie können die generieren KeyPair Verwendung der generateKeyPair()Methode. Generieren Sie das Schlüsselpaar mit dieser Methode wie unten gezeigt.

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

Schritt 4: Holen Sie sich den privaten Schlüssel vom Paar

Sie können den privaten Schlüssel aus dem generierten KeyPair-Objekt mit dem abrufen getPrivate() Methode.

Holen Sie sich den privaten Schlüssel mit dem getPrivate() Methode wie unten gezeigt.

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

Schritt 5: Erstellen Sie ein Signaturobjekt

Das getInstance() Methode der Signature Die Klasse akzeptiert einen Zeichenfolgenparameter, der den erforderlichen Signaturalgorithmus darstellt, und gibt das entsprechende Signaturobjekt zurück.

Erstellen Sie ein Objekt der Signaturklasse mit der getInstance() Methode.

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

Schritt 6: Initialisieren Sie das Signaturobjekt

Das initSign() Methode der Signaturklasse akzeptiert a PrivateKey Objekt und initialisiert das aktuelle Signaturobjekt.

Initialisieren Sie das im vorherigen Schritt erstellte Signaturobjekt mit initSign() Methode wie unten gezeigt.

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

Schritt 7: Fügen Sie dem Signaturobjekt Daten hinzu

Das update() Die Methode der Signaturklasse akzeptiert ein Byte-Array, das die zu signierenden oder zu überprüfenden Daten darstellt, und aktualisiert das aktuelle Objekt mit den angegebenen Daten.

Aktualisieren Sie das initialisierte Signaturobjekt, indem Sie die zu signierenden Daten an das übergeben update() Methode in Form eines Byte-Arrays wie unten gezeigt.

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

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

Schritt 8: Berechnen Sie die Signatur

Das sign() Methode der Signature Klasse gibt die Signaturbytes der aktualisierten Daten zurück.

Berechnen Sie die Signatur mit der sign () -Methode wie unten gezeigt.

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

Schritt 9: Initialisieren Sie das Signaturobjekt zur Überprüfung

Um ein Signaturobjekt zu überprüfen, müssen Sie es zuerst mit dem initialisieren initVerify() Methode it Methode akzeptiert a PublicKey Objekt.

Initialisieren Sie daher das Signaturobjekt zur Überprüfung mit initVerify() Methode wie unten gezeigt.

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

Schritt 10: Aktualisieren Sie die zu überprüfenden Daten

Aktualisieren Sie das initialisierte (zur Überprüfung) Objekt mit den Daten, die mit der unten gezeigten Aktualisierungsmethode überprüft werden sollen.

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

Schritt 11: Überprüfen Sie die Signatur

Das verify()Die Methode der Signaturklasse akzeptiert ein anderes Signaturobjekt und überprüft es mit dem aktuellen. Wenn eine Übereinstimmung auftritt, wird true zurückgegeben, andernfalls wird false zurückgegeben.

Überprüfen Sie die Signatur mit dieser Methode wie unten gezeigt.

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

Beispiel

Das folgende Java-Programm akzeptiert eine Nachricht vom Benutzer, generiert eine digitale Signatur für die angegebene Nachricht und überprüft sie.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

Signature verified

Sie können bestimmte Daten mit der Cipher-Klasse der verschlüsseln javax.cryptoPaket. Führen Sie die folgenden Schritte aus, um bestimmte Daten mit Java zu verschlüsseln.

Schritt 1: Erstellen Sie ein KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse bietet getInstance() Methode, die eine String-Variable akzeptiert, die den erforderlichen Algorithmus zur Schlüsselgenerierung darstellt, und ein KeyPairGenerator-Objekt zurückgibt, das Schlüssel generiert.

Erstellen KeyPairGenerator Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Initialisieren Sie das KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse stellt eine Methode mit dem Namen bereit initialize()Diese Methode wird verwendet, um den Schlüsselpaargenerator zu initialisieren. Diese Methode akzeptiert einen ganzzahligen Wert, der die Schlüsselgröße darstellt.

Initialisieren Sie das im vorherigen Schritt erstellte KeyPairGenerator-Objekt mit dem initialize() Methode wie unten gezeigt.

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

Schritt 3: Generieren Sie den KeyPairGenerator

Sie können die generieren KeyPair Verwendung der generateKeyPair() Methode der KeyPairGeneratorKlasse. Generieren Sie das Schlüsselpaar mit dieser Methode wie unten gezeigt.

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

Schritt 4: Holen Sie sich den öffentlichen Schlüssel

Sie können den öffentlichen Schlüssel aus dem generierten erhalten KeyPair Objekt mit dem getPublic() Methode wie unten gezeigt.

Rufen Sie den öffentlichen Schlüssel mit dieser Methode ab, wie unten gezeigt.

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

Schritt 5: Erstellen Sie ein Cipher-Objekt

Das getInstance() Methode von Cipher Die Klasse akzeptiert eine String-Variable, die die erforderliche Transformation darstellt, und gibt ein Cipher-Objekt zurück, das die angegebene Transformation implementiert.

Erstellen Sie das Cipher-Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 6: Initialisieren Sie das Cipher-Objekt

Das init() Methode der Cipher Die Klasse akzeptiert zwei Parameter, einen ganzzahligen Parameter, der den Betriebsmodus darstellt (verschlüsseln / entschlüsseln), und ein Schlüsselobjekt, das den öffentlichen Schlüssel darstellt.

Initialisieren Sie das Cypher-Objekt mit init() Methode wie unten gezeigt.

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

Schritt 7: Fügen Sie dem Cipher-Objekt Daten hinzu

Das update() Die Methode der Cipher-Klasse akzeptiert ein Byte-Array, das die zu verschlüsselnden Daten darstellt, und aktualisiert das aktuelle Objekt mit den angegebenen Daten.

Aktualisieren Sie das initialisierte Cipher-Objekt, indem Sie die Daten an das übergeben update() Methode in Form eines Byte-Arrays wie unten gezeigt.

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

Schritt 8: Verschlüsseln Sie die Daten

Das doFinal()Die Methode der Cipher-Klasse schließt den Verschlüsselungsvorgang ab. Beenden Sie daher die Verschlüsselung mit dieser Methode wie unten gezeigt.

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

Beispiel

Das folgende Java-Programm akzeptiert Text vom Benutzer, verschlüsselt ihn mit dem RSA-Algorithmus und druckt das verschlüsselte Format des angegebenen Textes.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

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

Sie können die verschlüsselten Daten mit der Cipher-Klasse von entschlüsseln javax.cryptoPaket. Führen Sie die folgenden Schritte aus, um bestimmte Daten mit Java zu entschlüsseln.

Schritt 1: Erstellen Sie ein KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse bietet getInstance() Methode, die eine String-Variable akzeptiert, die den erforderlichen Algorithmus zur Schlüsselgenerierung darstellt, und ein KeyPairGenerator-Objekt zurückgibt, das Schlüssel generiert.

Erstellen KeyPairGenerator Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 2: Initialisieren Sie das KeyPairGenerator-Objekt

Das KeyPairGenerator Klasse stellt eine Methode mit dem Namen bereit initialize()Diese Methode wird verwendet, um den Schlüsselpaargenerator zu initialisieren. Diese Methode akzeptiert einen ganzzahligen Wert, der die Schlüsselgröße darstellt.

Initialisieren Sie das im vorherigen Schritt erstellte KeyPairGenerator-Objekt mit dem initialize() Methode wie unten gezeigt.

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

Schritt 3: Generieren Sie den KeyPairGenerator

Sie können die generieren KeyPair Verwendung der generateKeyPair() Methode der KeyPairGeneratorKlasse. Generieren Sie das Schlüsselpaar mit dieser Methode wie unten gezeigt.

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

Schritt 4: Holen Sie sich den öffentlichen Schlüssel

Sie können den öffentlichen Schlüssel aus dem generierten KeyPair-Objekt mit dem abrufen getPublic() Methode wie unten gezeigt.

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

Schritt 5: Erstellen Sie ein Cipher-Objekt

Das getInstance() Methode von Cipher Die Klasse akzeptiert eine String-Variable, die die erforderliche Transformation darstellt, und gibt ein Cipher-Objekt zurück, das die angegebene Transformation implementiert.

Erstellen Sie das Cipher-Objekt mit dem getInstance() Methode wie unten gezeigt.

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

Schritt 6: Initialisieren Sie das Cipher-Objekt

Das init() Die Methode der Cipher-Klasse akzeptiert zwei Parameter

  • Ein ganzzahliger Parameter, der den Betriebsmodus darstellt (verschlüsseln / entschlüsseln)
  • Schlüsselobjekt, das den öffentlichen Schlüssel darstellt

Initialisieren Sie das Cypher-Objekt mit init() Methode wie unten gezeigt.

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

Schritt 7: Fügen Sie dem Cipher-Objekt Daten hinzu

Das update() Die Methode der Cipher-Klasse akzeptiert ein Byte-Array, das die zu verschlüsselnden Daten darstellt, und aktualisiert das aktuelle Objekt mit den angegebenen Daten.

Aktualisieren Sie das initialisierte Cipher-Objekt, indem Sie die Daten an das übergeben update() Methode in Form eines Byte-Arrays wie unten gezeigt.

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

Schritt 8: Verschlüsseln Sie die Daten

Das doFinal()Die Methode der Cipher-Klasse schließt den Verschlüsselungsvorgang ab. Beenden Sie daher die Verschlüsselung mit dieser Methode wie unten gezeigt.

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

Schritt 9: Initialisieren Sie das Cipher-Objekt zur Entschlüsselung

Um den in den vorherigen Schritten verschlüsselten Chiffrier zu entschlüsseln, müssen Sie ihn für die Entschlüsselung initialisieren.

Initialisieren Sie daher das Verschlüsselungsobjekt, indem Sie die Parameter Cipher.DECRYPT_MODE und PrivateKey wie unten gezeigt übergeben.

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

Schritt 10: Entschlüsseln Sie die Daten

Zum Schluss entschlüsseln Sie den verschlüsselten Text mit dem doFinal() Methode wie unten gezeigt.

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

Beispiel

Das folgende Java-Programm akzeptiert Text vom Benutzer, verschlüsselt ihn mit dem RSA-Algorithmus und druckt die Verschlüsselung des angegebenen Textes, entschlüsselt die Verschlüsselung und druckt den entschlüsselten Text erneut.

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

Ausgabe

Das obige Programm erzeugt die folgende Ausgabe -

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