• 検索結果がありません。

情報セキュリティ 第07回

N/A
N/A
Protected

Academic year: 2021

シェア "情報セキュリティ 第07回"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)

情報セキュリティ 第07回

大久保誠也 静岡県立大学経営情報学部

2/36

はじめに

前回の復習

一方向関数とハッシュ値

演習:ハッシュ値

はじめに

3/36

前回の復習

4/36

計算機と乱数:疑似乱数とは

計算機は、基本的に「決まったことしかしない」もの。

乱数のように「予想できないもの」を取り扱うことは できない。

計算機で使用する乱数の多くは疑似乱数。

疑似乱数は、計算機が内部で計算して「乱数っぽいも の」を生成したもの。

疑似乱数は本当の意味での乱数にはなっていない。

疑似乱数をどのように生成するか、いろいろな手法が 検討・提案されている。

5/36

疑似乱数:多くの場合の例

多くの疑似乱数は、種(seed)から、乱数列を生成する。

今までの値を元に、何らかの処理を行い、乱数を生成。

単純な例

処理 値1 処理 値2 処理 値3

乱数値1 乱数値2 乱数値3

処理 処理 処理

6/36

srand()

乱数の種(

seed

)から乱数系列を設定する関数。

rand()

乱数値を生成する関数。

UNIX での乱数値の生成

srand(unsigned int seed) srand(unsigned int seed)

rand() rand()

処理 値1 値2 値3

乱数値1 乱数値2 乱数値3 … srand(略) 1回目の

rand() 2回目の

rand() 3回目の

rand()

(2)

7/36

使用例:

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed = 10;

srand(seed);

for(i=0;i<10;i++){

printf("%d¥n",rand());

} }

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed = 10;

srand(seed);

for(i=0;i<10;i++){

printf("%d¥n",rand());

} }

コンパイルは

として行う。

gcc sample02.c gcc sample02.c

8/36

使用例:解説

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed = 10;

srand(seed);

for(i=0;i<10;i++){

printf("%d¥n",rand());

} }

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed = 10;

srand(seed);

for(i=0;i<10;i++){

printf("%d¥n",rand());

} }

seedの設定

乱数の生成と表示

処理

値1 値2 値3

乱数値1 乱数値2 乱数値3 …

srand(略) 1回目の

rand() 2回目の

rand() 3回目の

rand()

9/36

疑似乱数の式:線形合同法

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed=10, A=1103515245,C=12345;

long x;

x=seed;

for(i=0;i<10;i++){

x=A*x+C;

printf("%d¥n",(int)(x>>16)&32767);

} }

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed=10, A=1103515245,C=12345;

long x;

x=seed;

for(i=0;i<10;i++){

x=A*x+C;

printf("%d¥n",(int)(x>>16)&32767);

} }

コンパイルは

として行う。

gcc sample03.c gcc sample03.c

10/36

プログラムの説明

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed=10, A=1103515245,C=12345;

long x;

x=seed;

for(i=0;i<10;i++){

x=A*x+C;

printf("%d¥n",(int)(x>>16)&32767);

} }

#include<stdio.h>

#include<stdlib.h>

int main(){

int i;

int seed=10, A=1103515245,C=12345;

long x;

x=seed;

for(i=0;i<10;i++){

x=A*x+C;

printf("%d¥n",(int)(x>>16)&32767);

} }

各種の値の設定

種を初期値にする

xをA倍してCを足した ものを、xの新しい値に

x16bit右シフトしたものの下位15bitを乱数値として出力

11/36

補足説明 (1)

x>>16 は何をしているのか?

>> は"ビットシフト"を行う演算です。

ローテイトではないので、外に押し出された部分は 消滅します。

空いた部分には0が入ります。

0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0

3ビットシフトの例

12/36

補足説明 (2)

&32767は何をしているのか?

& は"ビット毎の論理和"を行う演算です。

10進数の32767は、2進数だと111111111111111

(1が15個)です。

