Криптография 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!?