GPGキーを紙にバックアップする方法
GPG(Gnu Privacy Guard)秘密鍵の信頼できるバックアップを持つことは選択肢ではありません。この鍵は私たちのアイデンティティを表しており、これを失うことは潜在的に災害を引き起こす可能性があります。gpgを使えば、私たちの鍵やサブキーのバックアップを作成するのは非常に簡単なことです。その結果として得られるファイルは、一つまたは複数のデバイスに簡単にバックアップできます。しかし、USBドライブやハードディスクなどの電子デバイスは故障する傾向があり、通常は最も不適切なタイミングで故障します。したがって、極端な手段として私たちの鍵を紙に印刷することを検討するかもしれません。
このチュートリアルでは、GPG秘密鍵を紙に印刷しやすい形式でエクスポートする方法と、オプションとしてその内容からQRコードを生成する方法を説明します。
このチュートリアルでは、あなたは学びます:
- GPG秘密鍵を印刷可能な形式でエクスポートする方法
- ペーパーキーを使用して秘密鍵から秘密情報を抽出する方法
- エクスポートされたキーからQRコードを生成する方法
紹介
前回のチュートリアルでは、GPGキーペアを生成し、エクスポートする方法について話しました。これはgpgユーティリティを使用して非常に簡単に行うことができる操作です。公開鍵と特に秘密鍵をエクスポートすることは、バックアップとして便利で、安全な場所に保存するための方法です。ただし、災害が発生した際に鍵を確実に復元するための信頼できる方法を持ちたい場合は、人間が読みやすく印刷可能な形式でエクスポートすることを検討するかもしれません。これが、このチュートリアルで学ぶことです。
「–armor」オプションを使用してキーをエクスポートする
GPGキーをエクスポートすると、デフォルトではバイナリ出力が生成されます。これはキーをファイルに保存する場合には問題ありませんが、人間には読み取ることができず、印刷することもできません。この問題を解決するために、--armorオプションを使ってgpgを呼び出すことができます。このオプションを使用すると、読みやすく印刷しやすいASCIIアーマード出力が生成されます。もしこの形式で秘密鍵をエクスポートしたい場合、次のように実行します:
gpg --armor --export-secret-key --output secret.asc <keyid>上記のコマンドは、次の行の間にエクスポートされた内容を含む、一般的なテキストエディタで開くことができるファイルを生成します。
-----BEGIN PGP PRIVATE KEY BLOCK-----
-----END PGP PRIVATE KEY BLOCK-----コンテンツは簡単に印刷でき、安全な場所に保管することができますが、必要に応じて印刷した紙からキーを復元するのはかなり手間がかかるプロセスになるかもしれません。代わりの方法として、ファイルの内容からQRコードを生成することが考えられます。それをどうやって行うか見てみましょう。
エクスポートされたコンテンツからQRコードを生成する
gpgによってエクスポートされたアーマード出力を含むファイルの内容に基づいてQRコードを生成するには、すべての一般的なLinuxディストリビューションのリポジトリにあるqrencodeユーティリティを使用できます。このユーティリティは、入力として渡されたデータをQRコードにエンコードし、デフォルトでは結果をPNG画像として保存します。それを使ってみましょう。実行します:
qrencode -o secret.png < secret.asc上記の例では、生成された画像を保存するファイルを指定するために -o オプション(--output の短縮形)を使って qrencode を呼び出し、gpg でエクスポートしたファイルの内容をアプリケーションへの入力として渡すためにシェルリダイレクションを使用しました。しかし、上記のコマンドを実行するとすぐに、エラー の通知を受けます:
Failed to encode the input data: Input data too largeファイルに含まれているデータが大きすぎるため、qrencodeがコードの生成に失敗しています。この問題をどのように解決できますか?解決策は、gpgでエクスポートされたアーマード出力を複数のファイルに分割し、それぞれのファイルから別々の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}.avif" < "${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」画像をループして、各QRコードをzbarimgで読み取ります。統計行を無効にするために--quietオプションを使用してユーティリティを呼び出し、追加のシンボルタイプ情報を避けるために--rawを使用します。その後、コマンドの結果をhead -c -1コマンドにパイプします。このコマンドが行うのは、渡された内容のすべてを印刷することですが、最後のバイト(この場合は改行文字、ASCIIでは各文字が1バイトで格納されます)を除外します。最後に、シェルリダイレクションを使用して、内容をreconstructed-key.ascファイルに追加し、そこから秘密鍵を再インポートできるようにします。
gpg --import reconstructed-key.ascペーパーキーを使用して秘密情報のみを抽出する
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コードを生成する方法を見ました。