たとえば、変数xがあったとして

&32767

は、

x の下位15ビットのみを残す処理になります。

&00000000000000000111111111111111 01100100101011100101011110011011 00000000000000000101011110011011

(3)

13/36

今回の内容

基礎技術:

秘密鍵暗号方式

暗号化

ブロック暗号とストリーム暗号

公開鍵暗号方式

暗号化と認証

ハッシュ値と一方向関数

乱数

実際の実装:

RSA暗号の仕組み

14/36

一方向関数と メッセージダイジェスト

15/36

こういう場合はどうする?

Hello World

Hellow World

Bob 送信

Hellow World

ファイルをダウンロードしてき たけど、正しくダウンロードで

きたかなぁ なんとかして

検証したい

16/36

一方向関数とは

ある関数f が、

任意のx が与えられたとき、f(x)の値を求めること は簡単、

任意のyが与えられたとき、y=f(x)となるx を求 めることは難しい

とき、この関数は一方向関数であるという。

元の値 計算結果

簡単

難解

17/36

メッセージダイジェストとは

ファイルの中身に対応して生成した固定長のbit列

フィンガープリント、ファイルの指紋、ハッシュ値とも

異なる中身の場合、同じメッセージダイジェストになる 可能性は低い(ゼロではない)。

一方向関数である。

暗号と違い、復号はできない。

eee0ca57643e4b59 815847fdd152cd5c

This is a pen.

平文

フィンガープリント 639c7143c6937907 ef3bfbed7501d898

This is a book.

18/36

メッセージダイジェストの利用 (1)

文章のテキストファイルから生成できるビット列 平文 フィンガープリント

異なる平文が、同じ指紋を生成する確率は低い。

平文

A

フィンガー プリント

A

平文

B

フィンガー プリント

B

違う指紋に

平文と指紋を受け取り、比較することで、平文が正し いか否かを判定できる。

(4)

19/36

メッセージダイジェストの利用 (2)

Hello World

Bob

1)送信

メッセージ ダイジェスト

B Hellow

World

Hellow

World メッセージ

ダイジェスト A メッセージ

ダイジェスト A メッセージ

ダイジェスト A

3)比較したら 違う値に!

失敗 している!

2)メッセージ ダイジェストを 計算

20/36

メッセージダイジェストの利用 (3)

多くのサイトで、ファイルの検証用にMD5値が置かれ ています。

21/36

メッセージダイジェストの利用(4)

httpsでも使用されています。

Firefox

では、httpsでの通信 を行っているサイトで、

1. 上の青い部分を押す。

2. 詳細を表示を押す。

3. 証明書を表示を押す ことで確認できます。

22/36

メッセージダイジェストの利用(5)

UNIXのパスワード認証は、実際にはパスワードは

保存されていません。

保存されているのは、パスワードのハッシュ値を保 存しています。

パスワードを入力すると、

1. 入力されたパスワードのハッシュ値を計算。

2. 保存してあるハッシュ値と一致するか検証。

3. 一致していたら認証を通過。

となります。

ようするに、ハッシュ値が同じになるパスワードなら、

パスワードが異なっていても、認証を通ります。

23/36

広く使われている メッセージダイジェスト

メッセージダイジェストの代表的なものとして、MD5や

SHA等があります。

メッセージダイジェストは、いろいろなところで使用さ れています。

OpenOffice.org

のような、ファイルのダウンロード の検証のため。

Windows

UNIX

におけるパスワード認証。

https等の暗号化プロトコル。

メールの暗号化プロトコルである

PGP。

メールの認証プロトコルである

apop

24/36

メッセージダイジェストの利用 (6)

ニュースにも(それらしきものが)登場します。

(5)

25/36

強衝突耐性と弱衝突耐性

弱衝突耐性:

x が与えられたとき、f(x) = f(y)なるy (ただしy≠x) を発見することは難しい。

強衝突耐性:

f(x) = f(y)なるx とy (ただしx≠y) を発見すること は難しい。

