GPGで公開鍵暗号を試す

公開鍵暗号を使えば,パスワードを相手に教える必要なしに,暗号化したデータを安全に相手の元へ送ることができます. ここではパスワードを使う共通鍵暗号とこの公開鍵暗号の違いを紹介し,GPGと呼ばれるツールを利用して実際に暗号化したデータを相手に送り届けるまでを紹介します.

共通鍵暗号方式

鍵(パスワード)で施錠し,同じ鍵で解錠する. これが共通鍵と呼ばれる暗号方式です.
1. お互いに同じ鍵(パスワード)を持っている必要がある.
2. 送り主はこの鍵を使ってデータを暗号化した後,送信する.
3. 受け手は同じ鍵を使って暗号化されたデータを復号する.
送り主と受け手は同じパスワードを知っている必要がありますが,お互いが直接会えない場合,パスワードを安全に伝える手段は無いに等しいでしょう. 手紙(メール)に書いて送るにも,途中で盗み見られるかも知れません("盗聴"と呼ばれるリスクです).
4. 盗聴のリスクがあるため,鍵を遠くへ届けることは危険.
鍵を使って暗号化するという点は共通鍵/公開鍵どちらも同じです. しかし,公開鍵暗号方式では鍵自体に面白い仕掛けが仕込まれています.

公開鍵暗号方式

公開鍵暗号では鍵を2つつくります. 一方の鍵で暗号化した場合,もう一方の鍵でないと復号化できない,そんな鍵のペアをつくります. 同じ鍵で復号化できないという点がミソです.
暗号化と復号化にはそれぞれ互い違いの鍵を必要とする.
一方の鍵を秘密鍵,もう一方の鍵を公開鍵と呼びます.
Secret Key: 秘密鍵
Public Key: 公開鍵
公開鍵暗号の手順はまず受け手が鍵ペアを生成するところから始まります.
1. 受け手が鍵ペアを生成する.
2. 送り主が受け手の公開鍵を入手する.
3. 送り主は受け手の公開鍵で暗号化したデータを送る.
4. 受け手は受信した暗号データを秘密鍵で復号する.
公開鍵暗号の場合,公開鍵を盗聴されても暗号を復号化出来ないため安全です(鍵を公開している時点で盗聴する意味も無いのですが). また,片方の鍵からもう片方の鍵を生成することは出来ません(この背景には数学的裏付けがあります). たとえ公開鍵を入手しても,そこからペアである秘密鍵を推測(生成)することは出来ないのです. 秘密鍵さえ大切に保管しておけば安全が保たれる暗号方式. 鍵を公開してしまうという大胆なアイディアの裏には,緻密に詰められた数学的根拠があるのです.
公開鍵暗号は共通鍵暗号に比べ安全に鍵のやりとりが出来ますが,いくつかのリスクもあります. 例えば,悪意ある第三者が受け手になりすまして鍵ペアを生成する場合も考えられます. 送り主は受け手の公開鍵を入手しますが,この公開鍵はなりすまし犯のつくった物になります. これでは大切なデータを暗号化したところで,望まぬ相手にデータを解読(復号化)されてしまうことになります. 被害に遭わないためには入手した公開鍵の正当性(本人のものかどうか)を確かめることが必要です. 各鍵が持つ"指紋"を調べることで正当性の確認を行えます.

Fingerprint 指紋

入手した公開鍵が本当にその人の鍵なのかを調べる時に使います. もし,入手した公開鍵の"指紋"が相手の示す"指紋"と一致しない場合,第三者が相手になりすまして公開鍵を送りつけた可能性があります. 必ず"指紋"を調べ,正しい相手とやり取りするようにしましょう. GPGを使えば"指紋"の検証も簡単です(方法は後述). ちなみに,"指紋"と呼んでいるものの正体は40桁の数値(16進数)で,"ハッシュ値"とも呼ばれます.
受け手になりすまして公開鍵を生成することは可能ですが,"指紋"まで似せることは不可能です. もし,同じ"指紋"を持つ公開鍵が生成されたとしたら,それは秘密鍵の漏洩を疑うべきです. これ以上の悪用を防ぐため,後述する手順に従って速やかに鍵の失効を行いましょう.
さて,公開鍵の"指紋"を調べ,それが一致し,鍵の正当性が確認できたとします. 信頼出来る鍵を入手したら,"この鍵は信頼出来る鍵ですよ"という印を鍵に残すと良いでしょう. 鍵に署名をするのです. 信頼出来る鍵に署名をし合うことで,信用の輪(Web of Trust)が広がります. ちなみに,署名の無い鍵で暗号化をすると,その旨の警告が表示されます. 利便性の観点からも,信頼出来る鍵には署名をしましょう.

