公開鍵暗号では,個人ごとに,公開鍵と秘密鍵のペアを持ちます.秘密鍵を秘密に保ち,公開鍵を関係者に配布します.
授業や,共通演習のGPGによる公開鍵暗号と署名/目的のページ前半 (操作以外のスライド) で概念をまず確認してください.
典型的な公開鍵暗号の使い方では,以下の準備をします.
まずは,この準備をした後,暗号と復号や,署名の検証を演習しましょう.
まずは,鍵ペアを作成します.右のイメージイラストでは,錠前が公開鍵,いわゆる鍵が秘密鍵の意図です.公開鍵は様々な人に配る(悪人が知っても良い)もので,秘密鍵は秘密に保ちます.ディスクに保存する際にも,パスフレーズを用いて暗号化して保存します.
作成には,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
と必要に応じてオプションを追加してください.
鍵を作成した段階では,秘密鍵と公開鍵のペアは隠されています.公開鍵を共有するために,公開鍵をファイルに書き出して,配布します.gpg -a --export
というコマンドを使います.
$ gpg -a --export emailaddress > studentid-pub.txt
$
はプロンプトの意図で,gpg
からタイプしてください(以下も同じ).emailaddress
は鍵ペア作成時に登録した電子メールアドレス,studentid
の部分は各自の学生証番号で置き換えてください.
書き出したファイルを,UTOL の課題「公開鍵暗号置き場」にアップロードしましょう.
初回のexport時のみ,emailaddress
を省略可能です.
エラーが出なければ成功です.Finder などで,出力されたファイルを確認しましょう.
UTOL の課題「公開鍵暗号置き場」から,友達の公開鍵をダウンロードします.課題一覧の画面で該当課題の右端の縦の3点 (⋮) をクリックしてメニューを開き「所属グループの提出物確認」に進みます.
公開鍵が書かれたファイルから,その鍵を登録するためには,gpg --import
コマンドを用います.
$ gpg --import filename.txt
filename.txt
はダウンロードしたファイル名で置き換えてください.ファインダで見つけてドラッグアンドロップすると簡単です.
公開鍵は, import
するたびに増えてゆきます
その後,登録した鍵を「信頼する」手続きをします.
$ gpg --lsign-key (友達のメールアドレス)
(中略)
本当に全ユーザー ID に署名しますか? (y/N) y
署名は、書き出し不可に設定されます。
(中略)
本当に署名しますか? (y/N) y
次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります: (自分のメールアドレス)
(自分の秘密鍵のパスフレーズを聞かれるのでタイプする)
公開鍵暗号の場合は,復号できるのは秘密鍵を持つ人だけです.つまり,(1) 暗号化前に送付したい人(=受信者)の公開鍵をあらかじめ入手し (2) その人を指定して暗号化する,という手順となります.
暗号化は,gpg -r emailaddress -ea
というコマンドを使います.
gpg -r emailaddress -ea himitsu.txt
emailaddress
は受信者のメールアドレスで置き換えてください.
コマンドが成功すれば(エラーが出なければ),himitsu.txt.asc
というファイルができているので,cat
コマンドで確認してください (確認手順は共通鍵暗号の時と同じです).
復号はgpg -d
コマンドです.手順は共通鍵暗号の復号 のときとコマンドは共通です.
gpg -d himitsu-xxxx.txt.asc
暗号化の際に,受信者として自分を指定した場合は自分で復号できます.
受信者に他人を指定した場合は,自分では復号できません (ためしてみましょう).電子メール等で,受信者に送付して,復号できることを確認してもらってください.
自分の署名を加えるには,gpg --clearsign
コマンドを使います.
$ gpg --clearsign filename
filename
は,平文と暗号文のどちらでも使えます.初めはいままでと同じ,テキストファイルの平文で試しましょう.
エラーが出なければ,filename.asc
というように元のファイル名の拡張子に.asc
を追加したファイルができているはずです.himitsu.txt
なら himitsu.txt.asc
です.
$ cat filename.asc
と表示すると,もとの平文に加えて,署名に相当する(と思われる)文字列が追加されていることが分かります.
電子署名の検証には gpg --verify
とします.
$ gpg --verify filename.asc
gpg: (日付) にRSA 鍵 ID (署名者の鍵の ID) で施された署名
gpg: (署名者のアドレス) からの正しい署名
のようにでれば成功です.
署名の検証のあとに,公開鍵に関する警告が表示されます.実用で使うためには,公開鍵の信頼性(偽物でないこと)が重要です.通常は,信頼できる人に署名された公開鍵を信頼します(信頼の輪).この演習では署名無しに友人の公開鍵を登録しているので,警告されています.gpg: There is no indication that the signature belongs to the owner.
gpg --delete-secret-key 自分のメールアドレス
gpg --delete-key 自分のメールアドレス
gpg --list-keys
として鍵一覧を表示します.(自分の名前とともに)友人の名前が表示されれば成功です.gpg --import filename
とした際に,ファイルの中に未知の鍵がない場合に起こります.たとえば,gpg --lsign-key
を正しく行っていれば,信頼されます.gpg --import
の手続きに失敗しているcat himitsu.txt
で中身が表示されることをまず確認しましょう.