情報セキュリティ 第09回
大久保誠也 静岡県立大学経営情報学部
2/48
はじめに
はじめに
安全な通信の目的
ハイブリッド暗号
ssh
演習
3/48
安全な通信の目的
4/48 Hello
World
Hello World
盗聴
Hello World
Bob
送信
Alice
Hello World
Hello World
Eve
盗聴
A:>
Hello World
覗き見して
やろう
Aliceから
メールが来た。
送信
外部に漏れてな いかなぁ?
5/48
改ざん
9時 集合
12時
送信
集合12時 集合
このメールは 正しいのかな?
Mallory
通信内容を 書き換えてやれ
AliceBob
6/48 hogehoge
Mallory
Bob
送信
hogehoge
hogehoge
hogehoge
なりすまし
Aliceからメールが
来たけど、
本当に
Aliceなのかな?
Aliceを語って
送信だ!
7/48
シンプルな通信方法
8/48 ID
PASSWD
Alice
Bob
②
送信
あsdふぁsd Jlkjぇwkf
③
「秘密鍵」で復号
ID PASSWD
あsdふぁsd Jlkjぇwkf
①
「秘密鍵」で 暗号化
盗聴しても、
復号できな い……。
共
共
秘密鍵暗号を用いた通信
(1)9/48
秘密鍵暗号による通信(2)
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
事前に秘密鍵を受け渡しておく必要がある。
なりすましについて:
特に対処されていないが、攻撃者が秘密鍵を 持っていないなら意味のある通信にならない。
改ざんについて:
特に対処されていないが、改ざんされても意味 のある通信にならない。
10/48 ID
PASSWD
Alice
Bob
③
送信
あsdふぁsd Jlkjぇwkf
④
「秘密鍵」で復号
ID PASSWD
あsdふぁsd Jlkjぇwkf
②
「公開鍵」で 暗号化
秘 公
①
送信
公
公開鍵暗号を用いた通信(1)
盗聴しても、
復号できな
公 い……。
11/48
公開鍵暗号による通信
(2)
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
秘密鍵を事前に共有しておく必要はない。
大きい平文を送るには、処理が重い。
なりすましについて:
特に対処されていない。渡された公開鍵が正し いものか否か、判断しておく必要がある。
改ざんについて:
特に対処されていない。
12/48
公開鍵暗号と
秘密鍵暗号を
組み合わせた通信
13/48
アイデア
秘密鍵暗号は、事前に秘密鍵を受け渡ししておく必 要がある。
どうやって、鍵を受け渡しておくのか?
公開鍵暗号は、処理が重い。
どうやって、大量の平文を通信するのか?
秘密鍵暗号と公開鍵暗号を組み合わせて使う ハイブリッド暗号
1.
平文は秘密鍵暗号で暗号化する。
2.
秘密鍵暗号の秘密鍵(共通鍵)を公開鍵暗号で
暗号化する。
14/48通信手順
(1)平文
秘
Bob
Alice
公
AliceはBobに平文を送りたい
15/48
通信手順
(2)平文
秘
Bob
Alice
公
① Bobの公開鍵を
渡しておく
16/48
通信手順
(3)平文
秘
Bob
Alice
共
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
17/48
通信手順
(4)平文
秘暗 秘
Bob
Alice
共
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文
18/48
④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(5)公
平文
秘暗 秘
Bob
Alice
共
共 公暗
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文
19/48
④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(6)公
平文
秘暗
送信
秘暗 秘
Bob
Alice
共
共 共
公暗 公暗
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文 平文
⑤
送信する
20/48
④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(7)公
平文
秘暗
送信
秘暗 秘
Bob
Alice
共 共
共 共
公暗 公暗
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文 平文
⑤
送信する
⑥
公開鍵暗号で 共通鍵を復号
21/48
④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(8)公
平文
秘暗
送信
平文
秘暗 秘
Bob
Alice
共 共
共 共
公暗 公暗
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文 平文
⑤
送信する
⑥
公開鍵暗号で 共通鍵を復号
⑦
秘密鍵 暗号で 復号
22/48
通信手順 補足
公
平文
秘暗 送信
平文
秘暗 秘
Bob
Alice
Aliceからの
メールが来た。
復号しよう……。
共 共
共 共
公暗 公暗
パス
+ フレーズ 公
平文 平文
実際には パスフレーズも 使用することが多い
23/48
盗聴されても
…Eve
公
平文
平文
暗 送信
平文
平文
暗 秘
BobのBobの
Bob
Alice
共 共
共 共
暗 暗
盗聴しても、
復号できな い……。
パス
+ フレーズ
24/48
通信手順
以下のような流れで行われる。
1.AliceがBobにメールを送るとする。
2.Aliceは共通鍵を生成し、平文を暗号化する。
3.Aliceは共通鍵を、Bobの公開鍵で暗号化する。
4.Aliceは2と3で生成したものを、Bobにメールする。
5.Bobは、Bobの秘密鍵とパスフレーズで、Aliceから
送られた『暗号化された共通鍵 』 を復号し、共通鍵 を取り出す。
6.Bobは、取り出した共通鍵で、『暗号化された平
文』から平文を取り出す。
Eveは、Bobの秘密鍵を知らないため、共通鍵を取り
出せず、結果として平文を入手できない。
25/48
まとめ
秘密鍵暗号と公開鍵暗号を組み合わせて使う
1.平文は秘密鍵暗号で暗号化する。
2.
秘密鍵暗号の鍵を公開鍵暗号で暗号化する。
秘密鍵暗号は、事前に秘密鍵を受け渡ししておく必 要がある。
どうやって、鍵を受け渡しておくのか?
→ 公開鍵暗号で秘密鍵暗号の鍵を暗号化。
公開鍵暗号は、処理が重い。
どうやって、大量の平文を通信するのか?
→ 小さい秘密鍵暗号の鍵のみを暗号化。
26/48何が守れているのか
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
なりすましについて:
特に対処されていないが、攻撃者が秘密鍵を 持っていないなら意味のある通信にならない。
改ざんについて:
特に対処されていないが、改ざんされても意味 のある通信にならない。
さらに認証技術等と組み合わせる必要がある
27/48
ssh
28/48
sshとは
Secure Shell の略。
リモートの計算機と安全に通信するためのプロトコ ル。パスワードを含めた全てが暗号化される。
ハイブリット暗号方式を利用している。
なりすましにも、ある程度の耐性がある。
sshは、telnetを置き換えていることが多い。
ftpを置き換えるsftp等もある。
プロトコルはバージョンが2つある。
(
1の使用は推奨されていない)
29/48
telnet
と
sshtelnet
の場合
ssh
の場合
通信は平文 で行われる
通信はすべて暗号化さ れて行われる
30/48
ssh
と
teraterm通信するプロトコルを 選択できる
sshの場合、認証方式
を選択
31/48
プレインテキストの場合の概要
32/48
プレインテキストの場合の 概要
(1)秘
計算機
Alice
公 公
秘
Aliceはリモートの計算機に
接続して利用したい
33/48
プレインテキストの場合の 概要
(2)秘
計算機
Alice
公
①
送信
公
秘
34/48
プレインテキストの場合の 概要
(3)公 秘
計算機
Alice
共
公
①
送信
②
共通鍵を生成
公
秘 公
35/48
③
公開鍵暗号で 共通鍵を 暗号化
プレインテキストの場合の 概要
(4)公 秘
計算機
Alice
共
共 公暗
公
①
送信
②
共通鍵を生成
公
秘 公
36/48
③
公開鍵暗号で 共通鍵を 暗号化
プレインテキストの場合の 概要
(5)公
送信
秘
計算機
Alice
共
共 共
公暗 公暗
公
①
送信
②
共通鍵を生成
④
送信する
公
秘
公
37/48
③
公開鍵暗号で 共通鍵を 暗号化
プレインテキストの場合の 概要
(6)公
送信
秘
計算機
Alice
共 共
共 共
公暗 公暗
公
①
送信
②
共通鍵を生成
④
送信する
⑤公開鍵暗号で 共通鍵を復号 公
公 秘
38/48
③
公開鍵暗号で 共通鍵を 暗号化
プレインテキストの場合の 概要
(7)公
送信
秘
計算機
Alice
共 共
共 共
公暗 公暗
公
①
送信
②
共通鍵を生成
④
送信する
⑤公開鍵暗号で 共通鍵を復号 公
公 秘
⑥
共通鍵暗号を使用し て、今後の通信を行う
AliceはBobに平文を送りたい
39/48
片方はホスト鍵、もう片方はサーバー鍵である
はじめて通信した際、利用者はホスト鍵を保存して おく。
2
回目以降、保存しておいたホスト鍵と送られてきた ホスト鍵を比較する。
ssh
プロトコル バージョン1 の
2本の鍵公
秘 公
秘
ホスト鍵 サーバー鍵
定期的に 作り直す 基本的に
ずっと一緒
40/48
プレインテキストの場合の
概要
2回目以降 (1)公
秘
計算機
Alice
公 公
秘
前回保存しておいた ホスト鍵
41/48
プレインテキストの場合の 概要
2回目以降
(2)公
秘
計算機
Alice
公
①
送信
公
秘 公
公
②
比較する
42/48
プレインテキストの場合の 概要
2回目以降
(3)公
秘
計算機
Alice
公
①
送信
公
秘 公
公
②
比較する
同じだったら、前回と同じ
計算機に接続しようとしている
43/48
プレインテキストの場合の 概要
2回目以降
(4)公
秘
計算機
Alice
公
①
送信
公
秘 公
公
②
比較する
違っていれば、前回と異なる 計算機に接続しようとしている!
なりすまし
44/48
何が守れているのか
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
なりすましについて:
初回に成功していれば、2回目以降はなりすまし に(ある程度)耐性がある。
改ざんについて:
特に対処されていないが、改ざんされても意味 のある通信にならない。
さらに認証技術等と組み合わせる必要がある
45/48
演習:
8進数と
16進数
46/48
C
言語における
k進数
計算機は、内部では
2進数で計算しています。
printf
は、値を表示するときに、10進数に変換して表
示する機能があります。
C言語では、8進数表記や16進数表記で、値を表示す
ることも可能です。
16進数では、10~15の値はアルファベットa~fに割り
当て(10→a, 11→b, 12→c, 13→d, 14→e, 15→f )
printf("%d¥n",135)printf("%d¥n",135)
printf("%d %o %x¥n",135,135,135) printf("%d %o %x¥n",135,135,135)
47/48
#include<stdio.h>
int main(){
int test;
test=12; // 1100 printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
#include<stdio.h>
int main(){
int test;
test=12; // 1100 printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
使用例
1:
コンパイルは
として行う。
gcc sample08a.c gcc sample08a.c
48/48
#include<stdio.h>
int main(){
int test;
test=12; // 1100 printf("%d ¥n",test);
printf("%o ¥n",test);
printf("%x ¥n",test);
}
#include<stdio.h>
int main(){
int test;
test=12; // 1100 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
と表示される。
49/48
使用例
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
50/48
課題の提出
以下を提出しなさい、
使用例1~2の実行結果。
使用例2において、何故、8進数と16進数だと、その ような表現になるのか、10進数から変換する過程と 共に説明しなさい。
組み込みlinuxが利用されているものに、どのような ものがあるか。
ファイル名は学籍番号の末尾にiをつけたものとする。