GNU Privacy Guard (GPG)

GPGというツールを使うことで,この公開鍵暗号を手軽に利用することが出来ます. GPGはmacOS,Windows,Linuxに対応しています. ダウンロードページ下部から,自分のOSに合ったGPGをダウンロードしましょう.
GnuPG - Download Homebrewによるインストールも可能です(Formula情報).
brew install gnupg
私はmacOSのGPGToolsをインストールしています. こちらはGUI環境も整っており,Mailアプリのプラグインも含まれます. GUIソフト(GPG Keychainなど)は先に紹介した公開鍵暗号の仕組みを理解した方ならば比較的簡単に扱うことが出来ると思います. 今回はコマンドラインで鍵の生成から暗号化,復号化までを行ってみたいと思います. GPGがインストール出来れば準備は完了です. ターミナルを開きましょう.

鍵ペアの生成

まずは受け手が鍵ペアを生成します.
gpg --gen-key
上のコマンドを実行するといくつかの質問を尋ねられます. いわゆる鍵の初期設定というやつです. デフォルト(default)のままで良い場合は何も入力せずにEnterを押しましょう. その他を選択したい場合は対応する数値や文字を入力してからEnterしましょう. まずは鍵の種類から.
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? _
デフォルトの"(1) RSA and RSA"で問題ありません.
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) _
鍵長は長いほど(数値が大きいほど)安全性が増します. 今回はデフォルトの2048bitで.
Please specify how long the key should be valid.
         0 = key does not expire
        = key expires in n days
      w = key expires in n weeks
      m = key expires in n months
      y = key expires in n years
Key is valid for? (0) _
鍵の有効期限を設定します. デフォルトは無期限です. 失効は好きなタイミングで行えるのでシビアな用途で無ければデフォルトでも十分問題ありません.
Key does not expire at all
Is this correct? (y/N) _
有効期限は無期限で良いか尋ねられるのでYesの頭文字yを入力してEnterを押します. 以上が鍵の設定です. ここからは利用者情報を入力して行きます.
GnuPG needs to construct a user ID to identify your key.

Real name: _
Email address: _
Comment: _
自分の名前(日本語の場合はローマ字でどうぞ),メールアドレス,コメントを順に入力します. メールアドレスは相手(送り主)も知っているものを入力しましょう. コメントは空欄で構いません. 入力後は入力内容の確認が表示されるので良く確認しましょう.
You selected this USER-ID:
    "Real name (Comment) <Email address>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? _
以上の内容でOkayならば頭文字のOを入力,変更したい項目があればその頭文字を入力してEnterしましょう. 最後に秘密鍵のパスフレーズの入力を促されます.
You need a Passphrase to protect your secret key.
_
このパスフレーズは復号化時や鍵を失効する際などに必要となります. 忘れないようにしましょう. 推奨は8桁以上のパスフレーズです(英数字に加え記号や空白も使えます). パスフレーズを確認も含めて2回入力すると鍵生成が始まります.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
鍵の生成中(上の文が表示されている時),マウスやキーボードをランダムに触ることで乱数の複雑さが増します. 以上で鍵ペアの生成は終了です.
gpg: key 3D40AB90 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   4  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 4u
gpg: depth: 1  valid:   1  signed:   0  trust: 0-, 1q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at YYYY-MM-DD
pub   2048R/3D40AB90 YYYY-MM-DD
      Key fingerprint = A4E5 7F08 1A9C 1B69 182B  1001 FB10 D979 3D40 AB90
