Учебники

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

Криптография Java — Введение

Криптография — это искусство и наука создания криптосистемы, способной обеспечить информационную безопасность.

Криптография имеет дело с фактической защитой цифровых данных. Это относится к разработке механизмов, основанных на математических алгоритмах, которые предоставляют фундаментальные услуги информационной безопасности. Вы можете думать о криптографии как о создании большого инструментария, содержащего различные методы в приложениях безопасности.

Что такое криптоанализ?

Искусство и наука взлома зашифрованного текста называется криптоанализом.

Криптоанализ является родственным разделом криптографии, и они оба сосуществуют. Криптографический процесс приводит к зашифрованному тексту для передачи или хранения. Он предполагает изучение криптографического механизма с намерением их взломать. Криптоанализ также используется при разработке новых криптографических методов для проверки их надежности.

Примитивы криптографии

Примитивы криптографии — это не что иное, как инструменты и методы криптографии, которые можно выборочно использовать для предоставления набора требуемых служб безопасности —

  • шифрование
  • Хэш-функции
  • Коды аутентификации сообщений (MAC)
  • Цифровые подписи

Криптография на Java

Архитектура криптографии Java (JCA) — это набор API для реализации концепций современной криптографии, таких как цифровые подписи, дайджесты сообщений, сертификаты, шифрование, генерация и управление ключами, а также безопасная генерация случайных чисел и т. Д.

Используя JCA, разработчики могут создавать свои приложения, интегрируя в них безопасность.

Чтобы интегрировать безопасность в свои приложения, а не в зависимости от сложных алгоритмов безопасности, вы можете легко вызывать соответствующие API, предоставляемые в JCA для требуемых услуг.

Криптография Java — Дайджест сообщений

Хеш-функции чрезвычайно полезны и появляются практически во всех приложениях информационной безопасности.

Хеш-функция — это математическая функция, которая преобразует числовое входное значение в другое сжатое числовое значение. Входные данные для хеш-функции имеют произвольную длину, но выходные данные всегда имеют фиксированную длину.

Значения, возвращаемые хэш-функцией, называются дайджестом сообщения или просто хэш-значениями . На следующем рисунке показана хэш-функция.

Дайджест сообщения

Java предоставляет класс с именем MessageDigest, который принадлежит пакету java.security. Этот класс поддерживает алгоритмы, такие как SHA-1, SHA 256, алгоритмы MD5 для преобразования сообщения произвольной длины в дайджест сообщения.

Чтобы преобразовать данное сообщение в дайджест сообщения, выполните следующие действия:

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

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

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

MessageDigest md = MessageDigest.getInstance("SHA-256");

Шаг 2: Передайте данные в созданный объект MessageDigest

После создания объекта дайджеста сообщения вам необходимо передать ему сообщение / данные. Это можно сделать с помощью метода update () класса MessageDigest. Этот метод принимает массив байтов, представляющий сообщение, и добавляет / передает его в созданный выше объект MessageDigest.

md.update(msg.getBytes());

Шаг 3: Генерация дайджеста сообщения

Вы можете сгенерировать дайджест сообщения, используя метод digest () класса MessageDigest. Этот метод вычисляет хеш-функцию для текущего объекта и возвращает дайджест сообщения в виде байтового массива.

Создайте дайджест сообщения, используя метод дайджеста.

byte[] digest = md.digest();

пример

Ниже приведен пример, который считывает данные из файла, генерирует дайджест сообщения и печатает его.

Live Demo

import java.security.MessageDigest;
import java.util.Scanner;

public class MessageDigestExample {
   public static void main(String args[]) throws Exception{
      //Reading data from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter the message");
      String message = sc.nextLine();
	  
      //Creating the MessageDigest object  
      MessageDigest md = MessageDigest.getInstance("SHA-256");

      //Passing data to the created MessageDigest Object
      md.update(message.getBytes());
      
      //Compute the message digest
      byte[] digest = md.digest();      
      System.out.println(digest);  
     
      //Converting the byte array in to HexString format
      StringBuffer hexString = new StringBuffer();
      
      for (int i = 0;i<digest.length;i++) {
         hexString.append(Integer.toHexString(0xFF & digest[i]));
      }
      System.out.println("Hex format : " + hexString.toString());     
   }
}

Выход

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

