公開鍵暗号と署名の検証

14.7.3. 公開鍵暗号と署名の検証

ここでは、コマンドラインでの暗号化・復号・電子署名の作成と検証方法を紹介します。

複数人のグループで体験できると効果的です。

鍵ペアの生成 #

暗号化に必要となる、自分の公開鍵、秘密鍵のペアを生成します。 受信者が各自で作成し、そのうちの公開鍵を配布します。

授業の演習では ITC-LMS 等で共有することが多いでしょう。 実用では、意図しない人が公開鍵を入手するかもしれませんが、その点は問題ありません。

ターミナルを起動して、gpg --gen-keyと入力します。

gpg --gen-key

指示に従って、必要な項目を入力し、鍵を生成します。 名前や電子メールアドレスの入力では、入力後にエンター (enter or return) キーを押します。 公開鍵と本人を結びつけるために、正しい情報を入力してください。

  • Change (N)ame, (E)mail, or (O)key/(Q)uit? という質問は、タイプミスがある場合は再入力できるようにするための質問です。
    問題なければ OK を選ぶために O を入力します
  • 鍵の種類を聞かれたら、RSA を選んでください。
  • 途中で、入力を求められるパスフレーズとは、秘密鍵を守るパスワードのようなものです。
    スペースを含む事も可能で長さも事実上制限がありません。

暗号的に安全な乱数を作るための計算機のエントロピーが十分でないと、なかなか終了しません。ウェブを見たり、キーボード入力をすると良いようです。

公開鍵の共有 #

相手に暗号化した電子メールを送るには、相手の公開鍵を持っている必要があります。 逆の立場で、受信者は公開鍵を送信者に共有しておく必要があります。

まずは作成した鍵ペアから公開鍵をファイルに保存します name-pub.txt は出力するファイル名です。授業では本名やIDなどにすると良いでしょう。 同様に email@address は自分のメールアドレス (鍵ペア作成時に入力したもの) を指定します。

gpg -a -o name-pub.txt --export email@address
この操作は、成功したら無言です。

作成した鍵を電子メールの添付等で受け渡します。

公開鍵のファイルを受け取ったら、以下のコマンドで登録します。filename.txt は受け取ったファイルのパスです。 ファインダで見つけて、ターミナルにドラッグアンドドロップすると入力が簡単です。

gpg --import filename.txt

これまでに登録した公開鍵一覧を見るには、以下のコマンドを使います。

gpg --list-keys
/home01/0123456789/.gnupg/pubring.gpg
-------------------------------------
pub 2048R/E22118CB 2012-03-28
uid Taro TODAI <0123456789@mail.ecc.u-tokyo.ac.jp> sub 2048R/B2DF3841 2012-03-28
pub 2048R/5BF04BC3 2012-03-28
uid Hanako TODAI <0987654321@mail.ecc.u-tokyo.ac.jp> sub 2048R/30BB9849 2012-03-28

この表示の場合、東大太郎さんは、自分の公開鍵と東大花子さんの公開鍵を持っていることがわかります。

登録に成功したら引き続き、鍵を「信頼する」手続きをします。

gpg --lsign-key (友達のメールアドレス)
(中略)
本当に全ユーザー ID に署名しますか? (y/N)  y 

署名は、書き出し不可に設定されます。
(中略)
本当に署名しますか? (y/N)  y 

次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります: (自分のメールアドレス)
(自分の秘密鍵のパスフレーズを聞かれるのでタイプする)

これをするまでは、登録した公開鍵は偽物かもしれない、と疑った状態になります。

暗号化と復号 #

暗号化 #

暗号化は、gpg -r emailaddress -ea filename というコマンドを使います。

たとえば、東大花子さん (0987654321@g.ecc.u-tokyo.ac.jp) の公開鍵を持っているユーザが、花子さんに secret-text.txt というファイルの内容を暗号化して送りたいとします。

ターミナルで以下のように入力します

gpg -r 0987654321@g.ecc.u-tokyo.ac.jp -ea secret-text.txt

が暗号化された、secret-text.txt.asc というファイルが生成されます。