uid       [ultimate] Real name (Comment) <Email address>
sub   2048R/8DA682C4 YYYY-MM-DD
この出力を少し解説. まずは下から4行目.
pub 2048R/3D40AB90 YYYY-MM-DD
太字になっている8桁の数値(16進数)が鍵IDです. 上の場合,いま生成した鍵は"3D40AB90"です. 最下行にも似たような表示がありますが,こちらはサブ鍵の物です. サブ鍵について知りたい方はこちらのページ(en)を読むと良いでしょう. サブ鍵について,普段使う上では気にする必要はありません.
Key fingerprint = A4E5 7F08 1A9C 1B69 182B 1001 FB10 D979 3D40 AB90
下から3行目に"Key fingerprint(鍵の指紋)"という表示があります. そう,"指紋"です. この鍵の正当性を確認出来るよう,相手(送り主)にこの"指紋"を伝えておきましょう(自分の連絡先や名刺などに記載しておくと良いかもしれません). ちなみに"指紋"の下8桁が鍵IDになります.

失効証明書の生成

何らかの理由により秘密鍵が漏れたり,または鍵のパスフレーズを忘れてしまった場合など,この失効証明書を使うことで鍵が使えないことを示すことが出来ます.
gpg -o ファイル名 --gen-revoke 鍵ID
"ファイル名"の部分は適当に置き換えてください. 例えば"realname.rev"などが良いでしょう. "鍵ID"は失効証明書を生成したい鍵のID(8桁の数値),もしくは鍵ペア生成時に登録したメールアドレスです. 失効証明書を生成するか否か尋ねられるのでyを入力してEnterします.
sec  2048R/3D40AB90 YYYY-MM-DD Real name (Comment) <Email address>

Create a revocation certificate for this key? (y/N) _
すると失効する理由を尋ねられます.
Please select the reason for the revocation:         
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
(Probably you want to select 1 here)
Your decision?  _
今回は鍵が漏れた場合を想定して1を選択しましょう.
Enter an optional description; end it with an empty line:
> _
ここで追加の説明を入力できます. ここは何も入力せずEnterで大丈夫です.
Reason for revocation: Key has been compromised
(No description given)
Is this okay? (y/N) _
入力内容の確認が表示されます. よろしければyです.
You need a passphrase to unlock the secret key for
user: "Real name (Comment) <Email address>"
2048-bit RSA key, ID 3D40AB90, created YYYY-MM-DD
ここでこの秘密鍵のパスフレーズを入力します.
ASCII armored output forced.
Revocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!
上の表示で失効証明書の生成は完了です. ファイル名(realname.revなど)として生成された失効証明書はUSBドライブやCD/DVD,あるいはフロッピーディスクなどに入れ,安全に保管してください. 生成したままPCの中に入れておくことはおすすめしません.
何らかの事情により鍵を失効する場合は次のコマンドで失効証明書をインポートします.
gpg --import ファイル名
"ファイル名"が失効証明書です. これで対応する鍵が失効されます. もし鍵を鍵サーバーにアップロードしている場合は,再度失効した鍵をアップロードすることで鍵の状態を更新することが出来ます.

公開鍵の出力/アップロード

公開鍵はファイルまたは文字列として相手に送信するか,鍵サーバーにアップロードして相手に探してもらうかして共有します. まずはファイル/文字列として出力する方法から紹介します.
gpg -o ファイル名 -a --export 鍵ID
これで公開鍵がファイルとして出力されます. このファイルはテキストエディタで開くことが出来,中に書かれた文字列をメールの内容として相手に送ることも出来ます.
鍵サーバーへアップロードする方法は次の通りです.
gpg --keyserver 鍵サーバーURI --send-keys 鍵ID
"鍵サーバーURI"には適切なURIを入力します. 例えば"pgp.mit.edu"が良いでしょう.

公開鍵の入手/インポート/署名

ファイルとして受け取った場合は次のコマンドで公開鍵を自分の鍵リストへ追加します.
gpg --import 鍵ファイル名
次にような表示がインポート完了の合図です.
gpg: key XXXXXXXX: public key "Real name (Comment) <Email address>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   3  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 3u
gpg: next trustdb check due at YYYY-MM-DD

鍵サーバーから検索する場合は次のコマンドを使います.
gpg --keyserver 鍵サーバーURI --search-keys 検索文字列
"検索文字列"は鍵IDでもメールアドレスでも相手の本名でも(鍵ペアを生成した時に登録した内容ならば)大丈夫です. 該当する検索結果が複数ある場合,次のような表示になります.
gpg: searching for "検索文字列" from hkp server 鍵サーバーURI
(1) Real name 1 (Comment 1) <Email address 1>
   2048 bit RSA key XXXXXXXX, created: YYYY-MM-DD
