Введение
В предыдущем руководстве мы рассказывали о том, как сгенерировать и экспортировать пару ключей GPG, что довольно просто сделать с помощью утилиты gpg.
- 👭 Как генерировать ключи GPG на Linux
- 🔐 Как создать и экспортировать пару ключей ( открытый и закрытый) GPG в macOS
Экспорт открытых и особенно секретных ключей GPG – удобный способ их резервного копирования и хранения в безопасном месте, однако, если мы хотим быть предельно уверенными в том, что у нас есть надежный способ восстановить наши ключи в случае катастрофы, мы можем захотеть экспортировать их в удобочитаемом и пригодном для печати виде.
Именно это мы и научимся делать в данном руководстве.
Экспорт ключа с использованием опции “-armor”
Когда мы экспортируем ключ gpg, по умолчанию получается двоичный результат.
Это хорошо, если мы хотим сохранить ключ в файл, но он не может быть прочитан нами, людьми, и не может быть распечатан.
Чтобы решить эту проблему, мы можем вызвать gpg с опцией –armor. При использовании этой опции генерируется ASCII-армированный вывод, который легче читать и печатать.
Предположим, что мы хотим экспортировать наш секретный ключ в этом формате:
$ gpg --armor --export-secret-key --output secret.asc <keyid>
Приведенная выше команда создает файл, который можно открыть с помощью обычного текстового редактора, содержащий экспортированное содержимое между следующими строками:
-----BEGIN PGP PRIVATE KEY BLOCK----- -----END PGP PRIVATE KEY BLOCK-----
Содержимое файла можно легко распечатать и хранить в безопасном месте в качестве дополнительной меры, однако, если возникнет необходимость, восстановление ключа из распечатанной бумаги может оказаться довольно утомительным процессом.
Возможной альтернативой может стать генерация QR-кода из содержимого файла.
Давайте посмотрим, как это сделать.
Генерация QR-кода на основе экспортированного содержимого
Для генерации QR-кода на основе содержимого файла, содержащего экспортированный gpg броневывод, мы можем воспользоваться утилитой qrencode, которая доступна в репозиториях всех наиболее распространенных дистрибутивов Linux.
Утилита кодирует данные, переданные на вход, в QR-код и по умолчанию сохраняет результат в виде изображения PNG.
Давайте попробуем воспользоваться ею.
Запускаем:
$ qrencode -o secret.png < secret.asc
В приведенном выше примере мы вызвали qrencode с опцией -o (сокращение от –output), чтобы указать файл, в который нужно сохранить сгенерированное изображение, и использовали перенаправление оболочки, чтобы передать содержимое файла, который мы экспортировали с помощью gpg, в качестве входных данных приложению.
Однако, как только мы запускаем приведенную выше команду, мы получаем уведомление об ошибке:
Failed to encode the input data: Input data too large
Поскольку данные, содержащиеся в файле, слишком велики, qrencode не может сгенерировать код.
Как мы можем решить эту проблему?
Решение заключается в том, чтобы разделить экспортированный с помощью gpg файл armored на несколько файлов и создать отдельные QR-коды из каждого из них.
Для разделения файла мы можем использовать утилиту split, например:
$ split -C 1000 secret.asc secret.asc-
Выполнив приведенную выше команду, мы разбиваем файл secret.asc на файлы размером не более 1000 байт каждый.
Каждый файл получает имя, используя в качестве префикса второй аргумент, который мы указали, secret-asc-, и добавляя двухбуквенный суффикс по умолчанию.
В этом случае мы получаем следующий результат:
secret.asc-aa secret.asc-ab secret.asc-ac secret.asc-ad secret.asc-ae secret.asc-af secret.asc-ag secret.asc-ah secret.asc-ai secret.asc-aj secret.asc-ak secret.asc-al
Теперь, когда у нас есть содержимое экспортированного файла с броней в виде небольших фрагментов, мы можем легко просмотреть их и создать отдельные QR-коды:
$ for i in secret.asc-*; do qrencode -o "${i}.png" < "${i}"; done
Сгенерированные QR-коды могут быть легко считаны любым приложением для сканирования штрих-кодов на нашем смартфоне или, из интерфейса командной строки, с помощью утилиты zbarimg.
Чтобы восстановить исходное содержимое, строки, полученные в результате сканирования QR-кодов, необходимо объединить.
Например, используя zbarimg, мы можем выполнить:
$ for i in secret.asc-*.png; do zbarimg --quiet --raw "${i}"| head -c -1 >> reconstructed-key.asc; done
В приведенном выше примере мы перебираем QR-коды на изображениях “.png” и считываем каждый из них с помощью zbarimg. \
Мы вызываем утилиту, используя опцию –quiet, чтобы отключить статистические строки, и –raw, чтобы избежать дополнительной информации о типе символики.
Затем мы передали результат команды команде head -c -1: эта команда выведет все переданное содержимое, кроме последнего байта, который в данном случае является символом новой строки (в ASCII каждый символ хранится в одном байте).
Наконец, используя перенаправление оболочки, мы добавляем содержимое в файл reconstructed-key.asc, который мы можем использовать для импорта обратно нашего секретного ключа:
$ gpg –import reconstructed-key.asc
Извлечение только секретной информации с помощью paperkey
Выходные данные, получаемые при экспорте секретного ключа gpg, обычно содержат также информацию о связанном с ним открытом ключе, которая нам не нужна.
Утилита paperkey предназначена для извлечения из данных только секретной части информации и доступна в репозиториях наиболее распространенных дистрибутивов Linux.
Вот пример ее использования:
$ gpg --export-secret-key <key-id> | paperkey --output secret.txt
Обратите внимание, что в приведенном примере мы не бронировали данные, экспортированные с помощью gpg! Чтобы восстановить секретный ключ из результатов, сгенерированных paperkey, нам нужно иметь под рукой наш открытый ключ, но это не должно быть проблемой, поскольку мы обычно распространяем наш открытый ключ на серверах ключей, таких как https://keyserver.ubuntu.com/, например.
Предположим, что наш открытый ключ находится в файле public-key.gpg, мы должны выполнить команду:
$ paperkey --pubring mypublickey.gpg --secrets secret.txt | gpg --import
Приведенная выше команда возьмет часть данных секретного ключа, содержащуюся в файле secret.txt, в сочетании с открытым ключом и восстановит полный, оригинальный секретный ключ, который затем будет импортирован на лету с помощью gpg.
Заключение
В этом руководстве мы рассмотрели, как можно экспортировать секретный ключ GPG в формат, который можно распечатать на бумаге, в качестве дополнительного решения для резервного копирования.
Мы увидели, как выполнить эту операцию с помощью утилиты gpg и с помощью paperkey, инструмента, предназначенного для извлечения только части секретной информации из экспортированного содержимого.
Наконец, мы увидели, как сгенерировать несколько QR-кодов из экспортированного содержимого ключа.
см. также: