👕

OpenPGP公開鍵をTシャツにして着る

2021/08/26に公開

QRコードにした公開鍵を着て歩けば会うひとごとにスキャンしてもらって公開鍵を配れると思い立ったのでした。

公開鍵をできるだけ小さくする

OpenPGP公開鍵には、Keyoxideのidentity proofとしてnotationを追加したり、web of trustの証明書など種々の情報が追加されます。QRコードに含められる情報量には限りがあるので、QRコードにする公開鍵の情報を最小限にします。gpg --exportコマンドに--export-options export-cleanを追加することで、手元の公開鍵は3.7 KiBから1.8 KiBに減らすことができました。

$ gpg --export F60960D80B224382CA8D831CB56C20316D6E8279 | wc -c
3837
$ gpg --export --export-options export-clean F60960D80B224382CA8D831CB56C20316D6E8279 | wc -c
1808

なお、同等の暗号強度を持つ鍵を比較すると、RSA暗号を利用するよりも楕円曲線暗号を利用する方が鍵のサイズを小さくできるようです。下記のようにして鍵対を生成して公開鍵のサイズを比較してみました。公開鍵のサイズはメールアドレスの長さなどでも変化します。Tシャツに印刷するために新しく鍵対を生成する場合には、楕円曲線暗号を利用することによって公開鍵のサイズを小さくしてよりスキャンしやすいQRコードにすると良いかもしれません。

$ gpg --quick-gen-key --batch --passphrase '' test1@example.com rsa
$ gpg --export --export-options export-clean <鍵ID> | wc -c
指定した暗号アリゴリズム 鍵長(ビット) 公開鍵のサイズ(バイト)
rsa 3072 890
ed25519 256 224

エキスポートした公開鍵をASCII文字に収める

QRコードにはバイナリデータも含められるようですが、スキャンした側での取り扱いを楽にするために、gpg --exportコマンドに--armorオプションを追加します。容量は2.4 KiBに増えました。

$ gpg --export --export-options export-clean --armor F60960D80B224382CA8D831CB56C20316D6E8279 
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQGNBF7y5CEBDADCBGI+RhNbXWjHOhIwBX9k1kxr6t/nTcec97vMNMxLYn3qxaWc
  :
qg6CjcRAxj6Va6xaCqbx38+d0QFy5Q11I4ecED67AEg=
=hf9J
-----END PGP PUBLIC KEY BLOCK-----

エキスポートした公開鍵をQRコードにする

上記のようにして得られた公開鍵を変換します。

$ gpg --export --export-options export-clean --armor F60960D80B224382CA8D831CB56C20316D6E8279 | qrencode -o pubkey.png

これをTシャツに印刷して、スキャン、インポートしてもらうことで、公開鍵を配布することができます (こんな細かいの確実にスキャンできるのかな?)

あ、紙の名刺に印刷するのもいいですね。

人間が読める形で鍵の指紋も載せると良さそうとのご意見をいただきました。たしかに!!

知人がこのようなTシャツを着て歩いていた場合

お手元の携帯電話でスキャンするとarmor形式の公開鍵を得られます。

得られた公開鍵をどうにかしてテキストファイルにすることで、お手元のOpenPGP鍵束にインポートできます。インポートしたら公開鍵サーバにある追加の証明書を取得しておきましょう。

$ gpg --import < pubkey.txt 
gpg: key B56C20316D6E8279: public key "zunda <zundan@gmail.com>" imported
gpg: Total number processed: 1

gpg:               imported: 1
$ gpg --recv-keys F60960D80B224382CA8D831CB56C20316D6E8279
gpg: key B56C20316D6E8279: "zunda <zundan@gmail.com>" 4 new signatures
gpg: Total number processed: 1
gpg:         new signatures: 4

openpgp4fpr

鍵の指紋を公開するURIが定義されているとのこと。上記の鍵の場合は、

openpgp4fpr:F60960D80B224382CA8D831CB56C20316D6E8279

となりそうです。これなら充分小さいQRコードになりますね。

$ echo openpgp4fpr:F60960D80B224382CA8D831CB56C20316D6E8279 | tr -d \\n | qrencode -o qr.png

Discussion