(2) Real name 2 (Comment 2) <Email address 2>
   2048 bit RSA key YYYYYYYY, created: YYYY-MM-DD
Keys 1-2 of 2 for "検索文字列".  Enter number(s), N)ext, or Q)uit > _
該当する方の番号を入力してEnterすると,対応する鍵がインポートされます.
gpg --list-keys
上のコマンドでインポートした(自分が所有する公開鍵の)一覧を表示します.
gpg --fingerprint
また,上のコマンドで各鍵の"指紋"を表示することが出来ます. 鍵の正当性を確認しましょう. "指紋"が相手の示す"指紋"と一致した場合は次のコマンドで相手の公開鍵に署名をしましょう.
gpg --sign-key 鍵ID
署名を行うための処理に入ります.
pub  2048R/XXXXXXXX  created: YYYY-MM-DD  expires: never       usage: SC  
                     trust: unknown       validity: unknown
sub  2048R/YYYYYYYY  created: YYYY-MM-DD  expires: never       usage: E   
[ unknown] (1). Real name 1 (Comment 1) <Email address 1>
[ unknown] (2)  Real name 2 (Comment 2) <Email address 2>

Really sign all user IDs? (y/N) _
ユーザーIDが複数ある場合には全てに署名をするか否か,上のように尋ねられます. よろしければyです. するとGPGインタプリタが立ち上がります.
gpg> _
ここに"trust"と入力しEnterします.
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? _
すると,この鍵をどの程度信用するか選択する画面になります. 1-5まであり,数字が大きいほど信用度は高くなります. 確実に信用出来る場合は5にしましょう.
Do you really want to set this key to ultimate trust? (y/N) _
最後の確認が表示されますので,よろしければyします.
pub  2048R/XXXXXXXX  created: YYYY-MM-DD  expires: never       usage: SC  
                     trust: ultimate      validity: unknown
sub  2048R/YYYYYYYY  created: YYYY-MM-DD  expires: never       usage: E   
[ unknown] (1). Real name 1 (Comment 1) <Email address 1>
[ unknown] (2)  Real name 2 (Comment 2) <Email address 2>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg> _
上から2行目,"trust"欄がultimateに変わり,無事署名が終わります. 最後に"quit"と入力してEnterすれば元のターミナルへ戻れます.

暗号化

次のコマンドでファイルを暗号化します.
gpg --encrypt -r 鍵ID -a ファイル名
-rオプションで受け手(Recipient)の公開鍵を指定. -aオプションでASCII出力. 最後に暗号化したいファイル名(入力ファイル)を指定します.

復号化

受け取った暗号ファイルは次のコマンドで復号化します.
gpg --decrypt 暗号ファイル名
秘密鍵のパスフレーズを入力すると復号化された内容が表示されます.
gpg --decrypt -o 出力ファイル名 暗号ファイル名
-oオプションを加えることで復号結果をファイル出力できます.
混乱を避けるため伏せていましたが,GPG(Gnu Privacy Guard)はPGP(Pretty Good Privacy)と呼ばれるソフトウェアの代替フリーソフトウェアになります. つまり公開鍵を署名し合うことで"信頼の輪"を広げる仕組みのオリジナルはPGPだと言うことです. GNUプロジェクトの一環としてPGPの別実装がつくられ,それが現存するGPGとなったのです. 公開鍵暗号の仕組みはPGPの他にもSSL/TLSやS/MIMEといった技術にも利用されています. 前者はインターネットの暗号化通信技術,後者はメールの暗号化通信技術になります. 各技術で細かな違いはあるものの,コアとなる公開鍵の仕組みはどれも同じです. 公開鍵暗号はインターネット上のプライバシーを守る上で重要な仕組みのひとつなのです.

参考リンク

8611129642812544378 http://www.storange.jp/2016/12/gpg.html http://www.storange.jp/2016/12/gpg.html GPGで公開鍵暗号を試す 2016-12-27T21:03:00+09:00 http://www.storange.jp/2016/12/gpg.html Hideyuki Tabata 200 200 72 72