Введение
В этой лабораторной работе вы освоите ключевые навыки шифрования и дешифрования файлов в среде Linux с использованием GPG (GNU Privacy Guard). Вы начнете с генерации собственной пары открытого и закрытого ключей — основы модели безопасности GPG. После создания ключей вы отработаете основные операции: шифрование файла для самого себя и его последующую расшифровку с помощью секретного ключа и парольной фразы.
Опираясь на эти основы, вы изучите способы безопасного обмена информацией с другими пользователями. Это включает в себя экспорт вашего публичного ключа для передачи и импорт публичного ключа другого пользователя. Вы также узнаете, как подписывать публичные ключи для подтверждения их подлинности и выполнять критически важные задачи по обслуживанию, такие как резервное копирование секретного ключа и создание сертификата отзыва на случай компрометации ключа.
Генерация пары ключей GPG с помощью gpg --gen-key
На этом этапе вы создадите свою персональную пару ключей GPG (GNU Privacy Guard). Пара ключей GPG состоит из двух различных, но связанных между собой ключей: публичного (открытого) и приватного (закрытого). Вы можете передавать свой публичный ключ другим людям, чтобы они могли шифровать файлы для вас. Приватный ключ необходимо держать в секрете, так как это единственный ключ, способный расшифровать файлы, зашифрованные вашим публичным ключом.
Для начала убедимся, что пакет gnupg, обеспечивающий функциональность GPG, установлен в вашей системе.
sudo apt-get update && sudo apt-get install -y gnupg
Теперь вы готовы к генерации пары ключей. Команда gpg --gen-key проведет вас через интерактивный процесс.
Выполните следующую команду в терминале:
gpg --gen-key
Вы увидите уведомление о том, что эта команда использует упрощенный процесс генерации. Для доступа к расширенным настройкам можно использовать gpg --full-generate-key, но для целей данной лабораторной работы подходят параметры по умолчанию.
Система запросит следующую информацию:
- Real name (Реальное имя): введите
labex - Email address (Адрес электронной почты): введите
labex@example.com - Confirm User ID (Подтверждение данных): проверьте введенные данные. Когда появится запрос
Change (N)ame, (E)mail, or (O)kay/(Q)uit?, введитеOи нажмитеEnter.
Система автоматически применит безопасные настройки по умолчанию:
- Тип ключа: RSA и RSA (по умолчанию)
- Размер ключа: 3072 бит (безопасный стандарт)
- Срок действия: 2 года (автоматическое истечение для безопасности)
Примечание: В отличие от старых версий, современный GPG может не запрашивать парольную фразу во время генерации через --gen-key. Если вы хотите добавить пароль к ключу для дополнительной защиты, вы можете сделать это позже с помощью команды:
gpg --edit-key labex
Затем введите passwd в приглашении GPG, чтобы установить пароль, и save для выхода.
Система начнет генерацию пары ключей. Этот процесс требует случайных данных (энтропии) и может занять некоторое время.
По завершении вы увидите подтверждающее сообщение, похожее на это:
gpg: key <KEY_ID> marked as ultimately trusted
gpg: revocation certificate stored as '/home/labex/.gnupg/openpgp-revocs.d/<FINGERPRINT>.rev'
public and secret key created and signed.
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
Теперь, когда ключи созданы, вы можете их просмотреть. Чтобы увидеть ваш новый публичный ключ, выполните:
gpg --list-keys
В выводе будут перечислены все публичные ключи в вашей связке, включая только что созданный:
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
Чтобы просмотреть ваш приватный ключ, выполните:
gpg --list-secret-keys
Вывод будет похожим, но вместо публичного ключа (pub) будет указан секретный ключ (sec):
/home/labex/.gnupg/pubring.kbx
------------------------------
sec rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT>
uid [ultimate] labex <labex@example.com>
ssb rsa3072 2025-07-01 [E] [expires: 2027-07-01]
Вы успешно создали и проверили свою пару ключей GPG.
Шифрование и дешифрование локального файла с помощью gpg -e и gpg --decrypt
На этом этапе вы воспользуетесь созданной парой ключей для шифрования и последующей расшифровки файла. Это основной сценарий использования GPG, позволяющий защитить конфиденциальность ваших данных. Шифрование превращает читаемые данные в нечитаемый формат, и только обладатель правильного приватного ключа может вернуть их в исходный вид.
Сначала создадим простой текстовый файл для работы. Все операции будут выполняться в текущем каталоге ~/project.
echo "This is a secret message for the lab." > mytestfile.txt
Теперь зашифруем этот файл, используя ваш публичный ключ. Для шифрования используется команда gpg -e. Также необходимо указать получателя зашифрованного сообщения с помощью флага -r, которым в данном случае является имя, связанное с вашим ключом GPG (labex).
gpg -e -r labex mytestfile.txt
GPG использует ваш публичный ключ для шифрования. Парольная фраза не потребуется, так как шифрование выполняется открытым ключом, который не является секретным.
После завершения команды проверьте наличие нового зашифрованного файла с помощью ls.
ls
В списке файлов должен появиться mytestfile.txt.gpg рядом с оригиналом.
mytestfile.txt mytestfile.txt.gpg
Файл mytestfile.txt.gpg содержит зашифрованные данные. Если вы попытаетесь просмотреть его содержимое, вы увидите нечитаемые бинарные символы.
Теперь расшифруем файл. Для этого используется команда gpg --decrypt. Поскольку происходит дешифрование, GPG задействует ваш приватный ключ.
Мы используем флаг --output, чтобы сохранить расшифрованное содержимое в новый файл mytestfile.txt.decrypted. Это предотвратит перезапись оригинала и позволит наглядно сравнить файлы.
gpg --output mytestfile.txt.decrypted --decrypt mytestfile.txt.gpg
Если у вашего ключа есть парольная фраза, система предложит ее ввести. Если пароль не устанавливался, расшифровка произойдет автоматически. Вы увидите сообщение, похожее на:
gpg: encrypted with 3072-bit RSA key, ID <KEY_ID>, created 2025-07-01
"labex <labex@example.com>"
После расшифровки проверьте содержимое нового файла, чтобы убедиться, что оно совпадает с исходным сообщением.
cat mytestfile.txt.decrypted
На экране должен появиться исходный текст:
This is a secret message for the lab.
Вы успешно зашифровали файл для себя и расшифровали его с помощью своей пары ключей GPG.
Обмен публичными ключами с помощью gpg --export и gpg --import
На этом этапе вы научитесь обмениваться публичными ключами. Чтобы зашифровать файл для другого человека, вам нужен его публичный ключ. Аналогично, если кто-то хочет отправить зашифрованный файл вам, ему понадобится ваш публичный ключ. Этот процесс включает экспорт вашего ключа в файл и импорт полученных ключей в вашу связку GPG.
Сначала экспортируем ваш собственный публичный ключ. Для этого используется команда gpg --export. Рекомендуется использовать опцию --armor, которая создает текстовую (ASCII) версию ключа — ее удобно копировать в электронные письма или мессенджеры. Сохраним его в файл labex.pub.
Выполните команду в терминале, заменив labex на ваш идентификатор пользователя:
gpg --export --armor -o labex.pub labex
Проверьте создание файла:
ls
В списке должен появиться labex.pub. Вы можете просмотреть его содержимое:
cat labex.pub
Вы увидите блок текста, начинающийся с -----BEGIN PGP PUBLIC KEY BLOCK-----. Это ваш публичный ключ, которым теперь можно делиться.
Далее мы сымитируем получение публичного ключа от другого пользователя и его импорт. В реальной ситуации вы бы получили файл от другого человека по безопасному каналу. Для этой лабораторной работы мы создадим временную пару ключей для пользователя Alice и экспортируем её публичный ключ.
Сначала создадим ключи для Alice в автоматическом режиме:
cat > alice-key-params << 'EOF'
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: Alice
Name-Email: alice@example.com
Expire-Date: 2y
%no-protection
%commit
EOF
Сгенерируйте ключи Alice, используя файл параметров:
gpg --batch --generate-key alice-key-params
Вы увидите подтверждение:
gpg: key <KEY_ID> marked as ultimately trusted
public and secret key created and signed.
Теперь экспортируйте публичный ключ Alice, имитируя его получение:
gpg --export --armor -o alice.pub alice@example.com
Для чистоты эксперимента удалим секретный ключ Alice из вашей связки, так как в реальности у вас был бы только её публичный ключ:
gpg --delete-secret-keys alice@example.com
При появлении запроса подтвердите удаление, введя y и нажав Enter.
gpg --delete-keys alice@example.com
Снова подтвердите удаление, введя y и нажав Enter.
Теперь у вас есть файл alice.pub, как если бы Alice прислала его вам.
Удалите временный файл параметров:
rm alice-key-params
Теперь импортируйте публичный ключ Alice в свою связку GPG с помощью команды gpg --import.
gpg --import alice.pub
Вы увидите подтверждение импорта:
gpg: key <KEY_ID>: public key "Alice <alice@example.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
Чтобы убедиться, что ключ Alice теперь в вашей связке, снова выведите список публичных ключей.
gpg --list-keys
Теперь в списке будут и ваш ключ (labex), и импортированный ключ (Alice).
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [ unknown] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
Обратите внимание, что ключ Alice помечен как [ unknown] (неизвестный уровень доверия). Вы научитесь управлять доверием на следующем этапе.
Подписание публичного ключа и шифрование файла для другого пользователя
На этом этапе вы узнаете, как установить доверие к полученному публичному ключу и использовать его для шифрования файла. Когда вы импортируете ключ, GPG не знает, действительно ли он принадлежит указанному человеку. «Подписывая» ключ своим приватным ключом, вы создаете криптографическое подтверждение, сообщая системе: «Я доверяю тому, что этот ключ принадлежит именно этому человеку». Это фундаментальная концепция модели «Сети доверия» (Web of Trust) в GPG.
Сначала подпишите публичный ключ Alice, который вы импортировали ранее. Используйте команду gpg --sign-key, указав адрес электронной почты (alice@example.com).
gpg --sign-key alice@example.com
GPG отобразит детали ключа Alice и попросит подтвердить подписание.
pub rsa2048/XXXXXXXXXXXXXXXX 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: SC
trust: unknown validity: unknown
sub rsa2048/YYYYYYYYYYYYYYYY 2025-07-01
created: 2025-07-01 expires: 2027-07-01 usage: E
[ unknown] (1). Alice <alice@example.com>
Really sign? (y/N)
Введите y и нажмите Enter. Если у вашего ключа есть парольная фраза, введите её. Подпись — это криптографическая операция, которая возможна только с использованием вашего секретного ключа.
После завершения проверьте статус ключа в списке.
gpg --list-keys
Запись для Alice изменилась. Уровень доверия больше не [unknown], теперь он [ultimate], так как вы явно подтвердили его своей подписью.
/home/labex/.gnupg/pubring.kbx
------------------------------
pub rsa3072 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_LABEX>
uid [ultimate] labex <labex@example.com>
sub rsa3072 2025-07-01 [E] [expires: 2027-07-01]
pub rsa2048 2025-07-01 [SC] [expires: 2027-07-01]
<FINGERPRINT_ALICE>
uid [ultimate] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
Теперь, когда у вас есть доверенный ключ Alice, вы можете зашифровать файл, который сможет открыть только она. Создайте новый файл.
echo "This is a confidential message for Alice." > message-for-alice.txt
Зашифруйте его командой gpg -e, указав Alice в качестве получателя через флаг -r.
gpg -e -r alice@example.com message-for-alice.txt
GPG использует публичный ключ Alice для шифрования. Проверьте результат:
ls
В каталоге появится зашифрованный файл message-for-alice.txt.gpg.
labex.pub mytestfile.txt
alice.pub mytestfile.txt.decrypted
message-for-alice.txt mytestfile.txt.gpg
message-for-alice.txt.gpg
Этот файл надежно защищен. Только человек с доступом к приватному ключу Alice (и знающий её пароль) сможет прочитать сообщение.
Обслуживание ключей: экспорт секретных ключей и создание сертификата отзыва
На заключительном этапе вы выполните две важные задачи по обслуживанию: создание резервной копии секретного ключа и генерацию сертификата отзыва. Секретный ключ незаменим; если вы его потеряете, вы навсегда утратите доступ к данным, зашифрованным вашим публичным ключом. Сертификат отзыва — это ваша «страховка», позволяющая аннулировать публичный ключ, если секретный ключ будет утерян или украден.
Сначала создадим резервную копию секретного ключа. Это один из важнейших шагов в управлении GPG.
Для этого используется команда gpg --export-secret-keys. Мы добавим флаг --armor для создания текстового файла, который удобно хранить. Укажите идентификатор пользователя для экспорта.
gpg --export-secret-keys --armor -o gpgkey.asc labex
Эта команда экспортирует секретный ключ пользователя labex в файл gpgkey.asc. Этот файл чрезвычайно конфиденциален. В реальной жизни его следует хранить в очень надежном офлайн-месте, например, на зашифрованной USB-флешке или в сейфе.
Затем создайте сертификат отзыва. Его рекомендуется создавать сразу после генерации ключей и хранить отдельно от копии секретного ключа. Если ваш ключ будет скомпрометирован, вы сможете опубликовать этот сертификат, чтобы другие пользователи узнали, что ключу больше нельзя доверять.
Используйте команду gpg --gen-revoke, сохранив результат в файл revoke.asc.
gpg --output revoke.asc --gen-revoke labex
Следуйте инструкциям:
- На вопрос
Create a revocation certificate for this key? (y/N)введитеyи нажмитеEnter. - Выберите причину отзыва. Для практики нажмите
Enter, чтобы выбрать вариант по умолчанию0 = No reason specified(причина не указана). - Можно добавить описание или просто нажать
Enter, оставив поле пустым. - Подтвердите данные, введя
yна вопросIs this okay? (y/N). - Если установлен пароль, GPG запросит его для авторизации создания сертификата.
Вы увидите подтверждение создания сертификата отзыва.
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The printout
might be scanned and reconstructed by a determined attacker.
Проверьте наличие файлов в каталоге ~/project:
ls
Теперь в списке должны быть gpgkey.asc и revoke.asc. Вы успешно выполнили необходимые процедуры по обслуживанию ключей.
Резюме
В этой лабораторной работе вы изучили основные операции с GNU Privacy Guard (GPG) в среде Linux. Вы начали с генерации персональной пары ключей GPG, состоящей из публичного и приватного ключей, с помощью команды gpg --gen-key. Этот процесс включал настройку параметров ключа и создание идентификатора пользователя. После генерации вы отработали базовую функцию GPG — шифрование локального файла для себя с помощью gpg -e и его последующую расшифровку командой gpg --decrypt, что наглядно демонстрирует принципы асимметричного шифрования.
Закрепив основы, вы изучили методы безопасного взаимодействия с другими пользователями. Вы научились обмениваться публичными ключами, используя gpg --export для передачи своего ключа и gpg --import для получения чужого. Также была рассмотрена важность установления доверия путем подписания импортированного ключа и его использования для шифрования файлов конкретному получателю. Наконец, вы выполнили критически важные задачи по обслуживанию: резервное копирование секретного ключа с помощью gpg --export-secret-keys и создание сертификата отзыва через gpg --gen-revoke для аннулирования пары ключей в случае их компрометации.