cat secret-text.txt.asc
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.11 (Darwin)
hQEMAxeiRd2VRjwUAQf+OgHtYK3ugYESsqAz+CFOHXlTkLVRHFYb5IrQk7mSikwU
vwiioTB0QP8FPYJ+IBPObcsDJKEBRzcDy2DyJvoptY6M1DpfYbSmHLWV+Uf50Ujc
(中略)
OkQbIFTDp9FooRpilwztjTzvXlezz2M7AXRf33qD5Dup4vwN29OZA0gv81Dw2yh1
=buFn
-----END PGP MESSAGE-----

このファイルを送信します。

復号 #

この暗号化されたファイルを受け取った花子さんは、recieved-text.txt.asc というファイルに保存したとします。 これを復号する手順は、共通鍵暗号の復号と共通です。

gpg -d recieved-text.txt.asc

秘密鍵を使うのでパスフレーズをタイプするよう要求されるかもしれません。

電子署名 #

署名の付加 #

電子署名を用いて、文章を作成したのが本人かどうか、また、文章が第三者によって改竄されていないかを確認してみましょう。

ファイルに署名を追加するには gpg --clearsign コマンドを使います。 important-text.txt に電子署名を加えるなら以下のコマンドです。

gpg --clearsign important-text.txt

秘密鍵を使うのでパスフレーズをタイプするよう要求されるかもしれません。

正しくパスフレーズが入力されると、電子署名を加えた important-text.txt.asc というファイルが生成されます。 内容は、

cat important-text.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

ここに本文が入ります。
-----BEGIN PGP SIGNATURE-----

iQEcBAEBAgAGBQJPeY+/AAoJEBeiRd2VRjwUDPAH/3pmp5ILFlwubshrssXQQLJA
(中略)
t4yhcH38NFL58wDCZk5rAYvWja+9XeN1T1ORSzfgXCiYI+CuNvAqMep/NtTOzpk=
=adHk
-----END PGP SIGNATURE-----
のようになっています。

ここではわかりやすさのために、暗号化を行わず署名のみを行いました。暗号化と署名を同時に行う場合は gpg -r 0987654321@g.ecc.u-tokyo.ac.jp -eas secret-text.txt のように暗号化のコマンドに s オプションを追加します。

署名の検証 #

この内容を受け取ったとき、電子署名の正当性は次のように確認できます。

gpg --verify important-text.txt.asc
gpg: 月 4/ 2 20:38:39 2012 JSTにRSA鍵ID 95463C14で施された署名
gpg: "Taro TODAI <0123456789@g.ecc.u-tokyo.ac.jp>" からの正しい署名

検証に失敗した場合は gpg: BAD signature from .. のように出ます。本文が改竄されているか、署名が不正であることを意味します。

トラブル対応 #

  • 秘密鍵のパスフレーズを忘れてしまった
    • 仕方がないので、消して再度作成しましょう
    • 削除するには以下の両方の手順が必要です
      gpg --delete-secret-key 自分のメールアドレス
      gpg --delete-key 自分のメールアドレス
  • 友達の公開鍵を登録できたことの確認したい
    • gpg --list-keys として鍵一覧を表示します。(自分の名前とともに)友人の名前が表示されれば成功です。
  • 鍵の登録で何もメッセージが表示が表示されない
    • gpg --import filename とした際に、ファイルの中に未知の鍵がない場合に起こります。たとえば、
      • ファイル名の指定が誤っている(平文など)
      • 自分の公開鍵の書かれたファイルを指定した
      • すでに正常に登録した鍵をもう一度登録しようとした
  • 暗号化の際に「この鍵が本当に本人のものである、という兆候がありません」と表示される
    • 「偽の公開鍵」対策で、公開鍵を簡単には信用しない設定になっています。
    • gpg --lsign-key を正しく行っていれば、信頼されます。
  • 暗号化の際に「公開鍵が見つからない」旨のエラーがでる。
    • 受信者の公開鍵を入手できていない
    • gpg --import の手続きに失敗している
    • 受信者の電子メールアドレスが、公開鍵に登録されたものと異なる、など
  • 暗号化の際に「himitsu.txt が見つからない」旨のエラー
    • ファイル名の指定が誤っているので、cat himitsu.txt で中身が表示されることをまず確認しましょう。
  • その他よく分からないエラー
    • iMac端末を再起動して、あらためてログインしてから試すとうまくゆくことがあるかも (?)
共通鍵暗号の体験 公開鍵暗号と署名の検証 モデル化とグラフ