Enter the message
Hello how are you
[B@55f96302
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3

Криптография Java — Создание MAC

Алгоритм MAC (Message A uthentication Code) — это криптографический метод с симметричным ключом, обеспечивающий аутентификацию сообщения. Для установления процесса MAC отправитель и получатель совместно используют симметричный ключ K.

По сути, MAC — это зашифрованная контрольная сумма, сгенерированная для базового сообщения, которое отправляется вместе с сообщением для обеспечения аутентификации сообщения.

Процесс использования MAC для аутентификации изображен на следующей иллюстрации —

Создание MAC

В Java класс Mac пакета javax.crypto обеспечивает функциональность кода аутентификации сообщений. Следуйте приведенным ниже инструкциям, чтобы создать код аутентификации сообщения с использованием этого класса.

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

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

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

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

Шаг 2: Создайте объект SecureRandom

Класс SecureRandom пакета java.Security предоставляет мощный генератор случайных чисел, который используется для генерации случайных чисел в Java. Создайте этот класс, как показано ниже.

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

Шаг 3: Инициализируйте KeyGenerator

Класс KeyGenerator предоставляет метод с именем init (), этот метод принимает объект SecureRandom и инициализирует текущий KeyGenerator .

С помощью этого метода инициализируйте объект KeyGenerator, созданный на предыдущем шаге.

//Initializing the KeyGenerator
keyGen.init(secRandom);

Шаг 4: Генерация ключа

Сгенерируйте ключ с помощью метода generateKey () класса KeyGenerator, как показано ниже.

//Creating/Generating a key
Key key = keyGen.generateKey();

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

Метод init () класса Mac принимает объект Key и инициализирует текущий объект Mac, используя заданный ключ.

//Initializing the Mac object
mac.init(key);

Шаг 6: Завершите операцию Mac

Метод doFinal () класса Mac используется для завершения операции Mac. Передайте в этот метод необходимые данные в виде байтового массива и завершите операцию, как показано ниже.

//Computing the Mac
String msg = new String("Hi how are you");
byte[] bytes = msg.getBytes();
byte[] macResult = mac.doFinal(bytes);

пример

В следующем примере демонстрируется генерация кода аутентификации сообщений (MAC) с использованием JCA. Здесь мы берем простое сообщение «Привет, как дела» и генерируем Mac для этого сообщения.

Live Demo

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;

public class MacSample {
   public static void main(String args[]) throws Exception{
      //Creating a KeyGenerator object
      KeyGenerator keyGen = KeyGenerator.getInstance("DES");

      //Creating a SecureRandom object
      SecureRandom secRandom = new SecureRandom();

      //Initializing the KeyGenerator
      keyGen.init(secRandom);

      //Creating/Generating a key
      Key key = keyGen.generateKey();	 

      //Creating a Mac object
      Mac mac = Mac.getInstance("HmacSHA256");

      //Initializing the Mac object
      mac.init(key);

      //Computing the Mac
      String msg = new String("Hi how are you");
      byte[] bytes = msg.getBytes();      
      byte[] macResult = mac.doFinal(bytes);

      System.out.println("Mac result:");
      System.out.println(new String(macResult));     
   }
}

Выход

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

Mac result:
HÖ„^ǃÎ_Utbh…?š_üzØSSÜh_ž_œa0ŽV?

Криптография Java — Ключи

Криптосистема — это реализация криптографических методов и сопутствующей им инфраструктуры для предоставления услуг информационной безопасности. Криптосистема также называется системой шифрования .

Различные компоненты базовой криптосистемы — это открытый текст, алгоритм шифрования, шифротекст, алгоритм дешифрования, ключ шифрования и ключ дешифрования.

Куда,

  • Ключ шифрования — это значение, известное отправителю. Отправитель вводит ключ шифрования в алгоритм шифрования вместе с открытым текстом, чтобы вычислить зашифрованный текст.

  • Ключ расшифровки — это значение, известное получателю. Ключ дешифрования связан с ключом шифрования, но не всегда идентичен ему. Получатель вводит ключ дешифрования в алгоритм дешифрования вместе с зашифрованным текстом для вычисления открытого текста.

Ключ шифрования — это значение, известное отправителю. Отправитель вводит ключ шифрования в алгоритм шифрования вместе с открытым текстом, чтобы вычислить зашифрованный текст.

Ключ расшифровки — это значение, известное получателю. Ключ дешифрования связан с ключом шифрования, но не всегда идентичен ему. Получатель вводит ключ дешифрования в алгоритм дешифрования вместе с зашифрованным текстом для вычисления открытого текста.

Принципиально существует два типа ключей / криптосистем, основанных на типе алгоритмов шифрования-дешифрования.

Шифрование симметричного ключа

Процесс шифрования, в котором для шифрования и дешифрования информации используются одни и те же ключи, называется Symmetric Key Encryption.

Исследование симметричных криптосистем называется симметричной криптографией . Симметричные криптосистемы также иногда называют криптосистемами с секретным ключом .

Ниже приведены несколько распространенных примеров шифрования с симметричным ключом:

  • Стандарт цифрового шифрования (DES)
  • Triple-DES (3DES)
  • IDEA
  • BLOWFISH

Асимметричное шифрование ключа

Процесс шифрования, в котором для шифрования и дешифрования информации используются разные ключи, называется асимметричным шифрованием ключей. Хотя ключи разные, они математически связаны и, следовательно, возможно получение открытого текста путем расшифровки зашифрованного текста.

Криптография Java — Хранение ключей

Используемые / генерируемые ключи и сертификаты хранятся в базе данных, называемой хранилищем ключей. По умолчанию эта база данных хранится в файле с именем .keystore .

Вы можете получить доступ к содержимому этой базы данных, используя класс KeyStore пакета java.security . Это управляет тремя различными записями, а именно: PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry.

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

Хранение ключа в хранилище ключей

В этом разделе мы узнаем, как хранить ключ в хранилище ключей. Чтобы сохранить ключ в хранилище ключей, выполните следующие действия.

Шаг 1: Создать объект KeyStore

Метод getInstance () класса KeyStore пакета java.security принимает строковое значение, представляющее тип хранилища ключей, и возвращает объект KeyStore.

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

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

Шаг 2: Загрузите объект KeyStore

Метод load () класса KeyStore принимает объект FileInputStream, представляющий файл хранилища ключей, и параметр String, указывающий пароль хранилища ключей.

Как правило, хранилище ключей хранится в файле cacerts в каталоге C: / Program Files / Java / jre1.8.0_101 / lib / security /, а его пароль по умолчанию — changeit , загрузите его с помощью метода load (), как показано ниже.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

Шаг 3. Создайте объект KeyStore.ProtectionParameter.

Создайте параметр KeyStore.ProtectionParameter, как показано ниже.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Шаг 4: Создайте объект SecretKey

Создайте объект SecretKey (interface) путем создания экземпляра его подкласса SecretKeySpec . При создании экземпляра вам необходимо передать пароль и алгоритм в качестве параметров его конструктору, как показано ниже.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Шаг 5: Создайте объект SecretKeyEntry

Создайте объект класса SecretKeyEntry , передав объект SecretKey, созданный на предыдущем шаге, как показано ниже.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

Шаг 6: Установите запись в хранилище ключей

Метод setEntry () класса KeyStore принимает параметр String, представляющий псевдоним записи хранилища ключей, объект SecretKeyEntry, объект ProtectionParameter и сохраняет запись под указанным псевдонимом.

Установите запись в хранилище ключей, используя метод setEntry (), как показано ниже.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

пример

В следующем примере ключи хранятся в хранилище ключей, существующем в файле «cacerts» (операционная система Windows 10).

import java.io.FileInputStream;
import java.security.KeyStore;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class StoringIntoKeyStore{
   public static void main(String args[]) throws Exception {
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the KeyStore object
      char[] password = "changeit".toCharArray();
      String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
      java.io.FileInputStream fis = new FileInputStream(path);
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      System.out.println("data stored");
   }
}

Выход

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

System.out.println("data stored");

Криптография Java — Получение ключей

В этой главе мы узнаем, как извлечь ключ из хранилища ключей с помощью Java Cryptography.

Чтобы получить ключ из хранилища ключей, выполните действия, указанные ниже.

Шаг 1: Создать объект KeyStore

Метод getInstance () класса KeyStore пакета java.security принимает строковое значение, представляющее тип хранилища ключей, и возвращает объект KeyStore.

Создайте объект класса KeyStore, используя этот метод, как показано ниже.

//Creating the KeyStore object
KeyStore keyStore = KeyStore.getInstance("JCEKS");

Шаг 2: Загрузите объект KeyStore

Метод load () класса KeyStore принимает объект FileInputStream, представляющий файл хранилища ключей, и параметр String, указывающий пароль хранилища ключей.

Как правило, хранилище ключей хранится в файле cacerts в каталоге C: / Program Files / Java / jre1.8.0_101 / lib / security /, а его пароль по умолчанию — changeit , загрузите его с помощью метода load (), как показано ниже.

//Loading the KeyStore object
char[] password = "changeit".toCharArray();
String path = "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts";
java.io.FileInputStream fis = new FileInputStream(path);
keyStore.load(fis, password);

Шаг 3. Создайте объект KeyStore.ProtectionParameter.

Создайте параметр KeyStore.ProtectionParameter, как показано ниже.

//Creating the KeyStore.ProtectionParameter object
KeyStore.ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

Шаг 4: Создайте объект SecretKey

Создайте объект SecretKey (interface) путем создания экземпляра его подкласса SecretKeySpec . При создании экземпляра вам необходимо передать пароль и алгоритм в качестве параметров его конструктору, как показано ниже.

//Creating SecretKey object
SecretKey mySecretKey = new SecretKeySpec(new String(keyPassword).getBytes(), "DSA");

Шаг 5: Создайте объект SecretKeyEntry

Создайте объект класса SecretKeyEntry , передав объект SecretKey, созданный на предыдущем шаге, как показано ниже.

//Creating SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(mySecretKey);

Шаг 6: установить запись в хранилище ключей

Метод setEntry () класса KeyStore принимает параметр String, представляющий псевдоним записи хранилища ключей, объект SecretKeyEntry, объект ProtectionParameter и сохраняет запись под указанным псевдонимом.

Установите запись в хранилище ключей, используя метод setEntry (), как показано ниже.

//Set the entry to the keystore
keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

Шаг 7: Создайте объект KeyStore.SecretKeyEntry

Метод getEntry () класса KeyStore принимает псевдоним (параметр String) и объект класса ProtectionParameter в качестве параметров и возвращает объект KeyStoreEntry, после чего его можно преобразовать в объект KeyStore.SecretKeyEntry .

Создайте объект класса KeyStore.SecretKeyEntry, передав псевдоним требуемого ключа и объект параметра защиты, созданный на предыдущих шагах, в метод getEntry (), как показано ниже.

//Creating the KeyStore.SecretKeyEntry object
KeyStore.SecretKeyEntry secretKeyEnt = (KeyStore.SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

Шаг 8: Создайте ключевой объект для извлеченной записи

Метод getSecretKey () класса SecretKeyEntry возвращает объект SecretKey. Используя этот метод, создайте объект SecretKey, как показано ниже.

//Creating SecretKey object
SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
System.out.println(mysecretKey);

пример

В следующем примере показано, как получить ключи из хранилища ключей. Здесь мы храним ключ в хранилище ключей, которое находится в файле «cacerts» (операционная система Windows 10), извлекаем его и отображаем некоторые его свойства, такие как алгоритм, использованный для генерации ключа, и формат полученный ключ.

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStore.ProtectionParameter;
import java.security.KeyStore.SecretKeyEntry;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class RetrievingFromKeyStore{
   public static void main(String args[]) throws Exception{
      //Creating the KeyStore object
      KeyStore keyStore = KeyStore.getInstance("JCEKS");

      //Loading the the KeyStore object
      char[] password = "changeit".toCharArray();
      java.io.FileInputStream fis = new FileInputStream(
         "C:/Program Files/Java/jre1.8.0_101/lib/security/cacerts");
      
      keyStore.load(fis, password);
      
      //Creating the KeyStore.ProtectionParameter object
      ProtectionParameter protectionParam = new KeyStore.PasswordProtection(password);

      //Creating SecretKey object
      SecretKey mySecretKey = new SecretKeySpec("myPassword".getBytes(), "DSA");
      
      //Creating SecretKeyEntry object
      SecretKeyEntry secretKeyEntry = new SecretKeyEntry(mySecretKey);
      keyStore.setEntry("secretKeyAlias", secretKeyEntry, protectionParam);

      //Storing the KeyStore object
      java.io.FileOutputStream fos = null;
      fos = new java.io.FileOutputStream("newKeyStoreName");
      keyStore.store(fos, password);
      
      //Creating the KeyStore.SecretKeyEntry object
      SecretKeyEntry secretKeyEnt = (SecretKeyEntry)keyStore.getEntry("secretKeyAlias", protectionParam);

      //Creating SecretKey object
      SecretKey mysecretKey = secretKeyEnt.getSecretKey();      
      System.out.println("Algorithm used to generate key : "+mysecretKey.getAlgorithm());   
      System.out.println("Format used for the key: "+mysecretKey.getFormat());
   }
}

Выход

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

Algorithm used to generate key: DSA
Format of the key: RAW

Криптография Java — KeyGenerator

Java предоставляет класс KeyGenerator, этот класс используется для генерации секретных ключей, а объекты этого класса можно использовать повторно.

Для генерации ключей с использованием класса KeyGenerator выполните следующие шаги.

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

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

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

//Creating a KeyGenerator object
KeyGenerator keyGen = KeyGenerator.getInstance("DES");

Шаг 2: Создайте объект SecureRandom

Класс SecureRandom пакета java.Security предоставляет мощный генератор случайных чисел, который используется для генерации случайных чисел в Java. Создайте этот класс, как показано ниже.

//Creating a SecureRandom object
SecureRandom secRandom = new SecureRandom();

Шаг 3: Инициализируйте KeyGenerator

Класс KeyGenerator предоставляет метод с именем init (), этот метод принимает объект SecureRandom и инициализирует текущий KeyGenerator .

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

//Initializing the KeyGenerator
keyGen.init(secRandom);

пример

В следующем примере демонстрируется генерация секретного ключа с использованием класса KeyGenerator пакета javax.crypto .

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import java.security.Key;
import java.security.SecureRandom;

public class KeyGeneratorExample {
   public static void main(String args[]) throws Exception{
      //Creating a KeyGenerator object
      KeyGenerator keyGen = KeyGenerator.getInstance("DES");
      
      //Creating a SecureRandom object
      SecureRandom secRandom = new SecureRandom();
      
      //Initializing the KeyGenerator
      keyGen.init(secRandom);
      
      //Creating/Generating a key
      Key key = keyGen.generateKey();
      
      System.out.println(key);      
      Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");      
      cipher.init(cipher.ENCRYPT_MODE, key);      

      String msg = new String("Hi how are you");
      byte[] bytes = cipher.doFinal(msg.getBytes());      
      System.out.println(bytes);      
   }
}

Выход

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

com.sun.crypto.provider.DESKey@18629
[B@2ac1fdc4

Криптография Java — KeyPairGenerator

Java предоставляет класс KeyPairGenerator . Этот класс используется для генерации пар открытых и закрытых ключей. Чтобы сгенерировать ключи с помощью класса KeyPairGenerator , выполните следующие действия.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

пример

В следующем примере демонстрируется генерация секретного ключа с использованием класса KeyPairGenerator пакета javax.crypto .

Live Demo

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

public class KeyPairGenertor {
   public static void main(String args[]) throws Exception{
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
      
      //Initializing the KeyPairGenerator
      keyPairGen.initialize(2048);
      
      //Generating the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();
      
      //Getting the private key from the key pair
      PrivateKey privKey = pair.getPrivate();   
      
      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic(); 
      System.out.println("Keys generated");
   }
}

Выход

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

Keys generated

Криптография 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"));
   }
}

Выход

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

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

Криптография 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");
      }
   }
}

