Введение
В этой лабораторной работе вы освоите базовые навыки шифрования и расшифровки файлов в среде 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 для шифрования и последующей расшифровки файла. Это фундаментальный сценарий использования 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:
ls
Вы должны увидеть labex.pub в списке файлов. Вы также можете просмотреть его содержимое:
cat labex.pub
Вывод будет представлять собой блок текста, начинающийся с -----BEGIN PGP PUBLIC KEY BLOCK-----. Это ваш открытый ключ, которым теперь можно делиться с другими.
Далее мы сымитируем получение открытого ключа от другого пользователя и его импорт в вашу связку ключей. В реальной ситуации вы получили бы открытый ключ от другого человека по защищенному каналу. Для этой лабораторной работы мы создадим временную пару ключей для Алисы, а затем экспортируем ее открытый ключ.
Сначала создадим временную пару ключей для Алисы. Мы используем пакетный режим для автоматизации процесса без интерактивных запросов:
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
Теперь сгенерируйте пару ключей Алисы, используя файл параметров:
gpg --batch --generate-key alice-key-params
Вы должны увидеть подтверждение генерации ключа:
gpg: key <KEY_ID> marked as ultimately trusted
public and secret key created and signed.
Теперь экспортируйте открытый ключ Алисы в файл, имитируя получение ключа от нее:
gpg --export --armor -o alice.pub alice@example.com
Для демонстрации в рамках лабораторной работы мы также удалим секретный ключ Алисы из связки, так как в реальности у вас был бы только ее открытый ключ:
gpg --delete-secret-keys alice@example.com
При появлении запроса подтвердите удаление, введя y и нажав Enter.
gpg --delete-keys alice@example.com
Снова подтвердите удаление, введя y и нажав Enter.
Теперь у вас есть открытый ключ Алисы в файле alice.pub.
Удалите временный файл параметров генерации ключа:
rm alice-key-params
Теперь, когда открытый ключ Алисы находится в файле, импортируйте его в свою связку ключей 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
Чтобы убедиться, что ключ Алисы теперь в вашей связке, снова выведите список открытых ключей.
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]
Обратите внимание, что ключ Алисы помечен как [ unknown] (неизвестный уровень доверия). Вы узнаете, как управлять доверием к ключам, на следующем этапе.
Подпись открытого ключа и шифрование файла для другого пользователя
На этом этапе вы узнаете, как установить доверие к полученному открытому ключу и использовать его для шифрования файла для его владельца. Когда вы импортируете открытый ключ, GPG не может знать, является ли он подлинным. «Подписывая» ключ своим секретным ключом, вы создаете криптографическое подтверждение, по сути говоря своей системе GPG: «Я доверяю тому, что этот ключ принадлежит этому человеку». Это фундаментальная концепция модели «Сеть доверия» (Web of Trust) в GPG.
Сначала нужно подписать открытый ключ Алисы, который вы импортировали на предыдущем этапе. Используйте команду gpg --sign-key, указав ключ по адресу электронной почты (alice@example.com).
gpg --sign-key alice@example.com
GPG отобразит детали ключа Алисы и попросит подтвердить подпись.
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
Обратите внимание на изменения в записи ключа Алисы. После того как вы подписали импортированный ключ, GPG больше не помечает его как [unknown]. В зависимости от состояния вашей связки ключей, ключ может отображаться с более высоким уровнем достоверности, например [full] или [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 [full] Alice <alice@example.com>
sub rsa2048 2025-07-01 [E] [expires: 2027-07-01]
Чтобы проверить подпись напрямую, выполните:
gpg --list-sigs alice@example.com
Вы должны увидеть строку подписи для labex <labex@example.com>, что подтверждает, что ваш ключ подписал импортированный открытый ключ Алисы.
Теперь, когда у вас есть доверенный открытый ключ Алисы, вы можете зашифровать файл, который сможет открыть только она. Сначала создайте новый файл для этой цели.
echo "This is a confidential message for Alice." > message-for-alice.txt
Затем зашифруйте этот файл с помощью команды gpg -e. В этот раз укажите Алису в качестве получателя с помощью флага -r.
gpg -e -r alice@example.com message-for-alice.txt
GPG использует открытый ключ Алисы для шифрования. Используйте ls, чтобы увидеть результат.
ls
Вы увидите новый зашифрованный файл message-for-alice.txt.gpg в вашем каталоге.
Этот файл теперь надежно зашифрован. Только тот, у кого есть доступ к секретному ключу Алисы (и его парольной фразе), сможет расшифровать и прочитать сообщение.
Обслуживание ключей с помощью gpg --export-secret-keys и gpg --gen-revoke
На этом заключительном этапе вы выполните две критически важные задачи по обслуживанию вашего ключа GPG: создание безопасной резервной копии секретного ключа и генерацию сертификата отзыва. Ваш секретный ключ незаменим; если вы потеряете его, вы потеряете доступ ко всем данным, зашифрованным соответствующим открытым ключом. Сертификат отзыва — это ваша страховка, позволяющая аннулировать открытый ключ, если секретный ключ будет утерян или скомпрометирован.
Сначала создадим резервную копию секретного ключа. Это один из важнейших шагов в управлении ключами GPG.
Для этого используется команда gpg --export-secret-keys. Мы воспользуемся флагом --armor для создания ASCII-армированного текстового файла, который легко хранить и передавать. Вы должны указать, какой ключ экспортировать, по его идентификатору пользователя.
gpg --export-secret-keys --armor -o gpgkey.asc labex
Эта команда экспортирует секретный ключ пользователя labex в файл gpgkey.asc. Этот файл крайне конфиденциален. В реальных условиях вы должны хранить этот файл в очень безопасном, автономном месте, например, на зашифрованном USB-накопителе или в защищенном хранилище.
Далее вы создадите сертификат отзыва. Это следует сделать сразу после генерации ключа и хранить отдельно от резервной копии секретного ключа. Если вы потеряете секретный ключ или его украдут, вы сможете опубликовать этот сертификат, чтобы сообщить другим, что ключ больше не следует использовать или считать доверенным.
Используйте команду gpg --gen-revoke. Мы сохраним сертификат в файл revoke.asc с помощью флага --output.
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и нажавEnterна вопросIs this okay? (y/N). - Если у вашего ключа есть парольная фраза, GPG запросит ее для авторизации создания сертификата.
Вы увидите подтверждение того, что сертификат отзыва создан.
Используйте команду ls, чтобы убедиться, что оба новых файла созданы в вашем каталоге ~/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 для аннулирования пары ключей в случае их компрометации.



