1
情報セキュリティ 第08回
大久保誠也 静岡県立大学経営情報学部
2/63
はじめに
はじめに
復習
公開鍵暗号方式のもう一つの使い方
なりすましの防止と電子署名
演習
3/63
今までの復習
4/63
今までやってきた基礎技術
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
5/63
秘密鍵暗号
暗号化も復号も、同じ鍵を使用する。
共
秘密鍵
秘密鍵は第三者に渡してはいけない。
処理が軽いため、大きい平文を暗号化できる。
共 共
平文 暗号文 暗号文 平文
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
6/63
公開鍵暗号方式
暗号化と復号では、異なる鍵を使用する。
公開鍵で暗号化し、秘密鍵で復号する。
秘密鍵は第三者に渡してはいけない。
処理が重いため、基本的に小さい平文を暗号化する。
公 秘
平文 暗号文 暗号文 平文
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
7/63
ハッシュ値と 一方向関数
文章のテキストファイルから生成できるビット列 平文 フィンガープリント
異なる平文が、同じ指紋を生成する確率は低い。
平文 A
フィンガー プリント
A
平文 B
フィンガー プリント
B 違う指紋に
平文と指紋を受け取り、比較することで、平文が正し いか否かを判定できる。
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
8/63
乱数
数列の中でも、過去の数列から、次の数が予想できな いものを、乱数列という。
つまり、x1, x2, … , xtから次のxt+1が予想できない。
一般に、計算機が使用するのは疑似乱数。
単純な例
種 処理 値1 処理 値2 処理 値3 …
乱数値1 乱数値2 乱数値3
処理 処理 処理
… 次の値は
予想できない
基礎技術:
秘密鍵暗号方式
公開鍵暗号方式
ハッシュ値と一方向関数
乱数
9/63
RSA 暗号のもう一つの特徴
10/63
復習:公開鍵暗号の鍵 (1)
暗号化と復号では、異なる鍵を使用する。
公開鍵で暗号化し、秘密鍵で復号する。
秘密鍵は第三者に渡してはいけない。
処理が重いため、基本的に小さい平文を暗号化する。
公 秘
平文 暗号文 暗号文 平文
11/63
公開鍵暗号の鍵 (2)
提案されている実現方法は、秘密鍵で暗号化し、公 開鍵で復号できる公開鍵暗号方式が多い。
この性質は、「認証」を実現する際に利用されている。
前回のRSA暗号も、この性質を備えている。
秘 公
平文 暗号文 暗号文 平文
12/63
直感的なイメージ (1)
Hello World
Hello World Hello
World Bob
送信
Alice
Hello World
送信
このファイル、本当にAliceか ら送られてきたのかなぁ...
13/63
公開鍵暗号方式と認証
「Aliceの公開鍵」で復号できる暗号文なら、その暗号 文は「Aliceの秘密鍵」で作成したに違いない。
「Aliceの秘密鍵」で暗号化できるのは、秘密鍵を持っ
ているAliceだけ。
「Aliceの公開鍵」で復号できるものは、
Aliceのファイルに違いない!
14/63 hogehoge
Alice
Bob
② 送信
あsdふぁsd Jlkjぇwkf
③ 暗号文を「Aliceの公開鍵」で 復号
hogehoge
あsdふぁsd Jlkjぇwkf
① 平文を
「Aliceの秘密鍵」で 暗号化
直感的なイメージ (2)
Aliceの公開鍵で復号できた!
暗号文を作れるのはAliceだ けだから、このファイルはAlice
のだ!
15/63 hogehoge
Mallory
Bob
② 送信
Asdfasdfasdf adfasdf
③ 暗号文を「Aliceの公開鍵」で 復号
sdlakfjl Hoaslkjlsalf;j;
Asdfasdfasdf adfasdf
① 平文を
「Malloryの秘密鍵」で 暗号化
直感的なイメージ (3)
Aliceの公開鍵で復号に失敗!
このファイルは、Aliceのもので はない!?
Aliceを語って
送信だ! 16/63
なりすましの防止と 電子署名
17/63
認証と秘密鍵
なりすましを防止するには、どうすればよいか?
→ ようするに、相手が本当に本人か確認したい!
認証・署名
実世界では、印鑑やサイン、パスワードで本人確認。
本人確認は、「本人しか持っていない情報を持ってい るか」で確認する。
秘密鍵は「本人しか持っていない情報」 18/63
なりすまし防止の アイディア (1)
秘 公 Aliceの
Bob
Alice
AliceからBobにファイルを送るので、
BobはAliceからのファイルかを 検証したい
19/63
なりすまし防止の アイディア (2)
秘
送信
公 Aliceの
Aliceの
Bob
Alice
① Aliceの公開鍵を
事前に渡しておく
20/63
なりすまし防止の アイディア (3)
秘
平文
フィンガー プリント
公 Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
① 公開鍵を 事前に渡しておく
21/63
なりすまし防止の アイディア (4)
秘
平文
フィンガー プリント
公 Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を
事前に渡しておく 22/63
なりすまし防止の アイディア (5)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信
平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
23/63
なりすまし防止の アイディア (6)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信
平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
フィンガー
プリント ⑤ 復号する Aliceからの
メールか 検証しよう……
24/63
なりすまし防止の アイディア (7)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信
平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
フィンガー
プリント ⑤ 復号する フィンガー
プリント
⑥ ハッシュ値を計算 Aliceからの
メールか 検証しよう……
25/63
なりすまし防止の アイディア (8)
秘
平文
フィンガー プリント
Aliceの Aliceの
Bob
Alice
② ハッシュ値 を計算
フィンガー プリント 公暗
③ 秘密鍵で 暗号化
① 公開鍵を 事前に渡しておく
送信
送信
平文
フィンガー プリント
公 公暗
④ 送信
④ 送信
フィンガー
プリント ⑤ 復号する フィンガー
プリント
⑥ ハッシュ値を計算
⑦ 比較して同じなら Aliceからの メールだ!
Aliceからの メールか 検証しよう……
26/63 フィンガー
プリント フィンガー プリント
なりすまされた場合 (1)
平文
暗
公 Eveの
Bob
Aliceからの メールか 検証しよう……
なりすまし
Eve パス
+フレーズ
① 公開鍵を 事前に渡しておく EveがAliceの名前を騙って、
Bobにファイルを送る。
BobはAliceのファイルか検証したい
27/63 フィンガー
プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
なりすまされた場合 (2)
平文
暗
送信
送信
平文
異なる 何か
暗 公
Aliceの Eveの
Bob
Aliceからの メールか 検証しよう……
Aliceの公開鍵で 元に戻せない!。
Aliceからの メールじゃない!
なりすまし
Eve
28/63 フィンガー
プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
なりすまされた場合 (3)
平文
暗
送信
送信
平文
異なる 何か
暗 公
Aliceの Eveの
Bob
Aliceからの メールか 検証しよう……
Aliceの公開鍵で 元に戻せない!。
Aliceからの メールじゃない!
なりすまし
Eve
Eveは Aliceの秘密鍵を
知らないので、
Aliceの公開鍵で 復号できる 暗号化済み指紋を
作れない。
29/63 フィンガー
プリント フィンガー プリント
改竄された場合 (1)
平文
暗
送信
送信
公 Aliceの
Bob
Aliceからの メールか 検証しよう……
送信中に、
データが変わって しまった!
パス
+フレーズ 秘 Aliceの
Alice 30/63
異なる フィンガー
プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
改竄された場合 (2)
平文
暗
送信
送信
異なる 平文
フィンガー プリント
暗 公
Aliceの
Bob
Aliceからの メールか 検証しよう……
Aliceの公開鍵で 元に戻せない!。
正常に通信できて ない!
パス
+フレーズ 秘 Aliceの
Alice
31/63 異なる
フィンガー プリント
フィンガー プリント フィンガー
プリント フィンガー プリント
改竄された場合 (3)
平文
暗
送信
送信
平文
フィンガー プリント
暗 公
Aliceの
Bob
Aliceからの メールか 検証しよう……
Aliceの公開鍵で 元に戻せない!。
正常に通信でき ていない!
秘 Aliceの
Alice
指紋の値が異なるので、
正常に通信できていないことが わかる。
32/63
なりすまし防止のアイディア (4)
以下のような流れで行われる。
1.Aliceは平文のフィンガープリントを作成する。
2.AliceはAliceの秘密鍵とパスフレーズでフィンガープ リントを暗号化
3.Aliceは、平文と3で生成したものを、Bobにメール 4.Bobは、Aliceの公開鍵でAliceから送られた『暗号化
されたフィンガープリント』を復号する。
5.Bobは、『Aliceから送られてきた平文』から作ったフィ ンガープリントと、4のフィンガープリントを比較する。
33/63
何が守れているのか
盗聴について:
対処されていない。
なりすましについて:
対処されている。
ただし、改竄と区別は付かない。
改竄について:
対処されている。
ただし、なりすましと区別は付かない。
さらに暗号技術等と組み合わせる必要がある
34/63
次のステップ
暗号技術で盗聴に、認証技術でなりすましや改竄を 防止することができる。
説明のあちこちにある「公開鍵を事前に渡しておく」
の具体的な方法が、今のところノータッチ。
偽物の公開鍵を掴まされたりしないか?
直に会えば確実だけど、相手が地球の裏側に居 たりするなら、どうするの?
暗号技術と認証技術を組み合わせれば、
これらすべてに対処できる(はず)!
35/63
演習:
C
言語で行うシフトと ビット演算
36/63
UNIX にログインする
今回もUNIXで演習を行いますので、smaxにログインし てください。
今回は、UNIX環境におけるC言語で
シフト演算
ビット演算 を行います。
37/63
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になる。
38/63
使用例 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 sample08a.c gcc sample08a.c
39/63
使用例 1 :解説
#include<stdio.h>
int main(){
int test;
test=8; // 1000 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; // 1000 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。 40/63
使用例 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 sample08b.c gcc sample08b.c
41/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 sample08c.c gcc sample08c.c
42/63
課題の提出
使用例1~3の実行結果と、2と3がどのような計算をし てそのような出力をしたかの説明をつけて、提出する。
ファイル名は学籍番号の末尾にhをつけたものとする。
グループ名は『H25_情報セキュリティ』です。