Гибридные Схемы Шифрования в Криптографии

LinuxBeginner
Практиковаться сейчас

Введение

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

Гибридное шифрование решает эту проблему, сочетая сильные стороны обоих методов. Оно использует подход "лучшее из обоих миров":

  1. Асимметричное шифрование используется для безопасного шифрования и передачи временного, одноразового симметричного ключа (часто называемого "сеансовым ключом").
  2. Симметричное шифрование затем используется с этим сеансовым ключом для быстрого и эффективного шифрования фактических, более крупных данных сообщения.

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

Обзор Гибридного Шифрования

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

Симметричное шифрование (например, AES)

  • Принцип работы: Использует один общий секретный ключ как для шифрования, так и для расшифровки.
  • Преимущество: Очень быстрое и эффективное, что делает его идеальным для шифрования больших файлов или потоков данных.
  • Недостаток: Распределение ключей. Как безопасно передать общий секретный ключ получателю? Если злоумышленник перехватит ключ, он сможет расшифровать все сообщения.

Асимметричное шифрование (например, RSA)

  • Принцип работы: Использует пару ключей: открытый ключ для шифрования и закрытый ключ для расшифровки. Открытый ключ можно свободно передавать, а закрытый ключ должен храниться в секрете его владельцем.
  • Преимущество: Решает проблему распределения ключей. Любой может использовать ваш открытый ключ для шифрования сообщения для вас, но только вы можете расшифровать его своим закрытым ключом.
  • Недостаток: Математически сложное и, следовательно, намного более медленное, чем симметричное шифрование. Непрактично для шифрования больших объемов данных.

Гибридное решение

Гибридное шифрование объединяет эти два метода, чтобы получить безопасность асимметричного шифрования и скорость симметричного шифрования. Вот типичный рабочий процесс:

  1. Отправитель (Алиса) хочет отправить безопасное сообщение получателю (Бобу).
  2. Алиса генерирует новый, случайный симметричный сеансовый ключ.
  3. Алиса шифрует свое фактическое сообщение с помощью этого быстрого симметричного сеансового ключа.
  4. Алиса получает открытый ключ Боба. Она использует его для шифрования только небольшого симметричного сеансового ключа.
  5. Алиса отправляет Бобу как зашифрованное симметричным способом сообщение, так и зашифрованный асимметричным способом сеансовый ключ.
  6. Боб получает два элемента. Сначала он использует свой закрытый ключ для расшифровки зашифрованного сеансового ключа.
  7. Теперь, когда у Боба есть исходный симметричный сеансовый ключ, он использует его для быстрой расшифровки фактического сообщения.

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

Генерация RSA и AES Ключей

На этом этапе мы сгенерируем два набора ключей, необходимых для нашей схемы гибридного шифрования: пару ключей RSA (открытый и закрытый) для асимметричной части и случайный сеансовый ключ для симметричной части (AES). Все операции будут выполняться в директории ~/project.

Сначала сгенерируем 2048-битный закрытый ключ RSA. Этот ключ должен храниться в секрете получателем.

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

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

openssl rsa -pubout -in private_key.pem -out public_key.pem

Команда выведет writing RSA key.

Теперь создадим случайный 256-битный (32-байтовый) сеансовый ключ. Этот ключ будет использоваться с алгоритмом AES для шифрования наших фактических данных. Мы используем openssl rand для генерации криптографически стойких случайных данных и кодируем их в Base64 для более удобной обработки.

openssl rand -base64 32 > session_key.key

Перечислим файлы в нашей директории, чтобы увидеть созданные нами ключи.

ls -l

Вы должны увидеть три сгенерированных вами файла ключей, а также файл message.txt, созданный во время настройки.

-rw-rw-r-- 1 labex labex   57 Oct 20 15:12 message.txt
-rw------- 1 labex labex 1704 Oct 20 15:14 private_key.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 15:14 public_key.pem
-rw-rw-r-- 1 labex labex   45 Oct 20 15:14 session_key.key

Шифрование Сессионного Ключа с Помощью RSA

На этом этапе мы выполним критически важную часть процесса гибридного шифрования: шифрование симметричного сеансового ключа. Чтобы гарантировать, что только предполагаемый получатель сможет использовать сеансовый ключ, мы зашифруем его с помощью его открытого ключа RSA.

Мы будем использовать команду openssl pkeyutl, которая является утилитой для операций с открытыми ключами. Мы используем ее для шифрования файла session_key.key с помощью public_key.pem.

Выполните следующую команду:

openssl pkeyutl -encrypt -pubin -inkey public_key.pem -in session_key.key -out encrypted_session_key.bin

Разберем эту команду:

  • pkeyutl: Утилита для работы с открытыми ключами (public key utility tool).
  • -encrypt: Указывает, что мы хотим выполнить операцию шифрования.
  • -pubin: Указывает, что входной ключ (-inkey) является открытым ключом.
  • -inkey public_key.pem: Указывает открытый ключ, используемый для шифрования.
  • -in session_key.key: Входной файл, который нужно зашифровать (наш сеансовый ключ AES).
  • -out encrypted_session_key.bin: Выходной файл, в котором будет сохранен зашифрованный ключ.

