情報セキュリティ 第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()
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の新しい値に
xを16bit右シフトしたものの下位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
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
違う指紋に平文と指紋を受け取り、比較することで、平文が正し いか否かを判定できる。
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)
ニュースにも(それらしきものが)登場します。
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を押し ながら右クリックし、
「パスとしてコピー」
を選択
左上のアイコンをクリックして、
「編集」→「貼り付け」を選択
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_情報セキュリティ』です。