1
情報セキュリティ 第08回
大久保誠也 静岡県立大学経営情報学部
2/63
はじめに
はじめに
今までの復習
なりすましの防止と電子署名
メールにおけるセキュリティ
演習3/63
前回の課題の解答と解説
4/63
2進数と10進数
日常、値(数)は10進数で使用している。
一方、計算機の内部では、すべてのデータは
0,1
で 管理されている。 計算機を理解するときには、この
0,1
がどのようにし て計算されているかは重要。 今から数枚のスライドでは、
10
進数の値を"145
10"
の様に、 2進数の値を"145
2"の様に、
右下に小さく値を書いて表現することとする。
5/63
10進数とは(1)
" 1
10"
を で表すとする。
145
10はを意味している。
"
ブロック"10
個で、(違う大きさの)"
ブロック"
となる。6/63
10進数とは(2)
145
10は、「1個のブロックが10個集まったブロック」が14個と、「1個のブロック」が5個。
これは、「10個のブロックが10個集まったもの」が1つと「1個のブ ロックが10個集まったブロック」が4個と「1個のブロック」が5個
7/63
10進数とは(3)
結局、14510の意味することは、
1 4 5 10
「10個のブロックが
10個集まったもの」が1つ
「10個のブロックが 集まったもの」が4つ
「1個のブロック」
が5つ
1×10 2 10
4×10 1 10 5×10 0 10
8/63
10進数とは(4)
26145
10の意味することは、
4
桁の値の各桁をx
yのように表現することにすると、2 6 1 3 2 10
2
×10
410+6
×10
310+1
×10
210+3
×10
110+2
×10
010x 3 x 2 x 1 x 0 10
x 3
×10310+ x 2
×10210+ x 1
×10110+ x 0
×100109/63
2進数とは
"ブロック"2個で、(違う大きさの) "ブロック"となる。
1111
2の意味することは、1 1 1 1 2
「1個のブロック」
が1つ
1×2 0 10
「1個のブロックが
2個集まった
ブロック」が1つ
1×2 1 10
「2個のブロック が2個集まった ブロック」が1つ
1×2 2 10
「2個のブロックが
2個集まった
ブロックが2個集まった
ブロック」が1つ1×2 3 10
10/63
10進数から2進数へ(1)
27
10は、2進数で表現するとどうなるか?2で除算をして、余りが各桁の値となる。
1. 27
10は、21個のブロック13個と、1個のブロック1個。(2710を210 で割ると、13余り1だから)
2. 27
10は、2
2個のブロック6個と、2
1個のブロック1個 と、1
個のブロック1
個。(1310を210 で割ると、6余り1だから)
11/63
10進数から2進数へ(2)
27
10は、2
進数で表現するとどうなるか?3. 27
10は、2
3個のブロック3個と、2
2個のブロック0個 と、2
1個のブロック1
個と、1
個のブロック1
つ。(610を210 で割ると、3余り0だから)
4. 27
10は、2
4個のブロック1個と、2
3個のブロック1個 と、2
2個のブロック0個と、2
1個のブロック1個と、1 個のブロック1
つ。12/63
10進数から2進数へ(3)
27
10は、2
進数で表現するとどうなるか?5. 27
10は、2
4個のブロック1個と、2
3個のブロック1
個と、2
2個のブロック0個と、2
1個のブロック1個と、1個のブロック1個
なので、答えは11011
。1 1 0 1 1
13/63 13/63
2進数から10進数へ
4
桁の値の各桁をx
yのように表現することにすると、
1011なら、
x 3 x 2 x 1 x 0 2
x 3
×2
310+ x 2
×2
210+ x 1
×2
110+ x 0
×2
0101 0 1 1 2
1
×2
310+ 0
×2
210+ 1
×2
110+ 1
×2
010=8+0+2+1=11
14/63その他の k 進数表現
計算機や
C
言語を使用している際、他に出てくるk
進数 表現は、8進数や16進数があります。
2
進数や10
進数と同様に考えることができます。 特に、16進数は色々な場面で出てきます。
例1:MD5値を計算したときの値の表現
例2:セキュリティ証明書の各種値15/63
使用例 3:回答例の一部
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
コンパイルは
として行う。
gcc sample07c.c gcc sample07c.c
i=3
のとき、3
10は2
進数だと011
2。6
10は2
進数だと110
2。110
2& 011
2= 010
2110
2| 011
2= 111
2110
2xor 011
2= 101
2 16/63復習:
公開鍵暗号と 秘密鍵暗号を 組み合わせた通信
17/63
アイデア
秘密鍵暗号は、事前に秘密鍵を受け渡ししておく必 要がある。
どうやって、鍵を受け渡しておくのか?
公開鍵暗号は、処理が重い。
どうやって、大量の平文を通信するのか?
秘密鍵暗号と公開鍵暗号を組み合わせて使う ハイブリッド暗号
1.
平文は秘密鍵暗号で暗号化する。2.
秘密鍵暗号の秘密鍵(共通鍵)を公開鍵暗号で暗号化する。 18/63
④ 公開鍵暗号で 共通鍵を 暗号化
通信手順 (8)
公
平文
秘暗
送信
平文
秘暗 秘
Bob
Alice
共 共
共 共
公暗 公暗
公
① Bobの公開鍵を
渡しておく
② 共通鍵を生成
③ 秘密鍵暗号で 平文を暗号化
平文 平文
⑤ 送信する
⑥ 公開鍵暗号で 共通鍵を復号
⑦ 秘密鍵 暗号で 復号
19/63
盗聴されても…
Eve
公
平文
平文
暗 送信
平文
平文
暗 秘
Bobの
Bobの
Bob
Alice
共 共
共 共
暗 暗
盗聴しても、
復号できな い
……
。パス
+フレーズ
20/63
通信手順
以下のような流れで行われる。1.AliceがBobにメールを送るとする。
2.Aliceは共通鍵を生成し、平文を暗号化する。
3.Aliceは共通鍵を、Bobの公開鍵で暗号化する。
4.Aliceは2と3で生成したものを、Bobにメールする。
5.Bobは、Bobの秘密鍵とパスフレーズで、Aliceから
送られた『暗号化された共通鍵』を復号し、共通鍵 を取り出す。6.Bobは、取り出した共通鍵で、『暗号化された平
文』から平文を取り出す。 Eve
は、Bob
の秘密鍵を知らないため、共通鍵を取り 出せず、結果として平文を入手できない。21/63
まとめ
秘密鍵暗号と公開鍵暗号を組み合わせて使う
1.
平文は秘密鍵暗号で暗号化する。2.
秘密鍵暗号の鍵を公開鍵暗号で暗号化する。 秘密鍵暗号は、事前に秘密鍵を受け渡ししておく必 要がある。
どうやって、鍵を受け渡しておくのか?
→ 公開鍵暗号で秘密鍵暗号の鍵を暗号化。
公開鍵暗号は、処理が重い。
どうやって、大量の平文を通信するのか?
→ 小さい秘密鍵暗号の鍵のみを暗号化。 22/63
何が守れているのか
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
なりすましについて:
特に対処されていないが、攻撃者が秘密鍵を 持っていないなら意味のある通信にならない。
改ざんについて:
特に対処されていないが、改ざんされても意味 のある通信にならない。
さらに認証技術等と組み合わせる必要がある
23/63
なりすましの防止と 電子署名
24/63
なりすまし防止の アイディア(1)
なりすましを防止するには、どうすればよいか?
→ ようするに、相手が本当に本人か確認したい!
認証・署名
実世界では、印鑑やサイン、パスワードで本人確認。
本人確認は、「本人しか持っていない情報を持ってい るか」で確認する。
秘密鍵は「本人しか持っていない情報」
25/63
復習:
公開鍵暗号方式による認証
「Alice
の公開鍵」で復号できる暗号文なら、その暗号文は「
Alice
の秘密鍵」で作成したに違いない。
「Alice
の秘密鍵」で暗号化できるのは、秘密鍵を持っている
Alice
だけ。「Aliceの公開鍵」で復号できるものは、
Aliceのファイルに違いない!
26/63
なりすまし防止の アイディア(1)
秘 公 Aliceの
Bob
Alice
AliceからBobにファイルを送るので、
BobはAliceからのファイルかを
検証したい27/63
なりすまし防止の アイディア(2)
秘
送信
公 Aliceの
Aliceの
Bob
Alice
① Aliceの公開鍵を 事前に渡しておく
28/63
なりすまし防止の アイディア(3)
秘
平文
フィンガー プリント
公 Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
① 公開鍵を 事前に渡しておく
29/63
なりすまし防止の アイディア(4)
秘
平文
フィンガー プリント
公 Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を
事前に渡しておく 30/63
なりすまし防止の アイディア(5)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信 平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
31/63
なりすまし防止の アイディア(6)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信 平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
フィンガー
プリント ⑤ 復号する Aliceからの
メールか 検証しよう……
32/63
なりすまし防止の アイディア(7)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信 平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
フィンガー
プリント ⑤ 復号する フィンガー
プリント
⑥ ハッシュ値を計算 Aliceからの
メールか 検証しよう……
33/63
なりすまし防止の アイディア(8)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信 平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
フィンガー
プリント ⑤ 復号する フィンガー
プリント
⑥ ハッシュ値を計算
⑦ 比較して同じなら
Aliceからの
メールだ!Aliceからの メールか 検証しよう……
34/63 フィンガー
プリント フィンガー プリント
なりすまされた場合(1)
平文
暗
公 Eveの
Bob
Aliceからの メールか 検証しよう……
なりすまし
Eve
パス+フレーズ
① 公開鍵を 事前に渡しておく
EveがAliceの名前を騙って、
Bobにファイルを送る。
Bob
はAlice
のファイルか検証したい35/63 フィンガー
プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
なりすまされた場合(2)
平文
暗
送信
送信
平文
異なる 何か
暗 公
Aliceの Eveの
Bob
Aliceからの メールか 検証しよう……
Alice
の公開鍵で 元に戻せない!。Aliceからの
メールじゃない!なりすまし
Eve
36/63 フィンガー
プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
なりすまされた場合(3)
平文
暗
送信
送信
平文
異なる 何か
暗 公
Aliceの Eveの
Bob
Aliceからの メールか 検証しよう……
Aliceの公開鍵で 元に戻せない!。
Aliceからの メールじゃない!
なりすまし
Eve
Eve
はAliceの秘密鍵を
知らないので、
Aliceの公開鍵で
復号できる 暗号化済み指紋を作れない。
37/63 フィンガー
プリント フィンガー プリント
改竄された場合(1)
平文
暗
送信
送信
公 Aliceの
Bob
Aliceからの メールか 検証しよう……
送信中に、
データが変わって しまった!
パス
+フレーズ 秘 Aliceの
Alice
38/63異なる フィンガー
プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
改竄された場合(2)
平文
暗
送信
送信
異なる 平文
フィンガー プリント
暗 公
Aliceの
Bob
Aliceからの メールか 検証しよう……
Alice
の公開鍵で 元に戻せない!。正常に通信できて ない!
パス
+フレーズ 秘 Aliceの
Alice
39/63 異なる
フィンガー プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
改竄された場合(3)
平文
暗
送信
送信
平文
フィンガー プリント
暗 公
Aliceの
Bob
Aliceからの メールか 検証しよう……
Aliceの公開鍵で 元に戻せない!。
正常に通信でき ていない!
秘 Aliceの
Alice
指紋の値が異なるので、
正常に通信できていないことが わかる。
40/63
なりすまし防止のアイディア(4)
以下のような流れで行われる。1. Aliceは平文のフィンガープリントを作成する。
2. AliceはAliceの秘密鍵とパスフレーズでフィンガープ
リントを暗号化3. Aliceは、平文と3で生成したものを、Bobにメール 4. Bobは、Aliceの公開鍵でAliceから送られた『暗号化
されたフィンガープリント』を復号する。
5. Bobは、『Aliceから送られてきた平文
』から作ったフィ ンガープリントと、4
のフィンガープリントを比較する。41/63
何が守れているのか
盗聴について:
対処されていない。
なりすましについて:
対処されている。
ただし、改竄と区別は付かない。
改竄について:
対処されている。
ただし、なりすましと区別は付かない。
さらに暗号技術等と組み合わせる必要がある
42/63
次のステップ
暗号技術で盗聴に、認証技術でなりすましや改竄を 防止することができる。
説明のあちこちにある「公開鍵を事前に渡しておく」
の具体的な方法が、今のところノータッチ。
偽物の公開鍵をつかまれれたりしないか?
直に会えば確実だけど、相手が地球の裏側に居 たりするなら、どうするの?暗号技術と認証技術を組み合わせれば、
これらすべてに対処できる(はず)!
43/63
電子メールの セキュリティ
44/63
AliceからBobにメールを送る場合、
「
Alice
のパソコン」→「Alice
のメールサーバー」→「Bobのメールサーバー」 → 「Bobのパソコン」
と伝わっていく。
メールの経路の概略図
パソコン サーバー サーバー パソコン
明日、10時
明日、10時
明日、10時
45/63
パスワードやメールの内容が、やりとりされる
やりとりされるデータ
メールの内容
サーバー サーバー パソコン
明日、10時
明日、10時
明日、10時
パスワード
メールの内容
メールの内容 パスワード
46/63
パスワードやメールの盗聴防止や、
メールの内容の改竄
守りたいもの
メールの内容
サーバー サーバー パソコン
明日、10時
明日、10時
明日、10時
パスワード
メールの内容
メールの内容 パスワード 盗聴防止
改竄防止
盗聴防止 改竄防止
盗聴防止
なりすましを 防止したい
盗聴防止
盗聴防止 改竄防止
47/63
POP
:Post Office Protocol
メールをやり取りするプロトコルPOPの概要
メールの内容
サーバー サーバー パソコン
明日、10時
明日、10時
明日、10時
パスワード
メールの内容
メールの内容 パスワード 盗聴可能
改竄可能
盗聴可能 改竄可能
なりすまし可能
盗聴可能 盗聴可能
盗聴可能
改竄可能 48/63
POP
Post Office Protocol
の略。 メールを受信するときに、
「クライアントとサーバー間」で、
メールをやり取りするためのプロトコル。
パスワードで正しいユーザーか認証できる。
メールを送信するときは、
「送信する前に一度POPで認証する」
という形で使用される(POP before SMTP)
パスワード、メールの内容、すべてが平文でやりとりさ れる。
49/63
APOP:Authenticated Post Office Protocol
パソコンとサーバー間のパスワードのみを暗号化
APOPの概要
メールの内容
サーバー サーバー パソコン
明日、10時
明日、10時
明日、10時
パスワード
メールの内容
メールの内容 パスワード 盗聴可能
改竄可能
盗聴可能 改竄可能
なりすまし可能
盗聴防止
盗聴防止
盗聴可能
改竄可能 50/63
APOP
Authenticated Post Office Protocolの略。
メールを受信するときに、
「クライアントとサーバー間」で、
メールをやり取りするためのプロトコル。
パスワードで正しいユーザーか認証できる。
メールを送信するときは、
「送信する前に一度POPで認証する」
という形でも使用される(POP before SMTP)
パスワードのみ暗号化。メールの内容は平文のまま。
脆弱性が見つかっているので、使用は推奨されない。
51/63
パソコン・サーバー間を暗号化
POP over SSL の概要
メールの内容
サーバー サーバー パソコン
明日、10時
明日、10時
明日、10時
パスワード
メールの内容
メールの内容 パスワード 盗聴防止
改竄防止
盗聴可能 改竄可能
なりすまし可能
盗聴防止
盗聴防止
盗聴防止 改竄防止
さlkdfjl
さlkdfjl
52/63
POP over SSL
メールを送信・受信するときに、
「クライアントとサーバー間」を、
暗号化するためのプロトコル。
パスワードで正しいユーザーか認証できる。
「クライアントとサーバー間」は、パスワードも内容も暗 号化。
「クライアントとサーバー間」は、内容は平文。
GmailをThunderbird等で利用した場合、この方法が利
用できる。53/63
パソコン・サーバー間を暗号化
https利用の
Webメールの概要
メールの内容
サーバー サーバー パソコン
明日、10時
明日、10時
明日、10時
パスワード
メールの内容
メールの内容 パスワード 盗聴防止
改竄防止
盗聴可能 改竄可能
なりすまし可能
盗聴防止
盗聴防止
盗聴防止 改竄防止
さlkdfjl
さlkdfjl
54/63
https利用のWebメール
https
は、「クライアントとサーバー間」の、
データを暗号化するためのプロトコル。
Webメールにログインするときのパスワードや、ブラウ
ザから入力した文章内容も暗号化される。
ようするに、「クライアントのサーバー間」は、パスワー ドも内容も暗号化。
「サーバーのサーバー間」は、内容は平文。
GmailやHotMail等でも利用できる。
55/63
アリスのが送るメールを暗号化。
認証用のデータ付き。
PGP
メールの内容
サーバー サーバー パソコン
さlkdfjl
さlkdfjl
さlkdfjl
パスワード
メールの内容
メールの内容 パスワード 盗聴防止
改竄防止
盗聴防止 改竄防止
なりすまし防止
盗聴可能
盗聴可能
盗聴防止 改竄防止
明日、10時
明日、10時
56/63
PGP(Pretty Good Privacy)
PGPは、
「クライアントとクライアント間」の、
データを暗号化するための手法。
Aliceが公開鍵暗号方式で暗号化・認証用データ作成
を行う。
Bob
は復号や認証用データの確認を行う。 ようするに、「クライアントとクライアント間」で、内容を 暗号化する。認証もできる。
パスワードについては何もしないので、他の「クライア ントとサーバー間」の暗号化手法を同時に使用する
一般にあまりに普及してない。
57/63
演習:
8
進数と16
進数58/63
UNIXにログインする
今回もUNIXで演習を行いますので、smaxにログインし てください。
今回は、UNIX環境におけるC言語で
8進数と16進数
を取り扱います。
16進数は、10~15の値はアルファベットa~fに割り当
てられます。
10→a, 11→b, 12→c, 13→d, 14→e, 15→f
59/63
C言語における k 進数
計算機は、内部では2進数で計算しています。
人間は、通常、
10
進数です。
printf
は、値を表示するときに、10
進数に変換して表示する機能があります。
C言語では、8進数表記や16進数表記で、値を表示す
ることも可能です。
なお、2進数で表示する命令はありません。
printf("%d¥n",135) printf("%d¥n",135)
printf("%d %o %x¥n",135,135,135) printf("%d %o %x¥n",135,135,135)
60/63
使用例 1:
#include<stdio.h>
int main(){
int test;
test=12; // 0000000000001100 printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
#include<stdio.h>
int main(){
int test;
test=12; // 0000000000001100 printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
コンパイルは
として行う。
gcc sample08a.c
gcc sample08a.c
61/63
#include<stdio.h>
int main(){
int test;
test=12; // 0000000000001100 printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
#include<stdio.h>
int main(){
int test;
test=12; // 0000000000001100 printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
使用例 1:解説
12は2進数だと 1100
で表される。%dは10進数で表示。
12と表示される。
%oは8進数で表示。
14
と表示される。%xは16進数で表示。
c
と表示される。62/63
使用例 2:
#include<stdio.h>
int main(){
int test;
test=1487;
printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
#include<stdio.h>
int main(){
int test;
test=1487;
printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
コンパイルは
として行う。
gcc sample08b.c gcc sample08b.c
63/63
課題の提出
以下を提出しなさい、
使用例1~2の実行結果
使用例2において、何故、8進数と16進数だと、
そのような表現になるのか、10進数から変換 する過程と共に説明しなさい。
ファイル名は学籍番号の末尾にhをつけたもの とする。
グループ名は『H24_情報セキュリティ』です。