Эта команда создает новый файл, encrypted_session_key.bin, который содержит сеансовый ключ в зашифрованном виде. Теперь этот файл можно безопасно передавать, так как только владелец соответствующего закрытого ключа может его расшифровать.

Проверим наличие нового созданного файла:

ls -l encrypted_session_key.bin

Вы увидите бинарный файл, содержащий зашифрованный ключ.

-rw-rw-r-- 1 labex labex 256 Oct 20 15:14 encrypted_session_key.bin

Шифрование Данных с Помощью AES

Теперь, когда мы обеспечили безопасность нашего сеансового ключа, мы можем использовать исходный, незашифрованный сеансовый ключ для быстрого шифрования нашего основного файла данных, message.txt. Для этой задачи мы будем использовать симметричный шифр AES-256-CBC.

Команда openssl enc требует, чтобы ключ и Вектор Инициализации (IV) были предоставлены в шестнадцатеричном формате. Наш session_key.key находится в Base64, поэтому сначала нам нужно декодировать его и преобразовать в hex. Мы также сгенерируем случайный IV. Для удобства мы сохраним оба значения в переменных окружения.

Сначала преобразуем сеансовый ключ и сохраним его в переменной AES_KEY:

export AES_KEY=$(cat session_key.key | base64 -d | xxd -p -c 32)

Далее сгенерируем случайный 128-битный (16-байтовый) IV и сохраним его в переменной AES_IV. IV используется для того, чтобы многократное шифрование одного и того же открытого текста приводило к разным шифротекстам.

export AES_IV=$(openssl rand -hex 16)

Имея готовые ключ и IV, мы можем зашифровать message.txt с помощью openssl enc:

openssl enc -aes-256-cbc -in message.txt -out encrypted_message.dat -K $AES_KEY -iv $AES_IV

Рассмотрим опции команды:

  • -aes-256-cbc: Указывает шифр AES-256 в режиме CBC.
  • -in message.txt: Входной файл с данными.
  • -out encrypted_message.dat: Выходной файл для зашифрованных данных.
  • -K $AES_KEY: Ключ шифрования в шестнадцатеричном формате (заглавная K).
  • -iv $AES_IV: Вектор инициализации в шестнадцатеричном формате.

На этом этапе отправитель должен упаковать encrypted_message.dat, encrypted_session_key.bin и IV ($AES_IV) для отправки получателю. Для данной лабораторной работы у нас все файлы находятся в нашей директории, готовые к шагу расшифровки.

Проверим, что файл зашифрованных данных был создан:

ls -l encrypted_message.dat
-rw-rw-r-- 1 labex labex 64 Oct 20 15:14 encrypted_message.dat

Расшифровка Сообщения

На этом заключительном шаге мы смоделируем действия получателя. Получатель получил зашифрованные данные (encrypted_message.dat), зашифрованный сеансовый ключ (encrypted_session_key.bin) и IV. Он использует свой секретный закрытый ключ, чтобы обратить процесс и восстановить исходное сообщение.

Сначала получатель должен расшифровать сеансовый ключ, используя свой private_key.pem.

openssl pkeyutl -decrypt -inkey private_key.pem -in encrypted_session_key.bin -out decrypted_session_key.key

Эта команда использует pkeyutl с флагом -decrypt и закрытым ключом для восстановления исходного сеансового ключа AES, сохраняя его в decrypted_session_key.key.

Мы можем быстро проверить, что расшифрованный ключ идентичен исходному, который мы создали на Шаге 2. Команда diff не должна выводить никакого вывода, если файлы совпадают.

diff session_key.key decrypted_session_key.key

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

export DECRYPTED_AES_KEY=$(cat decrypted_session_key.key | base64 -d | xxd -p -c 32)

Наконец, используйте openssl enc с флагом -d (decrypt), предоставив тот же ключ и IV, которые использовались для шифрования. (Переменная $AES_IV все еще установлена в нашей оболочке из предыдущего шага).

openssl enc -d -aes-256-cbc -in encrypted_message.dat -out decrypted_message.txt -K $DECRYPTED_AES_KEY -iv $AES_IV

Процесс завершен! Исходное сообщение восстановлено и сохранено в decrypted_message.txt. Просмотрим его содержимое, чтобы подтвердить наш успех.

cat decrypted_message.txt

В терминале должно отобразиться исходное секретное сообщение:

This is a secret message that needs to be sent securely.

Резюме

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

Вы узнали, как:

  • Генерировать пару ключей RSA для асимметричного шифрования.
  • Создавать случайный сеансовый ключ AES для симметричного шифрования.
  • Надежно шифровать сеансовый ключ с помощью открытого ключа RSA.
  • Эффективно шифровать большие объемы данных с использованием сеансового ключа AES.
  • Обратить процесс, расшифровав сеансовый ключ с помощью закрытого ключа RSA, а затем расшифровав данные.

Этот подход, сочетающий "лучшее из обоих миров" — безопасность асимметричной криптографии для обмена ключами и скорость симметричной криптографии для шифрования данных — является краеугольным камнем современных протоколов безопасности, таких как TLS/SSL, которые ежедневно защищают ваши данные в Интернете.