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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

md.update(msg.getBytes());

Шаг 3. Создайте дайджест сообщения

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

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

byte[] digest = md.digest();

пример

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

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

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

По сути, 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 для этого сообщения.

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?

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

Различные компоненты базовой криптосистемы: Plaintext, Encryption Algorithm, Ciphertext, Decryption Algorithm, Ключ шифрования и ключ дешифрования.

Где,

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

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

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

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

Процесс шифрования, где same keys are used for encrypting and decrypting эта информация известна как шифрование с симметричным ключом.

Изучение симметричных криптосистем называется symmetric cryptography. Симметричные криптосистемы также иногда называютsecret key cryptosystems.

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

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

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

Процесс шифрования, где different keys are used for encrypting and decrypting the informationизвестно как шифрование с асимметричным ключом. Хотя ключи разные, они математически связаны, и, следовательно, получение открытого текста путем дешифрования зашифрованного текста возможно.

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

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

  • PrivateKeyEntry
  • SecretKeyEntry
  • TrustedCertificateEntry

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

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

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

В getInstance() метод KeyStore класс java.security package принимает строковое значение, представляющее тип хранилища ключей, и возвращает объект 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 (интерфейс) объект, создав его подкласс 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 object, объект ProtectionParameter и сохраняет запись под заданным псевдонимом.

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

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

Example

В следующем примере ключи хранятся в хранилище ключей, существующем в файле «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");
   }
}

Output

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

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

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

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

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

В getInstance() метод KeyStore класс java.security package принимает строковое значение, представляющее тип хранилища ключей, и возвращает объект 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 (интерфейс) объект, создав его подкласс 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: установите запись в KeyStore

В setEntry() метод KeyStore класс принимает параметр String, представляющий псевдоним записи хранилища ключей, SecretKeyEntry object, объект 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() метод SecretKeyEntryclass возвращает объект 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 class этот класс используется для генерации секретных ключей, и объекты этого класса могут использоваться повторно.

Чтобы сгенерировать ключи с помощью класса 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класс. Этот класс используется для генерации пар открытого и закрытого ключей. Для генерации ключей с помощью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 пакет.

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, выполнив шаги, указанные ниже.

Шаг 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!?

Вы можете создать цифровую подпись с помощью 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 с помощью 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();

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

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

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

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

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

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

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

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

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

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

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

пример

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

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

Вы можете зашифровать данные, используя класс 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 и печатает зашифрованный формат данного текста.

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_??_???

Вы можете расшифровать зашифрованные данные, используя класс 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 object, как показано ниже.

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

Вывод

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

Encrypted Text:
]/[?F3?D?p
v?w?!?H???^?A??????P?u??FA?
?
???_?? ???_jMH-??>??OP?'?j?_?n`
?_??'`????o??_GL??g???g_f?????f|???LT?|?Vz_TDu#??\?<b,,?$C2???Bq?#?lDB`??g,^??K?_?v???`}
?;LX?a?_5e???#???_?6?/B&B_???^?__Ap^#_?q?IEh????_?,??*??]~_?_?D?
_y???lp??a?P_U{

Decrypted Text:
Welcome to Tutorialspoint