Java-Kryptographie - Signatur erstellen

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