1
情報セキュリティ 第07回
大久保誠也 静岡県立大学経営情報学部
2/59
はじめに
はじめに
今までの復習
安全な通信の目的
種々の通信プロトコル
演習
3/59
今までの復習
4/634/59
今までやってきた基礎技術
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
5/59
秘密鍵暗号
暗号化も復号も、同じ鍵を使用する。
共
秘密鍵
秘密鍵は第三者に渡してはいけない。
処理が軽いため、大きい平文を暗号化できる。
共 共
平文 暗号文 暗号文 平文
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
6/59
公開鍵暗号方式
暗号化と復号では、異なる鍵を使用する。
公開鍵で暗号化し、秘密鍵で復号する。
秘密鍵は第三者に渡してはいけない。
処理が重いため、基本的に小さい平文を暗号化する。
公 秘
平文 暗号文 暗号文 平文
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
7/59
ハッシュ値と 一方向関数
文章のテキストファイルから生成できるビット列 平文 フィンガー プリント
異なる平文が、同じ指紋を生成する確率は低い。
平文
Aフィンガー プリント
A
平文
Bフィンガー プリント
B
違う指紋に
平文と指紋を受け取り、比較することで、平文が正し いか否かを判定できる。
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
8/59
乱数
数列の中でも、過去の数列から、次の数が予想できな いものを、乱数列という。
つまり、x
1, x2, … , xtから次のx
t+1が予想できない。
一般に、計算機が使用するのは疑似乱数。
単純な例
種 処理 値1 処理 値2 処理 値3
…乱数値1 乱数値2 乱数値3
処理 処理 処理
…
次の値は
予想できない
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
9/59
安全な通信の目的
10/59 Hello
World
Hello World
盗聴
Hello World
Bob
送信
Alice
Hello World
Hello World
Eve
盗聴
A:>
Hello World
覗き見して
やろう
Aliceから
メールが来た。
送信
外部に漏れてな いかなぁ?
11/59
改ざん
9時 集合
12時
送信
集合12時 集合
このメールは 正しいのかな?
Mallory
通信内容を 書き換えてやれ
AliceBob
12/59 hogehoge
Mallory
Bob
送信
hogehoge
hogehoge
hogehoge
なりすまし
Aliceからメールが
来たけど、
本当にAliceなのかな?
Alice
を語って
送信だ!
13/59
代表的な攻撃方法と対処
盗聴
なりすまし
改ざん
14/59
シンプルな通信方法
15/59 ID
PASSWD
Alice
Bob
②
送信
あsdふぁsd Jlkjぇwkf
③
「秘密鍵」で復号
ID PASSWD
あsdふぁsd Jlkjぇwkf
①
「秘密鍵」で 暗号化
盗聴しても、
復号できな い
……。
共
共
秘密鍵暗号を用いた通信(1)
16/59
秘密鍵暗号による通信(2)
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
事前に秘密鍵を受け渡しておく必要がある。
なりすましについて:
特に対処されていないが、攻撃者が秘密鍵を 持っていないなら意味のある通信にならない。
改ざんについて:
特に対処されていないが、改ざんされても意味 のある通信にならない。
17/59 ID
PASSWD
Alice
Bob
③
送信
あsdふぁsd Jlkjぇwkf
④
「秘密鍵」で復号
ID PASSWD
あsdふぁsd Jlkjぇwkf
②
「公開鍵」で 暗号化
秘 公
①
送信
公
公開鍵暗号を用いた通信(1)
盗聴しても、
復号できな い
……。
公
18/59
公開鍵暗号による通信(2)
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
秘密鍵を事前に共有しておく必要はない。
大きい平文を送るには、処理が重い。
なりすましについて:
特に対処されていない。渡された公開鍵が正し いものか否か、判断しておく必要がある。
改ざんについて:
特に対処されていない。
19/59
公開鍵暗号と 秘密鍵暗号を 組み合わせた通信
20/59
アイデア
秘密鍵暗号は、事前に秘密鍵を受け渡ししておく必 要がある。
どうやって、鍵を受け渡しておくのか?
公開鍵暗号は、処理が重い。
どうやって、大量の平文を通信するのか?
秘密鍵暗号と公開鍵暗号を組み合わせて使う ハイブリッド暗号
1.
平文は秘密鍵暗号で暗号化する。
2.
秘密鍵暗号の秘密鍵(共通鍵)を公開鍵暗号で 暗号化する。
21/59
通信手順
(1)平文
秘
Bob
Alice
公
AliceはBobに平文を送りたい
22/59
通信手順
(2)平文
秘
Bob
Alice
公
① Bobの公開鍵を
渡しておく
23/59
通信手順
(3)平文
秘
Bob
Alice
共
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
24/59
通信手順
(4)平文
秘暗 秘
Bob
Alice
共
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文
25/59
④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(5)公
平文
秘暗 秘
Bob
Alice
共
公暗 共
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文
26/59
④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(6)公
平文
秘暗
送信
秘暗 秘
Bob
Alice
共
共 共
公暗 公暗
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文 平文
⑤
送信する
27/59
④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(7)公
平文
秘暗
送信
秘暗 秘
Bob
Alice
共 共
共 共
公暗 公暗
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文 平文
⑤
送信する
⑥
公開鍵暗号で
共通鍵を復号
28/59④
公開鍵暗号で 共通鍵を 暗号化
通信手順
(8)公
平文
秘暗
送信
平文
秘暗 秘
Bob
Alice
共 共
共 共
公暗 公暗
公
① Bobの公開鍵を
渡しておく
②
共通鍵を生成
③
秘密鍵暗号で 平文を暗号化
平文 平文
⑤
送信する
⑥
公開鍵暗号で 共通鍵を復号
⑦
秘密鍵 暗号で 復号
29/59
通信手順 補足
公
平文
秘暗 送信
平文
秘暗 秘
Bob
Alice
Aliceからの
メールが来た。
復号しよう……。
共 共
共 共
公暗 公暗
パス
+ フレーズ 公
平文 平文
実際には パスフレーズも
使用することが多い
30/59盗聴されても…
Eve
公
平文
平文
暗 送信
平文
平文
暗 秘
BobのBobの
Bob
Alice
共 共
共 共
暗 暗
盗聴しても、
復号できな い
……。
パス
+ フレーズ
31/59
通信手順
以下のような流れで行われる。
1.AliceがBobにメールを送るとする。
2.Aliceは共通鍵を生成し、平文を暗号化する。
3.Aliceは共通鍵を、Bobの公開鍵で暗号化する。
4.Aliceは2と3で生成したものを、Bobにメールする。
5.Bobは、Bobの秘密鍵とパスフレーズで、Aliceから
送られた『暗号化された共通鍵 』 を復号し、共通鍵 を取り出す。
6.Bobは、取り出した共通鍵で、『暗号化された平
文』から平文を取り出す。
Eve
は、
Bobの秘密鍵を知らないため、共通鍵を取り
出せず、結果として平文を入手できない。
32/59まとめ
秘密鍵暗号と公開鍵暗号を組み合わせて使う
1.平文は秘密鍵暗号で暗号化する。
2.
秘密鍵暗号の鍵を公開鍵暗号で暗号化する。
秘密鍵暗号は、事前に秘密鍵を受け渡ししておく必 要がある。
どうやって、鍵を受け渡しておくのか?
→ 公開鍵暗号で秘密鍵暗号の鍵を暗号化。
公開鍵暗号は、処理が重い。
どうやって、大量の平文を通信するのか?
→ 小さい秘密鍵暗号の鍵のみを暗号化。
33/59
何が守れているのか
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
なりすましについて:
特に対処されていないが、攻撃者が秘密鍵を 持っていないなら意味のある通信にならない。
改ざんについて:
特に対処されていないが、改ざんされても意味 のある通信にならない。
さらに認証技術等と組み合わせる必要がある
34/59ssh
35/59
sshとは
Secure Shell の略。
リモートの計算機と安全に通信するためのプロトコ ル。パスワードを含めた全てが暗号化される。
ハイブリット暗号方式を利用している。
なりすましにも、ある程度の耐性がある。
sshは、telnetを置き換えていることが多い。
ftp
を置き換える
sftp等もある。
プロトコルはバージョンが2つある。
(
1の使用は推奨されていない)
36/59
telnetとssh
telnet
の場合
sshの場合
通信は平文 で行われる
通信はすべて暗号化さ
れて行われる
37/59
sshとteraterm
通信するプロトコルを 選択できる
38/59
ssh
プロトコル バージョン1 の 通信の概要
(1)秘
計算機
Alice
公 公
秘
Alice
はリモートの計算機に
接続して利用したい
39/59
ssh
プロトコル バージョン1 の 通信の概要
(1)秘
計算機
Alice
公
①
送信
公
秘
40/59
ssh
プロトコル バージョン1 の 通信の概要
(1)公 秘
計算機
Alice
共
公
①
送信
②
共通鍵を生成
公
公 秘
41/59
③
公開鍵暗号で 共通鍵を 暗号化
ssh
プロトコル バージョン1 の 通信の概要
(1)公
送信
秘
計算機
Alice
共
公暗 共
公
①
送信
②
共通鍵を生成
公
公 秘
42/59
③
公開鍵暗号で 共通鍵を 暗号化
ssh
プロトコル バージョン1 の 通信の概要
(1)公
送信
秘
計算機
Alice
共
共 共
公暗 公暗
公
①
送信
②
共通鍵を生成
④
送信する
公
公 秘
43/59
③
公開鍵暗号で 共通鍵を 暗号化
ssh
プロトコル バージョン1 の 通信の概要
(1)公
送信
秘
計算機
Alice
共 共
共 共
公暗 公暗
公
①
送信
②
共通鍵を生成
④
送信する
⑤公開鍵暗号で 共通鍵を復号 公
公 秘
44/59
③
公開鍵暗号で 共通鍵を 暗号化
ssh
プロトコル バージョン1 の 通信の概要
(1)公
送信
秘
計算機
Alice
共 共
共 共
公暗 公暗
公
①
送信
②
共通鍵を生成
④
送信する
⑤公開鍵暗号で 共通鍵を復号 公
公 秘
⑥
共通鍵暗号を使用し て、今後の通信を行う
Alice
は
Bobに平文を送りたい
45/59
片方はホスト鍵、もう片方はサーバー鍵である
はじめて通信した際、利用者はホスト鍵を保存して おく。
2
回目以降、保存しておいたホスト鍵と送られてきた ホスト鍵を比較する。
ssh
プロトコル バージョン1 の
2本の鍵公
秘 公
秘
ホスト鍵 サーバー鍵
定期的に 作り直す 基本的に
ずっと一緒
46/59
ssh
プロトコル バージョン1 の 通信の概要
2回目以降 (1)公
秘
計算機
Alice
公 公
秘
前回保存しておいた ホスト鍵
47/59
ssh
プロトコル バージョン1 の 通信の概要
2回目以降 (2)公
秘
計算機
Alice
公
①
送信
公
秘 公
公
②
比較する
48/59
ssh
プロトコル バージョン1 の 通信の概要
2回目以降 (3)公
秘
計算機
Alice
公
①
送信
公
秘 公
公
②
比較する
同じだったら、前回と同じ
計算機に接続しようとしている
49/59
ssh
プロトコル バージョン1 の 通信の概要
2回目以降 (3)公
秘
計算機
Alice
公
①
送信
公
秘 公
公
②
比較する
違っていれば、前回と異なる 計算機に接続しようとしている!
なりすまし
50/59
何が守れているのか
盗聴について:
対処されている。間に盗聴者が居ても、内容が 漏れることはない。
なりすましについて:
初回に成功していれば、2回目以降はなりすまし に(ある程度)耐性がある。
改ざんについて:
特に対処されていないが、改ざんされても意味 のある通信にならない。
さらに認証技術等と組み合わせる必要がある
51/59
演習:
C言語で行うシフトと
ビット演算
52/59
UNIXにログインする
今回もUNIXで演習を行いますので、smaxにログインし てください。
今回は、UNIX環境におけるC言語で
シフト演算
ビット演算 を行います。
53/59
C言語における
シフト演算とビット演算
C
言語では
>> , <<でビットシフトを実行できる
C言語では、&, | , ~, ^ でビット毎のand, or, NOT, XOR
が計算できる。
8 >> 1;
// 100を右に1ビットシフトして010に 8 >> 1;
// 100を右に1ビットシフトして010に
8 | 1;
// 100と001にのORを計算して、101になる。
8 | 1;
// 100と001にのORを計算して、101になる。
54/59
使用例
1:#include<stdio.h>
int main(){
short int test;
test=8; // 0000000000000100 printf("%d ¥n",test);
printf("%d ¥n",test >> 1);
printf("%d ¥n",test >> 2);
printf("%d ¥n",test << 1);
printf("%d ¥n",test << 2);
}
#include<stdio.h>
int main(){
short int test;
test=8; // 0000000000000100 printf("%d ¥n",test);
printf("%d ¥n",test >> 1);
printf("%d ¥n",test >> 2);
printf("%d ¥n",test << 1);
printf("%d ¥n",test << 2);
}
コンパイルは
として行う。
gcc sample07a.c gcc sample07a.c
55/59
使用例
1:解説#include<stdio.h>
int main(){
int test;
test=8; // 100 printf("%d ¥n",test);
printf("%d ¥n",test >> 1);
printf("%d ¥n",test >> 2);
printf("%d ¥n",test << 1);
printf("%d ¥n",test << 2);
}
#include<stdio.h>
int main(){
int test;
test=8; // 100 printf("%d ¥n",test);
printf("%d ¥n",test >> 1);
printf("%d ¥n",test >> 2);
printf("%d ¥n",test << 1);
printf("%d ¥n",test << 2);
}
8
は
2進数だと
1000で表される。
1000の1ビット右シフトは 100。10進数の4。
1000の2ビット右シフトは10。
10
進数の
2。
1000
の
3ビット右シフトは
1。
10進数の
1。
1000
の
2ビット左シフトは
100000
。
10進数の
32。
56/59使用例
2:#include<stdio.h>
int main(){
printf("%d ¥n", 10 & 6); // 1010 & 0110 = 0010 printf("%d ¥n", 10 | 6); // 1010 | 0110 = 1110 printf("%d ¥n", 10 ^ 6); // 1010 | 0110 = 1100 }
#include<stdio.h>
int main(){
printf("%d ¥n", 10 & 6); // 1010 & 0110 = 0010 printf("%d ¥n", 10 | 6); // 1010 | 0110 = 1110 printf("%d ¥n", 10 ^ 6); // 1010 | 0110 = 1100 }
コンパイルは
として行う。
gcc sample07b.c gcc sample07b.c
57/59
使用例
2:解説#include<stdio.h>
int main(){
printf("%d ¥n", 10 & 6); // 1010 & 0110 = 0010 printf("%d ¥n", 10 | 6); // 1010 | 0110 = 1110 printf("%d ¥n", 10 ^ 6); // 1010 | 0110 = 1100 }
#include<stdio.h>
int main(){
printf("%d ¥n", 10 & 6); // 1010 & 0110 = 0010 printf("%d ¥n", 10 | 6); // 1010 | 0110 = 1110 printf("%d ¥n", 10 ^ 6); // 1010 | 0110 = 1100 }
58/59
使用例
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
59/59
課題の提出
使用例1~3の実行結果に、3がどのような計算 をしてそのような出力をしたかの説明をつけて、
提出する。
ファイル名は学籍番号の末尾にgをつけたもの とする。