Цифровые подписи с использованием RSA в криптографии

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

Введение

Добро пожаловать в лабораторную работу по цифровым подписям с использованием RSA. Цифровая подпись — это криптографический механизм, используемый для проверки подлинности (аутентичности) и целостности цифровых сообщений или документов. Она гарантирует, что сообщение было создано известным отправителем (подлинность) и что оно не было изменено при передаче (целостность).

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

Концепция цифровой подписи

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

Этот процесс обеспечивает две критически важные гарантии безопасности:

  • Подлинность (Authenticity): Поскольку только отправитель владеет закрытым ключом, действительная подпись доказывает, что сообщение исходит именно от него.
  • Целостность (Integrity): Подпись математически связана с содержимым сообщения. Если сообщение будет изменено каким-либо образом, подпись станет недействительной.

Для проведения этой лабораторной работы процесс настройки уже сгенерировал для вас пару ключей RSA: private.pem (ваш секретный ключ) и public.pem (ваш ключ, которым можно делиться). Также был создан файл с именем message.txt. Давайте выведем список файлов в нашей рабочей директории, чтобы их увидеть.

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

ls -l

Вы должны увидеть подготовленные для вас файлы:

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem

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

Подписание сообщения с помощью закрытого ключа

На этом шаге вы создадите цифровую подпись для файла message.txt. Процесс включает два основных действия: во-первых, создание криптографического хеша (уникальной строки байтов фиксированного размера) сообщения, и во-вторых, шифрование этого хеша с помощью вашего закрытого ключа. Результатом является цифровая подпись.

Для выполнения этой операции мы будем использовать команду openssl dgst. Давайте выполним команду для подписания message.txt.

openssl dgst -sha256 -sign private.pem -out signature.bin message.txt

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

  • openssl dgst: Вызывает команду OpenSSL для создания дайджеста (хеша).
  • -sha256: Указывает алгоритм SHA-256 для создания хеша сообщения.
  • -sign private.pem: Указывает OpenSSL подписать хеш, используя указанный закрытый ключ, private.pem.
  • -out signature.bin: Указывает выходной файл, в котором будет сохранена результирующая бинарная подпись.
  • message.txt: Это входной файл, который мы подписываем.

После выполнения команды будет создан новый файл с именем signature.bin. Этот файл содержит цифровую подпись. Вы можете проверить его создание, снова выведя список файлов.

ls -l

Теперь вы увидите signature.bin в списке файлов:

-rw-rw-r-- 1 labex labex   55 Oct 20 09:20 document.txt
-rw-rw-r-- 1 labex labex   26 Oct 20 09:20 message.txt
-rw------- 1 labex labex 1704 Oct 20 09:20 private.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 09:20 public.pem
-rw-rw-r-- 1 labex labex  256 Oct 20 09:26 signature.bin

Проверка подписи с помощью открытого ключа

На этом шаге мы сыграем роль получателя, который хочет проверить подпись. Для этого получателю необходимы три элемента: исходное сообщение (message.txt), цифровая подпись (signature.bin) и открытый ключ отправителя (public.pem).

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

Давайте снова используем openssl dgst, но на этот раз с опцией -verify.

openssl dgst -sha256 -verify public.pem -signature signature.bin message.txt

Вот разбивка команды проверки:

  • -verify public.pem: Указывает OpenSSL проверить подпись, используя указанный открытый ключ, public.pem.
  • -signature signature.bin: Указывает файл подписи, который необходимо проверить.
  • message.txt: Это исходный файл сообщения, которому должна соответствовать подпись.

Если подпись действительна, OpenSSL выведет следующее сообщение:

Verified OK

Это подтверждение означает две вещи: сообщение было однозначно подписано владельцем ключа private.pem, и содержимое message.txt не было изменено с момента его подписания.

Подписание файла с помощью закрытого ключа

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

Процедура идентична той, что мы выполняли на Шаге 2. Мы сгенерируем хеш SHA-256 для document.txt, а затем подпишем этот хеш нашим ключом private.pem.

Давайте создадим подпись и сохраним ее в файл с именем document.sig.

openssl dgst -sha256 -sign private.pem -out document.sig document.txt

Эта команда создает новый файл подписи, document.sig, который специфичен для текущего содержимого document.txt. Любое изменение в документе потребует генерации новой подписи.

Давайте выведем список файлов, чтобы убедиться, что document.sig был создан.

ls

Вы должны увидеть новый файл подписи в выводе:

document.sig  document.txt  message.txt  private.pem  public.pem  signature.bin

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

Проверка подделки файла (Tampering Test)

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

Сначала добавим некоторый текст в файл document.txt. Это имитирует атакующего, изменяющего документ.

echo "This is an unauthorized change." >> document.txt

Содержимое document.txt теперь изменилось. Исходная подпись, document.sig, была создана на основе предыдущего содержимого файла.

Теперь давайте попробуем проверить измененный файл document.txt, используя исходную подпись document.sig и открытый ключ.

openssl dgst -sha256 -verify public.pem -signature document.sig document.txt

На этот раз проверка не увенчается успехом. Вместо этого вы увидите сообщение об ошибке, похожее на:

Verification failure
805BA484597F0000:error:02000068:rsa routines:ossl_rsa_verify:bad signature:../crypto/rsa/rsa_sign.c:430:
805BA484597F0000:error:1C880004:Provider routines:rsa_verify:RSA lib:../providers/implementations/signature/rsa_sig.c:774:

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

Резюме

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

Вы прошли весь процесс:

  • Поняли основные концепции аутентичности (authenticity) и целостности (integrity), обеспечиваемые цифровыми подписями.
  • Использовали закрытый ключ (private.pem) для подписи сообщения и создания файла подписи.
  • Использовали соответствующий открытый ключ (public.pem) для проверки подписи и подтверждения подлинности сообщения.
  • Наблюдали сбой проверки (Verification failure) после намеренного изменения подписанного файла, что продемонстрировало, как цифровые подписи защищают целостность данных.

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