Photo by Christian Lendl
Шифрование

GPG шифрование

28.06.22
24.08.23

Сама по себе тема шифрования довольно объёмна и может занять целый курс университета. Попробуем кратко раскрыть тему в разрезе прикладного использования. Итак, gpg шифрование.

Что такое GPG?

GPG (GNU Privacy Guard, GnuPG) это программа для шифрования информации. Была разработана в качестве альтернативы не «свободной» PGP. Выпущена GPG под свободной лицензией и является полной альтернативой PGP. Использует пару ассиметричных ключей и непатентованные алгоритмы (AES, 3DES, CAST5, Blowfish и Twofish) шифрования.

Как это работает?

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

Симметричное шифрование с утилитой GPG

Основа pgp-технологии это асимметричное шифрование. Хотя, есть возможность шифрования файлов с помощью пароля (симметричное шифрование): gpg -c file.name, утилита запросит пароль:

После ввода пароля будет создан файл с расширением .gpg (исходный файл при этом удален не будет — останется в неизменном виде). Кроме того, будет осуществлено сжатие конечного файла (по умолчанию используется zlib, но можно поменять в настройках конфигурации на zip или bzip2).

Для расшифровки нужно набрать gpg file.name.gpg после ввода пароля файл будет расшифрован и записан без расширения .gpg

Можно использовать ключ -d для расшифровки, но тогда надо перенаправлять вывод в файл: gpg -d file.name.gpg > file.name или использовать опцию --output

Асимметричное шифрование

Чтобы начать работу, необходимо сгенерировать пару ключей для ассиметричного шифрования:
gpg --gen-key или gpg --full-generate-key для полного контроля над процессом. Программа запросит тип ключа (RSA или DSA — рекомендация: RSA), длину ключа, срок действия (если 0, то бессрочно), ваше имя и E-mail. Далее, gpg запросит задать пароль на ключ, но если вы будете использовать ключи в автоматическом режиме — оставьте пустыми пароли:

или же задайте пароль для большей защиты. В любом случае, обеспечьте сохранность приватного ключа. Посмотреть доступные ключи можно командой: gpg --list-keys или --list-secret-keys, для просмотра приватных ключей

Шифрование

Для шифрования файлов можно использовать gpg -e -r uid file.for.encrypt, но лучше использовать совместно с утилитой tar -cf - file.or.directory | gpg -e -r uid -o file.tar.gpg, где uid это ваше имя (или имя импортированного ключа), которое вы использовали при генерации ключа. Если вы не устанавливали пароль, то процесс можно автоматизировать, например, для создания бэкапа и отправки его на не слишком доверительный файл-сервер для хранения. Расшифровать такой архив без закрытого ключа не получится за обозримое будущее. Для дешифровки нужно использовать команду: gpg filename.gpg или gpg -d filename.tar.gpg | tar -x, если использовали tar при шифровании (опция -d обязательна).

Экспорт и импорт ключей

Если вы обмениваетесь файлами или сообщениями с кем-либо, то для сохранения приватности есть смысл обменяться публичными ключами. Для экспорта своего публичного ключа надо воспользоваться командой: gpg -a -o filename.asc --export uid, где:

  • -a (—armor) экспорт в ASCII формате, для отправки по E-mail, например (иначе будет сформирован бинарный файл);
  • -o (—output) вывод в файл, иначе в STDOUT;
  • —export — собственно, опция экспорта;
  • uid — идентификатор ключа, если не задать, то будут экспортированы ВСЕ ключи.

Порядок опций важен! Именно такой надо использовать. Если поместить —export в начало, то выведет в STDOUT в бинарном формате.

Для импорта ключа используйте: gpg --import filename.asc Далее, неплохо задать уровень доверия к ключу: gpg --edit-key далее запустится интерактивная оболочка. Где можно делать разные манипуляции с ключом (команда help в помощь), нас интересует команда trust Выход по команде quit

Подписи

Кроме шифрования gpg умеет подписывать файлы как совместно с шифрованием, так и без него. Это может быть полезно при передаче разных файлов с уверенностью что никто не внёс никакие изменения, например, не добавил свой кусок кода. При верификации изменённого файла подпись не сойдется. Команды подписи: gpg --sign file.name