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

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

Введение

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

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

Концепция симметричного шифрования

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

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

Для этой лабораторной работы мы будем работать с простым текстовым файлом. Файл с именем original.txt был предварительно создан для вас в каталоге ~/project. Вы можете просмотреть его содержимое и убедиться, что это обычный, читаемый текстовый файл.

Давайте перечислим файлы в текущем каталоге, чтобы увидеть его:

ls -l

Вы должны увидеть файл original.txt в выводе:

-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

Теперь давайте посмотрим его содержимое:

cat original.txt

Вывод будет представлять собой простое текстовое сообщение внутри файла:

This is a secret message.

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

Генерация AES-ключа

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

Мы будем использовать команду openssl rand для генерации криптографически стойкого случайного ключа. Мы сгенерируем 256-битный ключ, что является стандартной длиной для алгоритма AES (Advanced Encryption Standard — Стандарт расширенного шифрования).

Выполните следующую команду, чтобы сгенерировать 32-байтовый (256-битный) ключ в шестнадцатеричном формате и сохранить его в файл с именем aes.key:

openssl rand -hex 32 > aes.key

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

  • openssl rand: Команда для генерации случайных данных.
  • -hex: Форматирует вывод в виде шестнадцатеричной строки.
  • 32: Указывает количество байтов случайных данных для генерации. Поскольку каждый шестнадцатеричный символ представляет 4 бита (или полбайта), 32 байта данных приведут к 64-символьной шестнадцатеричной строке.
  • > aes.key: Перенаправляет вывод команды и сохраняет его в файл aes.key.

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

cat aes.key

Вы увидите длинную строку шестнадцатеричных символов, которая и является вашим 256-битным секретным ключом:

2da75d4f284618ed6933d0e743757ed014ba39a1a8aa1879ebbbfe53b92d519a

Этот файл, aes.key, теперь содержит секрет, который мы будем использовать как для шифрования, так и для дешифрования наших данных.

Шифрование файла с помощью AES

На этом шаге вы будете использовать сгенерированный ключ для шифрования файла original.txt. Мы воспользуемся командой openssl enc, которая является универсальным инструментом для шифрования и дешифрования.

Мы будем использовать шифр AES-256-CBC.

  • AES-256: Относится к Advanced Encryption Standard с 256-битным ключом.
  • CBC: Означает Cipher Block Chaining (Режим сцепления блоков шифротекста) — режим работы, который добавляет случайность и гарантирует, что одинаковые блоки открытого текста не приведут к одинаковым блокам шифротекста.

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

openssl enc -aes-256-cbc -pbkdf2 -salt -in original.txt -out encrypted.dat -pass file:./aes.key

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

  • openssl enc: Команда для шифров.
  • -aes-256-cbc: Указывает используемый алгоритм шифрования.
  • -pbkdf2: Использует современную, основанную на стандартах функцию вывода ключа на основе пароля (PBKDF2) для предотвращения предупреждений о нерекомендуемом использовании.
  • -salt: Добавляет случайную соль (salt) к ключу перед шифрованием. Это важнейшая практика безопасности, защищающая от определенных типов атак.
  • -in original.txt: Указывает входной файл для шифрования.
  • -out encrypted.dat: Указывает имя выходного файла, в котором будут храниться зашифрованные данные.
  • -pass file:./aes.key: Указывает OpenSSL считывать пароль (в нашем случае, симметричный ключ) из файла aes.key.

После выполнения команды будет создан новый файл с именем encrypted.dat. Давайте попробуем просмотреть его содержимое:

cat encrypted.dat

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

Salted___Mi72j)NU_nJ_h9s(0]%

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

Расшифровка файла с помощью AES

На этом шаге вы расшифруете файл encrypted.dat, чтобы восстановить исходное сообщение. Поскольку это симметричное шифрование, мы будем использовать тот же ключ (aes.key) и ту же базовую команду (openssl enc), что и при шифровании.

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

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

openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.dat -out decrypted.txt -pass file:./aes.key

Эта команда очень похожа на команду шифрования:

  • -d: Этот флаг указывает, что мы хотим дешифровать входной файл.
  • -aes-256-cbc: Мы должны указать тот же шифр, который использовался для шифрования.
  • -pbkdf2: Вы должны использовать ту же функцию вывода ключа (key derivation function), которая использовалась при шифровании.
  • -in encrypted.dat: Входным файлом теперь являются наши зашифрованные данные.
  • -out decrypted.txt: Выходной файл, в котором будет сохранен расшифрованный, читаемый текст.
  • -pass file:./aes.key: Мы предоставляем тот же ключ, который использовался для шифрования файла.

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

cat decrypted.txt

Вывод должен быть исходным сообщением, точно таким же, как в original.txt:

This is a secret message.

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

Проверка целостности файла

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

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

Выполните команду diff для сравнения исходного и расшифрованного файлов:

diff original.txt decrypted.txt

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

Чтобы увидеть все файлы, с которыми вы работали в этой лабораторной работе, вы можете еще раз выполнить ls -l:

ls -l

Вы увидите исходный файл, ключ, зашифрованные данные и окончательный расшифрованный файл:

-rw-rw-r-- 1 labex labex 65 Oct 20 08:57 aes.key
-rw-rw-r-- 1 labex labex 26 Oct 20 08:57 decrypted.txt
-rw-rw-r-- 1 labex labex 48 Oct 20 08:57 encrypted.dat
-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

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

Резюме

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

Вы успешно выполнили полный рабочий процесс шифрования и дешифрования:

  • Вы изучили основную концепцию единого общего ключа как для шифрования, так и для дешифрования.
  • Вы использовали openssl rand для генерации надежного 256-битного AES-ключа.
  • Вы использовали openssl enc для шифрования текстового файла, сделав его нечитаемым.
  • Вы использовали ту же команду с флагом -d для дешифрования файла обратно в его исходное состояние.
  • Наконец, вы использовали команду diff для программной проверки того, что расшифрованные данные идентичны исходным, подтвердив целостность данных.

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