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

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

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

GPG (также известный как GnuPG) является свободной реализацией стандарта OpenPGP и используется для шифрования информации с помощью различных алгоритмов (RSA, DSA, AES и других).

Установка GPG

GPG — популярное программное обеспечение. Его можно найти почти в любом репозитории дистрибутива. Если у вас его нет, установите его.

CentOS 7

$ sudo yum install gnupg

Debian/Ubuntu

$ sudo apt install gnupg

Fedora

# dnf install gnupg2

Arch

# pacman -S gnupg

Gentoo

# emerge --ask app-crypt/gnupg

Создание ключа для асиммеричного шифрования

Для шифрования и расшифровки файлов необходима пара ключей. Создать ключи можно с помощью команды --full-generate-key утилиты.

ivan@notebook:~$ gpg --full-generate-key

gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Выберите тип ключа:
   (1) RSA и RSA (по умолчанию)
   (2) DSA и Elgamal
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
Ваш выбор? 
длина ключей RSA может быть от 1024 до 4096.
Какой размер ключа Вам необходим? (3072) 4096
Запрошенный размер ключа - 4096 бит
Выберите срок действия ключа.
         0 = не ограничен
      <n>  = срок действия ключа - n дней
      <n>w = срок действия ключа - n недель
      <n>m = срок действия ключа - n месяцев
      <n>y = срок действия ключа - n лет
Срок действия ключа? (0) 0
Срок действия ключа не ограничен
Все верно? (y/N) y

GnuPG должен составить идентификатор пользователя для идентификации ключа.

Ваше полное имя: Ivan Petrov
Адрес электронной почты: ivan@petrov.com
Примечание: 
Вы выбрали следующий идентификатор пользователя:
    "Ivan Petrov <ivan@petrov.com>"

Сменить (N)Имя, (C)Примечание, (E)Адрес; (O)Принять/(Q)Выход? O
Необходимо получить много случайных чисел. Желательно, чтобы Вы
в процессе генерации выполняли какие-то другие действия (печать
на клавиатуре, движения мыши, обращения к дискам); это даст генератору
случайных чисел больше возможностей получить достаточное количество энтропии.
Необходимо получить много случайных чисел. Желательно, чтобы Вы
в процессе генерации выполняли какие-то другие действия (печать
на клавиатуре, движения мыши, обращения к дискам); это даст генератору
случайных чисел больше возможностей получить достаточное количество энтропии.
kjgpg: ключ DE06F81AB7D705B7 помечен как абсолютно доверенный
gpg: сертификат отзыва записан в '/home/ivan/.gnupg/openpgp-revocs.d/4FF3AFE373508EC250CD9CE7DE06F81AB7D705B7.rev'.
открытый и секретный ключи созданы и подписаны.

pub   rsa4096 2019-05-14 [SC]
      4FF3AFE373508EC250CD9CE7DE06F81AB7D705B7
uid                      Ivan Petrov <ivan@petrov.com>
sub   rsa4096 2019-05-14 [E]

Первое, что спросит GPG — это тип ключа. Если у вас нет конкретных требований, используйте значение по умолчанию.

Далее, необходимо указать длину ключа. Не рекомендуется использовать ключи длиной меньше 2048 бит, они крайне небезопасны. Лучше всего использовать значение 4096.

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

Затем укажите имя пользователя и адрес электронной почты. При необходимости можно указать комментарий.

После заполнения всех полей GPG попросит проверить указанную информацию и запросит пароль для шифрования приватного ключа.

Локальное шифрование файла

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

$ echo "test" > /tmp/test.txt

Попробуем зашифровать его с помощью GPG. Флаг -e сообщает GPG, что мы будете шифровать файл, а флаг -r указывает получателя.

$ gpg -e -r "Ivan Petrov" /tmp/test.txt

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

Локальное дешифрование файла

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

$ gpg -d /tmp/test.txt.gpg > test.txt.2

gpg: зашифровано 4096-битным ключом RSA с идентификатором 0D1E0A77476CD935, созданным 2019-05-14
      "Ivan Petrov <ivan@petrov.com>"

$ diff /tmp/test.txt test.txt.2

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

Отправка файла внешнему получателю

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

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

Импортируйте публичный ключ получателя в GPG:

$ gpg --import yourfriends.key

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

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

Для этого используйте опцию --export и опцию -a, которая означает, что ключ экспортируется в текстовом виде, пригодном для копирования-вставки в сообщение мессенджера или электронной почты.

$ gpg --export -a "Your Name" > your.key

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

$ gpg -e -u "Your Name" -r "Recipient's Name" /tmp/test.txt