Выход

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

Signature verified

Криптография Java — Шифрование данных

Вы можете зашифровать данные с помощью класса Cipher пакета javax.crypto . Следуйте приведенным ниже инструкциям, чтобы зашифровать данные с помощью 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 () класса KeyPairGenerator . Сгенерируйте пару ключей, используя этот метод, как показано ниже.

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

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

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

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

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

Шаг 5: Создайте объект Cipher

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

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

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Шаг 6: Инициализировать объект Cipher

Метод init () класса Cipher принимает два параметра: целочисленный параметр, представляющий режим работы (шифрование / дешифрование), и объект Key, представляющий открытый ключ.

Инициализируйте объект Cypher, используя метод init (), как показано ниже.

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

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

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

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

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

Шаг 8: Шифровать данные

Метод doFinal () класса Cipher завершает операцию шифрования. Поэтому завершите шифрование, используя этот метод, как показано ниже.

//Encrypting the data
byte[] cipherText = cipher.doFinal();

пример

Следующая Java-программа принимает текст от пользователя, шифрует его с помощью алгоритма RSA и печатает зашифрованный формат данного текста.

Live Demo

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;

public class CipherSample {
   public static void main(String args[]) throws Exception{
      //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withRSA");
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generating the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();      
	
      //Creating a Cipher object
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        
      //Initializing a Cipher object
      cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());
	  
