公開鍵暗号では,個人ごとに,公開鍵と秘密鍵のペアを持ちます.秘密鍵を秘密に保ち,公開鍵を関係者に配布します.
授業や,共通演習の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: (署名者のアドレス) からの正しい署名
のようにでれば成功です.
署名の検証のあとに,公開鍵に関する警告が表示されます.実用で使うためには,公開鍵の信頼性(偽物でないこと)が重要です.通常は,信頼できる人に署名された公開鍵を信頼します(信頼の輪).この演習では署名無しに友人の公開鍵を登録しているので,警告されています.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端末を再起動して,あらためてログインしてから試すとうまくゆくことがあるかも (?)