情報セキュリティ 第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()
1
7/36
今回の内容
基礎技術:
秘密鍵暗号方式
暗号化
ブロック暗号とストリーム暗号
公開鍵暗号方式
暗号化と認証
ハッシュ値と一方向関数
乱数
実際の実装:
RSA暗号の仕組み
8/36一方向関数と メッセージダイジェスト
9/36
こういう場合はどうする?
Hello World
Hellow World
送信 Bob
Hellow World
ファイルをダウンロードしてき たけど、正しくダウンロードで
きたかなぁ なんとかして
検証したい
10/36
一方向関数とは
ある関数f
が、
任意のx
が与えられたとき、f(x)
の値を求めること は簡単、
任意のy
が与えられたとき、y=f(x)
となるx
を求 めることは難しいとき、この関数は一方向関数であるという。
元の値 計算結果
簡単
難解
11/36
メッセージダイジェストとは
ファイルの中身に対応して生成した固定長のbit列
フィンガープリント、ファイルの指紋、ハッシュ値とも
異なる中身の場合、同じメッセージダイジェストになる 可能性は低い(ゼロではない)。
一方向関数である。
暗号と違い、復号はできない。eee0ca57643e4b59 815847fdd152cd5c
This is a pen.
平文
フィンガープリント
639c7143c6937907 ef3bfbed7501d898
This is a book.
12/36
メッセージダイジェストの利用 (1)
文章のテキストファイルから生成できるビット列 平文 フィンガープリント
異なる平文が、同じ指紋を生成する確率は低い。平文
A
フィンガー プリント
A
平文
B
フィンガー プリント
B
違う指紋に
平文と指紋を受け取り、比較することで、平文が正し いか否かを判定できる。2
13/36
メッセージダイジェストの利用 (2)
Hello World
Bob
1)送信
メッセージ ダイジェスト
B Hellow
World
Hellow
World メッセージ
ダイジェスト A メッセージ
ダイジェスト A メッセージ
ダイジェスト A
3)比較したら 違う値に!
失敗 している!
2)メッセージ ダイジェストを 計算
14/36
メッセージダイジェストの利用 (3)
多くのサイトで、ファイルの検証用にMD5値が置かれ ています。http://www.tnlab.inf.uec.ac.jp/daihinmin/announce/180525.html
15/36
メッセージダイジェストの利用(4)
httpsでも使用されています。
Firefox
では、httpsでの通信 を行っているサイトで、1.
上の青い部分を押す。2.
詳細を表示を押す。3.
証明書を表示を押す ことで確認できます。16/36
メッセージダイジェストの利用(5)
UNIXのパスワード認証は、実際にはパスワードは
保存されていません。
保存されているのは、パスワードのハッシュ値を保 存しています。
パスワードを入力すると、1.
入力されたパスワードのハッシュ値を計算。2.
保存してあるハッシュ値と一致するか検証。3.
一致していたら認証を通過。となります。
ようするに、ハッシュ値が同じになるパスワードなら、パスワードが異なっていても、認証を通ります。
17/36
広く使われている メッセージダイジェスト
メッセージダイジェストの代表的なものとして、MD5やSHA等があります。
メッセージダイジェストは、いろいろなところで使用さ れています。 OpenOffice.org
のような、ファイルのダウンロード の検証のため。 Windows
やUNIX
におけるパスワード認証。 https等の暗号化プロトコル。
メールの暗号化プロトコルであるPGP。
メールの認証プロトコルであるapop
。18/36
メッセージダイジェストの利用 (6)
ニュースにも(それらしきものが)登場します。3
19/36
強衝突耐性と弱衝突耐性
弱衝突耐性: x が与えられたとき、 f(x) = f(y)なるy (
ただしy
≠x) を発見することは難しい。
強衝突耐性: f(x) = f(y)なる x と y (ただし x≠y) を発見すること
は難しい。 MD5は強衝突耐性は無いことが知られている。
20/36
演習:乱数
21/36
本日の課題の概要
今回はUNIXでも演習を行います。
使用するのはsmaxではなく、次の計算機です。
fuko.u-shizuoka-ken.ac.jp
今回は、
UNIX環境での
乱数生成関数rand()を利用した乱数列生成
線形合同法を用いた乱数列生成 を行います。
22/36
fukoへのログイン
Teratermを使用します。
ログイン先は、
fuko.u-shizuoka-ken.ac.jp
ID: b16xxx (←自分のIDを入力)
パスワード:
b16xxxb16xxx (←自分のIDを2回入力)
ログインしたら、パスワードを変更すること。コマンドは
passwd
23/36
Excel での乱数使用
Excelには、乱数値を生成する rand() 関数がありま
す。 種を明示的に設定することはできません。
以下のことをやってみましょう
1.
数個のセルにrand() を書く。
2. 0~1の乱数値が生成されたことを確認する
3. F9 を押すと、乱数値が
更新されることを確認する。24/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()
4
25/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
26/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()
27/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
28/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
を乱数値として出力29/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ビットシフトの例
30/36
補足説明 (2)
&32767は何をしているのか?
& は"ビット毎の論理和"を行う演算です。
10進数の32767は、2進数だと111111111111111
(1が15個)です。
たとえば、変数xがあったとして
&32767
は、
x の下位15ビットのみを残す処理になります。
&00000000000000000111111111111111 01100100101011100101011110011011 00000000000000000101011110011011
5
31/36
他の乱数生成関数
他にも、
drand48()
random()
等の関数が利用できる。
インストールされていれば、メルセンヌ・ツイスタ等も利 用できる。
32/36
課題の提出
学籍番号7桁をseedとして乱数値を10個生成し、その 結果をMS-Wordもしくはテキストファイルに貼り付け、
経情グループウェアから提出しなさい。
MS-Excel、sample02.c、sample03.cのそれぞれにつ
いて行うこと。 ファイル名は学籍番号の末尾にfをつけたものとする。
グループ名は『H30_情報セキュリティ』です。
33/36
演習:一方向関数とハッシュ値
34/36
Windowsでハッシュ値
certutil
を利用することで各種ハッシュ値を求めること ができます。 使用例:コマンドプロンプトで次のように入力
指定したファイルのハッシュ値を出力します。
MD5の部分は、SHA1 や SHA256を指定することもで
きます。(大文字で書きます)certutil -hashfile ファイル名 MD5 certutil -hashfile ファイル名 MD5
35/36
Windows で行う MD5 :実行 (1)
今回は、コマンドプロンプトで実行します。コマンドプロンプトを立ち上げます。
すべての プログラム
「アクセサリ」
の中の
「コマンドプロンプト」
36/36
Windows で行う MD5 :実行 (2)
1. certutil -hashfile
と入力します。2.
ハッシュ値を求めたいファイルをコマンドプロンプトに ドラッグします。(ファイル名がフルパスで入ります)3.
最後にMD5(もしくはSHA1かSHA256)と入力して、エ
ンターする。6
37/36
コマンドプロンプトからのコピー
①
左上を クリック②
『編集』を選択
③
『範囲指定』『コピー』等を 利用
38/36
fuko でのフィンガープリント (1)
1. fukoにログインする。
2. Solaris では digest コマンドでMD5の値を求めること
ができる。として、ファイルのMD5の値を出力してみましょう。
3.
とすることで、ファイルのsha1の値を出力してみま しょう。
%/> digest –a md5 ファイル名
%/> digest –a md5 ファイル名
%/> digest –a sha1 ファイル名
%/> digest –a sha1 ファイル名
39/36
課題でやること
1.
テキストファイルを作成する。中身は以下の通り。2. md5とsha1のハッシュ値を計算する。
3.
テキストファイルを作成する。中身は以下の通り。4. md5とsha1のハッシュ値を計算する。
5.
中身が異なっていることを確認する。catcat
cutcut
40/36
課題でやること
1.
さまざまな単語等のMD5値を求め、近い値が出るか 挑戦しましょう。(注:出ません)2.
入力した単語と、そのMD5値をレポートにまとめてく ださい。 各結果をテキストファイルもしくはWordファイルにま とめ、経情グループウェアから提出しなさい。
ファイル名は学籍番号の末尾に
g をつけたもの。
グループ名は『H30_情報セキュリティ』です。