Public Key Encription

公開鍵暗号では,個人ごとに,公開鍵と秘密鍵のペアを持ちます.秘密鍵を秘密に保ち,公開鍵を関係者に配布します.

授業や,共通演習のGPGによる公開鍵暗号と署名/目的のページ前半 (操作以外のスライド) で概念をまず確認してください.

典型的な公開鍵暗号の使い方では,以下の準備をします.

  • 各自が,秘密鍵と公開鍵のペアを作成する
  • 関係者が,お互いの公開鍵を持っておく

まずは,この準備をした後,暗号と復号や,署名の検証を演習しましょう.

Generate Key Pair

まずは,鍵ペアを作成します.右のイメージイラストでは,錠前が公開鍵,いわゆる鍵が秘密鍵の意図です.公開鍵は様々な人に配る(悪人が知っても良い)もので,秘密鍵は秘密に保ちます.ディスクに保存する際にも,パスフレーズを用いて暗号化して保存します.

作成には,gpg --gen-key コマンドを使います.

名前や電子メールアドレスの入力では,入力後にエンター (enter or return) キーを押します. 公開鍵と本人を結びつけるために,正しい情報を入力してください.

途中の

Change (N)ame, (E)mail, or (O)key/(Q)uit?

のような表記は,4つの選択肢があるので,n, e, o, q のどれか (大文字小文字は問わない) をタイプして選択してほしいという意味です.

共通鍵の場合同と様に,gpg --pinentry-mode loopback --gen-key と必要に応じてオプションを追加してください.

Export

鍵を作成した段階では,秘密鍵と公開鍵のペアは隠されています.公開鍵を共有するために,公開鍵をファイルに書き出して,配布します.gpg -a --export というコマンドを使います.

$ gpg -a --export emailaddress > studentid-pub.txt 

$ はプロンプトの意図で,gpg からタイプしてください(以下も同じ).emailaddress は鍵ペア作成時に登録した電子メールアドレス,studentidの部分は各自の学生証番号で置き換えてください.
書き出したファイルを,UTOL の課題「公開鍵暗号置き場」にアップロードしましょう.

初回のexport時のみ,emailaddress を省略可能です.

エラーが出なければ成功です.Finder などで,出力されたファイルを確認しましょう.

Import

UTOL の課題「公開鍵暗号置き場」から,友達の公開鍵をダウンロードします.課題一覧の画面で該当課題の右端の縦の3点 (⋮) をクリックしてメニューを開き「所属グループの提出物確認」に進みます.

公開鍵が書かれたファイルから,その鍵を登録するためには,gpg --import コマンドを用います.

$ gpg --import filename.txt 

filename.txt はダウンロードしたファイル名で置き換えてください.ファインダで見つけてドラッグアンドロップすると簡単です.

公開鍵は, import するたびに増えてゆきます

その後,登録した鍵を「信頼する」手続きをします.

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

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

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

Encrypt

公開鍵暗号の場合は,復号できるのは秘密鍵を持つ人だけです.つまり,(1) 暗号化前に送付したい人(=受信者)の公開鍵をあらかじめ入手し (2) その人を指定して暗号化する,という手順となります.

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

gpg -r emailaddress -ea himitsu.txt 

emailaddress は受信者のメールアドレスで置き換えてください. コマンドが成功すれば(エラーが出なければ),himitsu.txt.asc というファイルができているので,catコマンドで確認してください (確認手順は共通鍵暗号の時と同じです).

静止画

Decrypt

復号はgpg -d コマンドです.手順は共通鍵暗号の復号 のときとコマンドは共通です.

gpg -d himitsu-xxxx.txt.asc

暗号化の際に,受信者として自分を指定した場合は自分で復号できます.
受信者に他人を指定した場合は,自分では復号できません (ためしてみましょう).電子メール等で,受信者に送付して,復号できることを確認してもらってください.

静止画

Digintal signature

Add signature

自分の署名を加えるには,gpg --clearsign コマンドを使います.

$  gpg --clearsign filename

filename は,平文と暗号文のどちらでも使えます.初めはいままでと同じ,テキストファイルの平文で試しましょう.
エラーが出なければ,filename.asc というように元のファイル名の拡張子に.asc を追加したファイルができているはずです.himitsu.txt なら himitsu.txt.asc です.

$  cat filename.asc

と表示すると,もとの平文に加えて,署名に相当する(と思われる)文字列が追加されていることが分かります.

静止画

Verify

電子署名の検証には gpg --verify とします.

$  gpg --verify filename.asc 
gpg:  (日付)  にRSA 鍵 ID  (署名者の鍵の ID)  で施された署名
gpg:  (署名者のアドレス)  からの正しい署名

のようにでれば成功です.

  • 静止画
  • 動画 署名後に平文を改ざんしたファイルを検証したため,BAD signature と検証に失敗する例

署名の検証のあとに,公開鍵に関する警告が表示されます.実用で使うためには,公開鍵の信頼性(偽物でないこと)が重要です.通常は,信頼できる人に署名された公開鍵を信頼します(信頼の輪).この演習では署名無しに友人の公開鍵を登録しているので,警告されています.gpg: There is no indication that the signature belongs to the owner.

Exercise

  • 教員が用意した,署名されたようにみえる複数のファイルをダウンロードし,どれが正しく署名されたものか教員の公開鍵を使って検証せよ
  • 平文に署名をして友達に送り,署名の検証を依頼する.さらに,署名後に平文を改ざんしたら,署名の検証で失敗することも確認してもらう.

FAQ

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