コンピュータネットワーク基礎
2005.07.20
電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し, 出席申告してください.なお,キーワードは授業中に紹介します.
提出形式
宛先 | justice@mag.shimane-u.ac.jp | |
件名 | AttendA_07-20_net_s0340** | Aクラス |
AttendB_07-20_net_s0340** | Bクラス | |
本文 |
学生番号 氏名 キーワード |
(改行) (改行) キーワードは授業中に紹介 |
注意 | 「件名」の**をそのままにしないで,必ず自分の学生番号 に修正して下さい.また,ABクラス別は指示にしたがって下さい. |
コンピュータネットワークを利用する上で,情報の機密を保つことはそれなりの 努力を必要とします.個人情報の漏洩の可能性が常につきまとうために,情報の 暗号化や暗号を利用した認証に関する知識は今後有用になって来ることでしょう. 今週は,公開鍵暗号方式を実習します.
教科書のp.148にあるように,アルファベットなどの文字を決まった数だけずら す換字方式でもそれなりの暗号文を作ることができます.次に示すRubyスクリプ トで試してみましょう.
alpha = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] n = ARGV[0].to_i str = "" char = [] for i in 1...ARGV.size str += ARGV[i] + " " end for i in 0...str.size for j in 0..25 if str[i,1] == alpha[j] char[i] = alpha[(j+n)%26] elsif str[i,1] == " " char[i] = " " end end printf "%s", char[i] end printf "\n" |
このスクリプトは最初の引数として何文字アルファベットをずらすかを指定し, それ以後にアルファベットの小文字とスペースからなる文を引数として与えて使 用します.例えば,
$ ruby trans.rb 2 i love you
とすると,結果は,
k nqxg aqw |
のようになります.この場合には,ずらす数である 2 を通信する当事者で決めておけば,暗号文によるやりとり が可能ですが,あらかじめ予想できるように,最大で26種類しか選択肢 が無いので,機密性はほとんど無いことになります.そのため,その後 に書かれているように,「転置式暗号」が必要になります.
二者間で暗号文で通信を行うには,お互いが暗号化の方式を知っていれば簡単に 実現可能です.しかし,多数の人間の間でやりとりしようと思うと,暗号化方式 が無数に必要になって来ます.そのため,不特定多数の間でも二者間の暗号通信 を任意の組合せで実現する方法,公開鍵方式が発明されました.その中の,RSA については教科書のp.150にありますが,実際の方式はかなり複雑になるので,ここで は,簡単な素数の組を用いて例を試してみます.
この方式を試してみるためのRuby
スクリプトも作成してみました.使用方法は,自分で素数の組やd,eの値を
あらかじめ決めておき,てきとうなmの値を入れてみて,そのmの値が逆算できる
かを試すものです.ただし,実際に使用するような大きな素数の組合せは作業が
大変ですので,なかなかできません.そこで,このプログラムも小さな素数を使っ
てやることを前提にしていますので,正しいものにはなっていません.mの値が
数百程度までは正確ですが,大きなmに対しては問題がありますので,注意して
ください.
RSAを用いた代表的な公開鍵暗号方式であるPGP (Pretty Good Privacy) は特許 などの絡みがあって自由に利用できないことがあります.そこで,GNUライセンスで 公開されている公開鍵暗号方式のGnuPG (GNU Privacy Guard) を利用して文書の 暗号化や電子署名の自習を行います.
$ gpg --gen-key
とします.初期設定だけやって勝手にコマンドが終了しますが,もう一回同じコ マンドを入力します.
危険なメモリー使用の警告が今後発せられますが,無視しておいて下さい.$ gpg --gen-key
こんどは対話形式で生成を進めて行くことになります.
すきな鍵の種類を選択してください: (1) DSAとElGamal (既定) (2) DSA (署名のみ) (4) ElGamal (署名と暗号化) (5) RSA (sign only) どれにしますか? |
デフォルトの(1)のままで良いでしょう.そのままEnterです.
DSA鍵対は1024ビットになります。 新しいELG-E鍵対を生成します。 最小の鍵長は 768 ビット 既定の鍵長は 1024 ビット 最大の推奨鍵長は 2048 ビット どの鍵長にしますか? (1024) |
についてもデフォルトのままでよいので,Enterです.
要求された鍵長は1024ビット 鍵の期限を決めてください。 0 = 無期限 <n> = 有効期限 n 日間 <n>w = 有効期限 n 週間 <n>m = 有効期限 n か月間 <n>y = 有効期限 n 年間 鍵の有効期間は? (0) |
ここもデフォルトのままです.Enterしてください.
Key does not expire at all これでいいですか (y/n)? |
これでよいので,yを入力します.
あなたの鍵を同定するためにユーザーIDが必要です。 このソフトは本名、コメント、電子メール・アドレスから 次の書式でユーザーIDを構成します: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" 本名: |
と聞かれるのでローマ字で名前を入れましょう.スペースが入っても構いません.入力を間違 えたときに修正は効かないので,エディタなどに入力しておいて張り付けること をお薦めします.
電子メール・アドレス: |
ここには自分の電子メールアドレスを入れます.ここでも入力を間違 えたときに修正は効かないので,エディタなどに入力しておいて張り付けること をお薦めします.
次に聞かれるコメントは不要ですので,何も入力しないでEnterしましょう.
次のユーザーIDを設定しました: "NAWATE Masahiko <strike@mag.shimane-u.ac.jp>" 名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? |
もし,間違っている箇所があれば対応するアルファベットを入力して,入れ直し て下さい.OKするためにoを入力すると,
秘密鍵を保護するためにパスフレーズがいります。 パスフレーズを入力: |
となり,パスフレーズを聞かれます.これはパスワードの代わりになるもので, 自分で適当な文章を入力します.アルファベットの利用になるので,好きな英語 の歌詞など適当に長いものが良いでしょう.パスワードの入力と同様に,画面に は何も表示されないので入力には注意が必要です.本来はするべきではないです が,エディタなどに文章を入力しておいてから張り付ける方が確実でしょう.
パスフレーズはパスワードと同様設定するためには2回入力します.もう一度同 じ作業を行って下さい.
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。 ..++++++++++++++++++++.+++++++++++++++.++++++++++++++++++++++++++++++++++++++++..+++++.+++++.+++++..+++++++++++++++++++++++++++++++++++.+++++.+++++>+++++.......>+++++<+++++.........+++++ 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。 ++++++++++++++++++++.++++++++++++++++++++^^^^^ gpg: /home/agul/.gnupg/trustdb.gpg: 信用データベースができました 公開鍵と秘密鍵を作り、署名しました。 key marked as ultimately trusted. pub 1024D/29A28FF2 2004-07-15 NAWATE Masahiko |
などと表示され,終了すると結果が表示されます.最後の方にある pub が公開鍵で,sub が秘密鍵です.秘密鍵は自分だけが扱 うものですので,人には見せないような配慮が必要です.一方,公開鍵 は積極的に公開しても構いません.
作成された鍵はバイナリとして保存されています.場所は,.gnupgディ レクトリです.テキストとして保存するには次のようにします.
$ gpg -a --export s0340** > public_key.txt
このコマンドで生成された公開鍵を表示させてみて下さい.
$ less public_key.txt
-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.0.7 (GNU/Linux) mQGiBED2NPMRBACD83E0IOOY+P64Otdohqxw/EQeTxjh+iQq0lFAg381R1A/O+VN l/y58ESC4rDrteBuGqsXZdIS3wKyEFva6Nq+Gmwc0e1/d7Vyp/URMFxociwM6CkH ZR1AW80CefyDViTeRtcZ9QcaYY1NvCrjT3Zpn4dhbKrEDceYD/R56rX6VwCgx/We gArDw2WWXk4ETM3OynVQeiUD/1My1g25CS8VWHrt36VAl2SSOtbJV04ttw3ZCvMd z0jASDKMklYtw1M2WrWNq1BLhrvz4o58a0URpitf76yIpJQdQ/sy484HNnxgTRkI B0HG2AOkwsUOd2MlLw+YWyFRsLdMgeDFtmTklFvY2Sxf8BUV/q2DIr4Xl/S8bZEk O9C+A/sFZ4AucMnKe8mskgVO51Ay7iEEM0KnKTfVong8aqKD9YABUdPuLrZQARpv AIh0j9lic1aE2DFS7LYRivz28GWw0PtKfhxNIRjXQWnvhg6pkc2xJHQ761kfPWWG UCL0nFp/RDEu921XzYuKBKuDCIa7GnS5Rfss+1LmLm3RtEXLdrQtTkFXQVRFIE1h c2FoaWtvIDxqdXN0aWNlQG1hZy5zaGltYW5lLXUuYWMuanA+iFkEExECABkFAkD2 NPMECwcDAgMVAgMDFgIBAh4BAheAAAoJEC2jUT8poo/ybNcAnAhSlMF6PVGEj950 xU1FHzfEPU7pAJ4kYQj5cXSjXOa4FrD3LXhwlsCpT7kBDQRA9jT0EAQAz96GhVGi Wvo3PR/NM0sUWGgA7wqQEMrbWPIZVxKr4yc7GM4pOyVRyIiafhejGiQyqj3Ygles Tqm6xvjpe4Z6QS8aO8Ut/WUiEXmdda3sgwekHfCcZzdwIebflzSQXnfzf6mI6Au5 7F99KyewuTE8V/a6DlWRO81l9NdyXj+rE9cAAwcEAMj9qEH7fR2LrUwVddAjogO2 W4V1pSVU/lEwmI2LfLd0GRGlTDTWJdbTRvz5r7NcCppni4tEYdZ+7fy0trkwxBaL nQzTrZD5BYx9tRvYirKgsfrAJNCpmN6qIPnlXmeXVo/HJ8+O+JD8Gy8VpK+C0nAs 0DOwYn/Zo9fpLhuTEfkYiEYEGBECAAYFAkD2NPQACgkQLaNRPymij/LyRgCePXpg aW8UA0qfyr/q/EHJR0bHfdIAoLNZKUkXl4lESOnBhrUWrWjGoe3S =rxB9 -----END PGP PUBLIC KEY BLOCK----- |
のようになることでしょう.
実際にデータをやりとりするには,誰かの公開鍵を知らなければなりません.回 りの人間と鍵の交換を行って下さい.知合いの誰もいないさびしい人は,この機 会に誰かと知合いになって下さい.メールの添付などにより,テキストファイル そのものをやりとりしましょう.必要な範囲は
-----BEGIN PGP PUBLIC KEY BLOCK-----
から
-----END PGP PUBLIC KEY BLOCK-----
まで,その行を含む全ての部分です.テキストデータをもらったら,それを使う準備をします.コマンドで実行してく ださい.
$ gpg --import dareka_key.txt
最後の鍵の名前はもちろん公開してくれた人のファイル名を使用しましょう.う まく登録できたかどうかはコマンドで確認します.
$ gpg --list-keys
適当なテキストファイルを作成します.中身は何でも構いませんし,日本語でも 大丈夫です.適当に名前もつけて保存します.例えば,b03**.txtのよ うなものでも良いでしょう.このファイルを暗号化します.
$ gpg -ea -r s0340**@matsu.shimane-u.ac.jp b03**.txt
公開鍵をもらった人のメールアドレスを使って上記のコマンドで暗号化します.
gpg: EE8D7CAB: There is no indication that this key really belongs to the owner 1024g/EE8D7CAB 2003-06-19 "Hoge Taro <s0340**@matsu.shimane-u.ac.jp>" 指紋: xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx この鍵は本人のものかどうか確信できま せん。 今から行うことを *確実に* 理解していない場合には、 次の質問にはnoと答えてください。 それでもこの鍵を使いますか? |
のように聞かれますので,キー入力で yes と入力します.これで暗号 化が完了しているはずです.新たに b03**.txt.asc というファイルが 作成されていることを確認してください.中身を見ると,暗号化されていること が分かります.この文書はもう自分でも復号できません.秘密鍵を持っている人, すなわち,先ほど登録した人だけが解読できます.では,そのひとにメールを出 して読んでもらいましょう.メールの本文に,暗号化された文章を張り付けて送 信します.
相手がうまく暗号化してくれたならば,あなたにメールが届きます.中身は暗号 化されていてそのままでは読めません.自分の秘密鍵を使って解読しましょう. もらったメールの
-----BEGIN PGP MESSAGE-----
から
-----END PGP MESSAGE-----
までの全ての範囲をなんらかのファイルに保存します.名前も適当で構いません. 例えば,encrypt.txtなどで構わないでしょう.次にコマンド操作です が,以前に学習した「リダイレクト」を使って次のようにします.
$ gpg < encrypt.txt > encrypt.txt.asc
次のようにメッセージが表示されます.
次のユーザーの秘密鍵のロックを解除するには パスフレーズがいります: "Hoge Jiro <s0340**@matsu.shimane-u.ac.jp>" 1024ビットELG-E鍵, ID EE8D7CAB作成日付は2003-06-19 (主鍵ID 9014F6DF) パスフレーズを入力: |
鍵を作成するときに入力したパスフレーズをもう一度入力します.間違えたら Enterを押して下さい.再び入力画面になります.無事に入力ができたら,
gpg: 1024-ビットELG-E鍵, ID EE8D7CABで暗号化2003-06-19にできました "Hoge Jiro <s0340**@matsu.shimane-u.ac.jp>" |
となり,ファイルが作成されています.復号できた文書を読んでみましょう.
授業の終了20分前くらいに小テストを実施します.アナウ ンスに注意してください.また,提出は電子メールにより行いますので,メール の送信準備は忘れないでいて下さい.
Aクラス小テスト |
Bクラス小テスト |
授業の終りに宿題の説明をしますので,アナウンスに注意してください.
Aクラス宿題 |
Bクラス宿題 |