MD5は強衝突耐性は無いことが知られている。

26/36

演習:一方向関数とハッシュ値

27/36

Windowsで行うMD5:入手

ファイルをマイクロソフト

http://support.microsoft.com/default.aspx?scid=kb;en-us;841290 からダウンロードしてくる必要があります。

ダウンロードして、

デスクトップに保存 28/36

Windowsで行うMD5:展開

ダウンロードしてきたファイルをダブルクリックして、

ファイルを展開します。

ファイルを置く場所 を聞いてくるので、

デスクトップを指定

29/36

Windows で行う MD5 :実行 (1)

このツールはGUIがないので、コマンドプロンプトで実 行します。コマンドプロンプトを立ち上げます。

すべての プログラム

「アクセサリ」

の中の

「コマンドプロンプト」

30/36

Windows で行う MD5 :実行 (2)

fcivのフルパスを、プロンプトに貼り付けましょう。

fcivをShiftを押し ながら右クリックし、

「パスとしてコピー」

を選択

左上のアイコンをクリックして、

「編集」→「貼り付け」を選択

(6)

31/36

Windows で行う MD5 :実行 (3)

同様にして、どこかのディレクトリを指定します。

実行すると、すべてのファイルのMD5値が出ます。

スペースを一つ空けて、

ディレクトリを指定。

MD5値が表示される

32/36

使い方まとめ

ハッシュ値を求めるのに使用すつ

fciv

というツールは、

以下のように使用します。

指定したフォルダにある全てのファイルのハッシュ値を 出力します。

オプションには、

-both –sha1 –md5 等があり、それぞれ

出力するハッシュ値の種類が変わります。

fciv オプション フォルダ名

fciv オプション フォルダ名

33/36

コマンドプロンプトからのコピー

左上を クリック

『編集』

を選択

『範囲指定』

『コピー』等を 利用

34/36

smaxでのフィンガープリント(1)

1.

smaxにログインする。

2.

Solaris では digest コマンドでMD5の値を求めること

ができる。

として、ファイルのMD5の値を出力してみましょう。

3.

とすることで、ファイルのsha1の値を出力してみま しょう。

%/> digest –a md5 ファイル名

%/> digest –a md5 ファイル名

%/> digest –a sha1 ファイル名

%/> digest –a sha1 ファイル名

35/36

課題でやること

1. テキストファイルを作成する。中身は以下の通り。

2.

md5とsha1のハッシュ値を計算する。

3. テキストファイルを作成する。中身は以下の通り。

4.

md5とsha1のハッシュ値を計算する。

5. 中身が異なっていることを確認する。

catcat

cutcut

36/36

課題でやること

1. さまざまな単語等のMD5値を求め、近い値が出るか 挑戦しましょう。(注:出ません)

2. 入力した単語と、そのMD5値をレポートにまとめてく ださい。

各結果をテキストファイルもしくはWordファイルにま とめ、経情グループウェアから提出しなさい。

ファイル名は学籍番号の末尾に

i をつけたもの。

グループ名は『H28_情報セキュリティ』です。

参照

関連したドキュメント

• これまで作ってきた html ファイルがあるフォルダ ( 講義の指示通りに実行しているなら , デ スクトップ

移動 保存 扱い 廃棄

 DoS攻撃(Denial of Service atack)は、攻撃を行うこ とで、対象となるシステムがサービスを続行することを 難しくする攻撃。.

 DoS攻撃(Denial of Service atack)は、攻撃を行うこ とで、対象となるシステムがサービスを続行することを 難しくする攻撃。.

Aliceからの メールか

 DoS攻撃(Denial of Service atack)は、攻撃を行うこ とで、対象となるシステムがサービスを続行することを 難しくする攻撃。.

 DoS攻撃(Denial of Service atack)は、攻撃を行うこ とで、対象となるシステムがサービスを続行することを 難しくする攻撃。.

公開鍵暗号と 秘密鍵暗号を