Асимметричное шифрование с использованием RSA в криптографии

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

Введение

В этой лабораторной работе вы изучите принципы асимметричного шифрования, краеугольного камня современной криптографии. В отличие от симметричного шифрования, которое использует один ключ как для шифрования, так и для дешифрования, асимметричное шифрование использует пару ключей: открытый ключ (public key) и закрытый ключ (private key).

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

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

Основы асимметричного шифрования

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

Асимметричное шифрование основано на двух различных, но математически связанных ключах:

  • Открытый Ключ (Public Key): Этот ключ доступен всем. Его основная функция — шифрование данных. Любой, у кого есть открытый ключ, может зашифровать сообщение, но не может использовать его для расшифровки этого же сообщения. Представьте его как открытый почтовый слот: любой может опустить в него письмо.

  • Закрытый Ключ (Private Key): Этот ключ должен храниться владельцем в секрете и быть защищенным. Его функция — дешифрование данных, которые были зашифрованы соответствующим открытым ключом. Только владелец закрытого ключа может расшифровать сообщение. В нашей аналогии с почтовым ящиком закрытый ключ — это уникальный ключ, который может открыть ящик и извлечь письма.

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

Генерация пары ключей RSA

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

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

openssl genrsa -out private.pem 2048

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

  • openssl: Команда для вызова инструментария OpenSSL.
  • genrsa: Конкретная команда для генерации закрытого ключа RSA.
  • -out private.pem: Этот флаг указывает имя выходного файла для ключа. Мы называем его private.pem.
  • 2048: Это длина ключа в битах. 2048 бит — это стандартная, безопасная длина для ключей RSA.

Теперь убедитесь, что файл private.pem был создан в вашей текущей директории, используя команду ls.

ls

В выводе вы должны увидеть private.pem.

private.pem

Извлечение открытого ключа

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

Используйте следующую команду для извлечения открытого ключа:

openssl rsa -in private.pem -pubout -out public.pem

Вот разбор команды:

  • openssl rsa: Эта команда используется для обработки ключей RSA.
  • -in private.pem: Указывает входной файл, который является нашим закрытым ключом.
  • -pubout: Этот флаг предписывает openssl извлечь и вывести открытую часть ключа.
  • -out public.pem: Указывает имя выходного файла для открытого ключа.

Команда выдаст короткий вывод, подтверждающий операцию.

writing RSA key

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

ls

Теперь вы должны увидеть и private.pem, и public.pem.

private.pem  public.pem

Вы можете просмотреть содержимое файла открытого ключа. Это текстовый файл в формате PEM.

cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
...
-----END PUBLIC KEY-----

Шифрование сообщения с помощью открытого ключа

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

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

echo "This is a secret message." > message.txt

Эта команда создает файл с именем message.txt с указанным содержимым. Теперь зашифруем этот файл, используя открытый ключ.

openssl pkeyutl -encrypt -pubin -inkey public.pem -in message.txt -out encrypted.bin

Рассмотрим эту команду:

  • openssl pkeyutl: Утилита для выполнения операций с открытым ключом, таких как шифрование и дешифрование.
  • -encrypt: Указывает, что мы хотим выполнить операцию шифрования.
  • -pubin: Указывает, что входной ключ (-inkey) является открытым ключом.
  • -inkey public.pem: Указывает открытый ключ, который будет использоваться для шифрования.
  • -in message.txt: Входной файл, содержащий сообщение в открытом виде (plaintext).
  • -out encrypted.bin: Выходной файл, в котором будут храниться зашифрованные данные (ciphertext).

После выполнения команды будет создан новый файл encrypted.bin. Если вы попытаетесь просмотреть его содержимое, вы увидите нечитаемые двоичные данные, что является зашифрованным вариантом вашего сообщения.

cat encrypted.bin

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

Расшифровка сообщения с помощью закрытого ключа

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

Используйте следующую команду для дешифрования encrypted.bin:

openssl pkeyutl -decrypt -inkey private.pem -in encrypted.bin -out decrypted.txt

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

  • openssl pkeyutl: Та же утилита, что и ранее.
  • -decrypt: На этот раз мы указываем операцию дешифрования.
  • -inkey private.pem: Указывает закрытый ключ, который будет использоваться для дешифрования.
  • -in encrypted.bin: Входной файл, содержащий зашифрованный текст (ciphertext).
  • -out decrypted.txt: Выходной файл, в который будет сохранен восстановленный открытый текст (plaintext).

Эта команда создаст новый файл с именем decrypted.txt. Чтобы убедиться, что дешифрование прошло успешно, отобразите содержимое этого нового файла.

cat decrypted.txt

Вы должны увидеть ваше исходное сообщение полностью восстановленным.

This is a secret message.

Поздравляем! Вы успешно выполнили полный цикл асимметричного шифрования и дешифрования с использованием RSA и OpenSSL.

Резюме

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

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

В частности, вы отработали следующие ключевые навыки:

  • Генерация пары ключей RSA размером 2048 бит с использованием openssl genrsa.
  • Извлечение открытого ключа из файла закрытого ключа с помощью openssl rsa.
  • Шифрование сообщения в открытом виде с помощью открытого ключа с использованием openssl pkeyutl.
  • Дешифрование полученного зашифрованного текста с помощью соответствующего закрытого ключа с использованием openssl pkeyutl.

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