Учебники

Криптография Java — проверка подписи

Вы можете создать цифровую подпись с помощью Java и проверить ее, следуя инструкциям ниже.

Шаг 1. Создайте объект KeyPairGenerator.

Класс KeyPairGenerator предоставляет метод getInstance (), который принимает переменную String, представляющую требуемый алгоритм генерации ключей, и возвращает объект KeyPairGenerator, который генерирует ключи.

Создайте объект KeyPairGenerator, используя метод getInstance (), как показано ниже.

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

Шаг 2. Инициализация объекта KeyPairGenerator.

Класс KeyPairGenerator предоставляет метод с именем initialize () . Этот метод используется для инициализации генератора пары ключей. Этот метод принимает целочисленное значение, представляющее размер ключа.

Инициализируйте объект KeyPairGenerator, созданный на предыдущем шаге, используя метод initialize (), как показано ниже.

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

Шаг 3: Сгенерируйте KeyPairGenerator

Вы можете сгенерировать KeyPair, используя метод generateKeyPair () . Сгенерируйте пару ключей, используя этот метод, как показано ниже.

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

Шаг 4: Получить закрытый ключ от пары

Вы можете получить закрытый ключ от сгенерированного объекта KeyPair, используя метод getPrivate () .

Получите закрытый ключ, используя метод getPrivate (), как показано ниже.

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

Шаг 5: Создайте объект подписи

Метод getInstance () класса Signature принимает строковый параметр, представляющий требуемый алгоритм подписи, и возвращает соответствующий объект Signature.

Создайте объект класса Signature с помощью метода getInstance () .

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

Шаг 6: Инициализируйте объект Signature

Метод initSign () класса Signature принимает объект PrivateKey и инициализирует текущий объект Signature.

Инициализируйте объект Signature, созданный на предыдущем шаге, используя метод initSign (), как показано ниже.

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

Шаг 7: Добавить данные в объект Signature

Метод update () класса Signature принимает байтовый массив, представляющий данные, которые должны быть подписаны или проверены, и обновляет текущий объект указанными данными.

Обновите инициализированный объект Signature, передав данные для подписи методу update () в виде байтового массива, как показано ниже.

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

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

Шаг 8: Рассчитайте подпись

Метод sign () класса Signature возвращает байты подписи обновленных данных.

Рассчитайте Signature, используя метод sign (), как показано ниже.

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

Шаг 9: Инициализируйте объект подписи для проверки

Чтобы проверить объект Signature, вы должны сначала инициализировать его, используя метод initVerify (), метод которого принимает объект PublicKey .

Поэтому инициализируйте объект Signature для проверки с помощью метода initVerify (), как показано ниже.

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

Шаг 10: Обновите данные для проверки

Обновите инициализированный (для проверки) объект данными, которые должны быть проверены с использованием метода обновления, как показано ниже.

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

Шаг 11: Проверьте подпись

Метод verify () класса Signature принимает другой объект подписи и сверяет его с текущим. Если совпадение происходит, оно возвращает true, иначе возвращает false.

Проверьте подпись, используя этот метод, как показано ниже.

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

пример

Следующая Java-программа принимает сообщение от пользователя, генерирует цифровую подпись для данного сообщения и проверяет его.

Live Demo

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

Выход

Вышеуказанная программа генерирует следующий вывод —