Криптография 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 с помощью getInstance() метод.

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

Шаг 6. Инициализируйте объект подписи

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

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

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

Шаг 7. Добавьте данные в объект подписи

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

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

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

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

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

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

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

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

Example

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

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

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

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