Учебники

Криптография 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 () . Сгенерируйте пару ключей, используя метод 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();

пример

Следующая 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 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"));
   }
}

Выход

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