      //Adding data to the cipher
      byte[] input = "Welcome to Tutorialspoint".getBytes();	  
      cipher.update(input);
	  
      //encrypting the data
      byte[] cipherText = cipher.doFinal();	 
      System.out.println(new String(cipherText, "UTF8"));
   }
}

Выход

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

Encrypted Text: 
 "???:]J_?]???;Xl??????*@??u???r??=T&???_?_??.??i?????(?$_f?zD??????ZGH??g???
g?E:_??bz^??f?~o???t?}??u=uzp\UI????Z??l[?G?3??Y?UAEfKT?f?O??N_?d__?????a_?15%?^?
'p?_?$,9"{??^??y??_?t???,?W?PCW??~??[?$??????e????f?Y-Zi__??_??w?_?&QT??`?`~?[?K_??_? ??

Криптография Java — Расшифровка данных

Вы можете расшифровать зашифрованные данные, используя класс Cipher пакета javax.crypto . Следуйте инструкциям ниже, чтобы расшифровать данные с помощью 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 () класса KeyPairGenerator . Сгенерируйте пару ключей, используя этот метод, как показано ниже.

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

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

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

//Getting the public key from the key pair
PublicKey publicKey = pair.getPublic();

Шаг 5: Создайте объект Cipher

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

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

//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

Шаг 6: Инициализировать объект Cipher

Метод init () класса Cipher принимает два параметра

  • Целочисленный параметр, представляющий режим работы (шифрование / дешифрование)
  • Ключевой объект, представляющий открытый ключ

Инициализируйте объект Cypher, используя метод init (), как показано ниже.

//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

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

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

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

//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();	  
cipher.update(input);

Шаг 8: Шифровать данные

Метод doFinal () класса Cipher завершает операцию шифрования. Поэтому завершите шифрование, используя этот метод, как показано ниже.

//Encrypting the data
byte[] cipherText = cipher.doFinal();

Шаг 9: Инициализировать объект Cipher для расшифровки

Чтобы расшифровать шифр, зашифрованный на предыдущих шагах, вам нужно инициализировать его для дешифрования.

Поэтому инициализируйте объект шифрования, передав параметры Cipher.DECRYPT_MODE и объект PrivateKey, как показано ниже.

//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());

Шаг 10: Расшифровать данные

Наконец, расшифруйте зашифрованный текст, используя метод doFinal (), как показано ниже.

//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);

пример

Следующая Java-программа принимает текст от пользователя, шифрует его с использованием алгоритма RSA и, печатает шифр данного текста, дешифрует шифр и снова печатает дешифрованный текст.

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Signature;

import javax.crypto.Cipher;

public class CipherDecrypt {
   public static void main(String args[]) throws Exception{
	   //Creating a Signature object
      Signature sign = Signature.getInstance("SHA256withRSA");
      
      //Creating KeyPair generator object
      KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
      
      //Initializing the key pair generator
      keyPairGen.initialize(2048);
      
      //Generate the pair of keys
      KeyPair pair = keyPairGen.generateKeyPair();   
      
      //Getting the public key from the key pair
      PublicKey publicKey = pair.getPublic();  

      //Creating a Cipher object
      Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

      //Initializing a Cipher object
      cipher.init(Cipher.ENCRYPT_MODE, publicKey);
	  
      //Add data to the cipher
      byte[] input = "Welcome to Tutorialspoint".getBytes();	  
      cipher.update(input);
	  
      //encrypting the data
      byte[] cipherText = cipher.doFinal();	 
      System.out.println( new String(cipherText, "UTF8"));

      //Initializing the same cipher for decryption
      cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
      
      //Decrypting the text
      byte[] decipheredText = cipher.doFinal(cipherText);
      System.out.println(new String(decipheredText));
   }
}

Выход

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