Java Cryptography - tworzenie podpisu

Podpisy cyfrowe pozwalają nam zweryfikować autora, datę i godzinę podpisów, uwierzytelnić treść wiadomości. Zawiera również funkcję uwierzytelniania dla dodatkowych możliwości.

Zalety podpisu cyfrowego

W tej sekcji poznamy różne powody, dla których warto używać podpisu cyfrowego. Istnieje kilka powodów, dla których warto wdrożyć podpisy cyfrowe w komunikacji -

Poświadczenie

Podpisy cyfrowe pomagają uwierzytelniać źródła wiadomości. Na przykład, jeśli oddział banku wysyła wiadomość do centrali z prośbą o zmianę salda na rachunku. Jeżeli centrala nie mogłaby uwierzytelnić, że wiadomość została wysłana z autoryzowanego źródła, wykonanie takiego wniosku mogłoby być poważnym błędem.

Integralność

Gdy wiadomość zostanie podpisana, każda zmiana w wiadomości spowoduje unieważnienie podpisu.

Niezaprzeczalność

Dzięki tej właściwości żaden podmiot, który podpisał pewne informacje, nie może później zaprzeczyć, że je podpisał.

Tworzenie podpisu cyfrowego

Nauczmy się teraz, jak utworzyć podpis cyfrowy. Możesz utworzyć podpis cyfrowy za pomocą Java, postępując zgodnie z instrukcjami podanymi poniżej.

Krok 1: Utwórz obiekt KeyPairGenerator

Plik KeyPairGenerator klasa zapewnia getInstance() , która akceptuje zmienną String reprezentującą wymagany algorytm generowania kluczy i zwraca obiekt KeyPairGenerator, który generuje klucze.

Stwórz KeyPairGenerator obiekt za pomocą getInstance() metoda, jak pokazano poniżej.

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

Krok 2: Zainicjuj obiekt KeyPairGenerator

Plik KeyPairGenerator class udostępnia metodę o nazwie initialize()ta metoda służy do inicjalizacji generatora par kluczy. Ta metoda akceptuje wartość całkowitą reprezentującą rozmiar klucza.

Zainicjuj obiekt KeyPairGenerator utworzony w poprzednim kroku przy użyciu initialize() metoda, jak pokazano poniżej.

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

Krok 3: Wygeneruj KeyPairGenerator

Możesz wygenerować plik KeyPair używając generateKeyPair()metoda. Wygeneruj parę kluczy przy użyciugenerateKeyPair() metoda, jak pokazano poniżej.

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

Krok 4: Uzyskaj klucz prywatny z pary

Możesz uzyskać klucz prywatny z wygenerowanego obiektu KeyPair przy użyciu getPrivate() metoda.

Uzyskaj klucz prywatny za pomocą getPrivate() metoda, jak pokazano poniżej.

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

Krok 5: Utwórz obiekt podpisu

Plik getInstance() metoda Signature class akceptuje parametr ciągu reprezentujący wymagany algorytm podpisu i zwraca odpowiedni obiekt Signature.

Utwórz obiekt klasy Signature przy użyciu rozszerzenia getInstance() metoda.

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

Krok 6: Zainicjuj obiekt Signature

Plik initSign() metoda klasy Signature akceptuje plik PrivateKey obiekt i inicjalizuje bieżący obiekt Signature.

Zainicjuj obiekt Signature utworzony w poprzednim kroku przy użyciu initSign() metoda, jak pokazano poniżej.

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

Krok 7: Dodaj dane do obiektu Signature

Plik update() metoda klasy Signature akceptuje tablicę bajtów reprezentującą dane do podpisania lub weryfikacji i aktualizuje bieżący obiekt podanymi danymi.

Zaktualizuj zainicjowany obiekt Signature, przekazując dane do podpisania do pliku update() metoda w postaci tablicy bajtów, jak pokazano poniżej.

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

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

Krok 8: Oblicz podpis

Plik sign() metoda Signature class zwraca bajty sygnatur zaktualizowanych danych.

Oblicz podpis za pomocą sign() metoda, jak pokazano poniżej.

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

Example

Poniższy program Java akceptuje wiadomość od użytkownika i generuje podpis cyfrowy dla tej wiadomości.

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

Powyższy program generuje następujące dane wyjściowe -

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