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