1
情報セキュリティ 第03回
大久保誠也 静岡県立大学経営情報学部
2/28
はじめに
情報セキュリティの技術
暗号
古典的な暗号
演習:シーザー暗号
演習の解説
今日の資料は
http://flute.u-shizuoka-ken.ac.jp/~s-okubo/
の『授業関係』から取ることができます。
3/28
近頃のニュース等
「LINE Amazon 楽天」で検索。
「偽セキュリティソフト」で検索。
4/28
情報セキュリティの技術
5/28
情報理論と暗号
情報理論の応用
情報圧縮
画像や音楽のデジタルデータを圧縮
00000...000000000011111111111111….11111 0が1個,1が200個
誤り訂正
通信路上で誤りが起きたとき、検出・訂正 Alice ----→Bob
000 通信 010
↑間違いを検出・訂正
暗号 今回の話
6/28
この授業で出てくる内容
基礎的な部分
2進数と計算(他の科目でやっているはず)
16進数
一方向関数とハッシュ値
疑似乱数
応用的な部分
暗号技術
認証技術
実際の通信で何が行われているか
7/28
10 進数とは
"ブロック"10個で、(違う大きさの) "ブロック"となる。
14510の意味することは、
1 4 5
10「10個のブロックが 10個集まったもの」が1つ
「10個のブロックが 集まったもの」が4つ
「1個のブロック」
が5つ
1
×10
2104
×10
1105
×10
0108/28
2 進数とは
"ブロック"2個で、(違う大きさの)"ブロック"となる。
11112の意味することは、
1 1 1 1
2「1個のブロック」
が1つ
1
×2
010「1個のブロックが 2個集まった ブロック」
が1つ
1
×2
110「2個のブロック が2個集まった ブロック」が1つ
1
×2
210「2個のブロックが 2個集まった ブロックが 2個集まった ブロック」が1つ
1
×2
3109/28
16進数とは
"ブロック"16個で、(違う大きさの)"ブロック"となる。
0~9とA~Fまでの16個の記号で表現する。
3 3
4 4
1 1
0 0
2 2
10進数 16進数
8 8
9 9
7 7
5 5
6 6
10進数 16進数
D 13
E 14
F 15
B 11
A 10
C 12
10進数 16進数
10/28
16進数への変換
16進数から10進数:
2進数から10進数と同様
10進数から16進数:
2進数から10進数と同様
16進数から2進数:
右の表のようになる
2進数から16進数:
4桁毎に区切って、
右の表。
1010 A
1011 B
0101 5
0110 6
0111 7
1000 8
1001 9
0000 0
0001 1
0010 2
0011 3
0100 4
1100 C
2進数 16進数
2進数 16進数
1111 F
1110 E
1101 D
11/28
排他的論理和
2つの値のうち、
片方のみが1のときに1、
両方が0もしくは1のときには0 となる計算。
XOR、EORともいう。
記号は
。1 1
0
0 0
0
0 1
1
1 0
1
y x x y
12/28 Hello
World
Hello World
盗聴
Hello World
Bob 送信
Alice
Hello World
Hello World
Eve 盗聴
A:>
Hello World 覗き見して
やろう
Aliceから メールが来た。
送信
外部に漏れてな いかなぁ?
13/28
改ざん
9時 集合
12時
送信 集合
12時 集合
このメールは 正しいのかな?
Mallory
通信内容を 書き換えてやれ Alice
Bob
14/28 hogehoge
Mallory
Bob
送信
hogehoge
hogehoge
hogehoge
なりすまし
Aliceからメールが 来たけど、
本当にAliceなのかな?
Aliceを語って 送信だ!
15/28
暗号技術
16/28
Bobに
メールを…… Hello
World
Hello World
電子メールは 非常に便利
Hello
World Bob
送信
Alice
Hello World
早い。
安い。
簡単。
情報化社会に 欠かせないツールに
Aliceから メールが来た。
17/28 Hello
World
Hello World
電子メールは
危険な場合も ……(1)
Hello
World Bob
送信
Alice
Hello World
盗聴
Hello World
Eve 盗聴
A:>
Hello World
覗き見 してやろう
文章がそのまま 流れるので、
悪い人に情報が 漏れる!
Aliceから メールが来た。
送信
18/28
電子メールは
危険な場合も ……(2)
Bob
なりすまし
Hello World
Eve
A:>
Alice
Hello World
Aliceの名 を語って メールを 送信だ!
他人を語って メールを投げら れる!。
本当に本人から 来たのか?。
Hello World
送信
Hello World
Aliceから メールが来た。
19/28
電子メールの
危険な部分 - まとめ
盗聴の危険性
文章内容がそのままネット上を流れる!。
間に悪意のある人がいると、情報が覗かれる!。
なりすましの危険性
他人になりすますことが容易!。
本当に、その人からメールが来たのか、確認でき ない!。
暗号の技術で、すべて解決!
20/28
暗号の目的
平文(送りたい文)を暗号化し、暗号文にする。
この際、鍵を使用する。
This is a pen.
(16進数表記)
5468697320697320612070656E2E0A 平文
test
鍵(16進数表記)
883BC0A17AA746D3DCADCE425C6A10AC
;zB¥j
暗号文暗号化されていると、
元の文章がわからない。
21/28
対策:暗号化
極秘
暗号化されていて、
よくわからんなぁ
Bob
Alice
暗号化することで機密性を保てる あ!
送り間違えた!
極秘 送信
暗号化:
第三者が見ても わからないように 変換すること
22/28
暗号の歴史(1)
シーザー暗号
文字ずらすことで暗号化・復号
ex 暗号化:DOG → GRJ
(各文字を、3文字分後にずらす)
復号 :GRJ →
DOG
(各文字を、3文字分前にずらす)
単純換字暗号
文字を置き換える表に従って暗号化・復号
ex 表:a→v, b→d, c→a
暗号化:abc→
vda
(テーブルの対応に従って各文字を置き換え)
復号 :vda→
abc
(テーブルの対応に従って各文字を置き換え)
23/28
暗号の歴史 (2)
多表式換字暗号
文字を置き換える表を複数使用する
転置式暗号
文字の並ぶ順番を入れ替える
ex: 1文字目を3文字目に、2文字目を1文字目に、
3文字目を4文字目に、4文字目を2文字目に置く。
暗号化:cats →
asct
復号 :asct→cats
スーパー暗号
これらの方式を組み合わせた物。
現代暗号へ 24/28
演習:シーザー暗号
25/28
シーザー暗号
文字ずらすことで暗号化・復号
ex 暗号化:DOG → GRJ
(各文字を、
3
文字分後にずらす)復号 :
GRJ
→DOG
(各文字を、3文字分前にずらす)
文字を
3
文字ずらす処理を,MS-Excel で行えれば良い
シーザー暗号で行いたいこと
26/28
文字と文字コード
各文字は文字コードというコードにより、計算機内部で は扱われている。
さまざまなコードの割り当て方が存在している
SHIFT_JIS :94 4c
ISO-2022-JP(JIS) :47 2d
EUC-JP :c7 ad
UTF-8 :e7 8c ab
”猫”という文字は、
このように表現。
27/28
出てくるExcelの関数
CODE(x)
(文字列x の先頭文字の)文字コードを返す。
CHAR(x)
コード番号x に対応した文字を返す。
MOD(x, y)
xをy で除算した余りを返す。
28/28
演習:シーザー暗号(1)
文字を入力
3を入力
aを入力
=CODE(B3) を入力
=MOD(B4-97+$B$2,26)+97 を入力
=CHAR(B5)を入力
29/28
文字を入力
3を入力
aを入力
=CODE(B3) を入力
=MOD(B4-97+$B$2,26)+97 を入力
=CHAR(B5)を入力
何文字分 ずらすか
平文
(暗号化した い文字)
演習:シーザー暗号 (1)
30/28
文字を入力
3を入力
aを入力
=CODE(B3) を入力
=MOD(B4-97+$B$2,26)+97 を入力
=CHAR(B5)を入力 B3にある文字の文
字コードを求める
aは97、 eは101、
bは98、 …
cは99、
dは100、 zは122
演習:シーザー暗号 (1)
31/28
文字を入力
3を入力
aを入力
=CODE(B3) を入力
=MOD(B4-97+$B$2,26)+97 を入力
=CHAR(B5)を入力
演習:シーザー暗号 (1)
B2の文字数ずらした文字を求める。
B4-97 :
B4の文字がaから何文字あと かを計算
B4-97+3:
3文字ずらす MOD(略, 26):
zの次はaにする必要がある ので、26のあまりを求める MOD(略)+97:
“a”の文字コード(97)を足す。
32/28
文字を入力
3を入力
aを入力
=CODE(B3) を入力
=MOD(B4-97+$B$2,26)+97 を入力
=CHAR(B5)を入力 文字コードを
文字にする
演習:シーザー暗号 (1)
33/28
演習:シーザー暗号(2)
セルの内容を右のセルにもコピー
34/28
演習:シーザー暗号(3)
文字を1文字ずつ入力してみよう
3文字ずれた暗号文が生成されたか確認しよう
35/28
演習:シーザー暗号 (4)
値を変えてみましょう
さっきとは異なった暗号文が生成されたか確認しよう
36/28
課題の提出
今日のMS-Excelのファイルを経情グループウェアから 提出する。
ファイル名は 学籍番号c.xls とすること。
(学籍番号は自分の学籍番号を入力すること)
グループ名は『H27_情報セキュリティ』です。
ユーザーIDとパスワードは、ユニバーサルパスポート 等と同じです。
第5回からsmaxを利用するので、
アカウントを思い出しておくこと
37/28
Visual Studio で(前半)
#include<stdio.h>
int main(){
int i,key;
char plain_text[20],cipher_text[20];
printf("文字列を入力してください。¥n");
scanf("%s",plain_text);
printf("ずらす文字数を入力してください。¥n");
scanf("%d",&key);
#include<stdio.h>
int main(){
int i,key;
char plain_text[20],cipher_text[20];
printf("文字列を入力してください。¥n");
scanf("%s",plain_text);
printf("ずらす文字数を入力してください。¥n");
scanf("%d",&key);
その1/2: 01 02 03 04 05 06 07 08 09 10 01 02 03 04 05 06 07 08 09 10
38/28
Visual Studio で(後半)
その2/2:
for(i=0;i<strlen(plain_text);i++){
cipher_text[i]='a'+(plain_text[i]-'a'+key)%26;
printf("%c->%c¥n",plain_txt[i],cipher_txt[i]);
}
cipher_text[i]='¥0';
printf("暗号文は %s です。¥n",cipher_text);
}
for(i=0;i<strlen(plain_text);i++){
cipher_text[i]='a'+(plain_text[i]-'a'+key)%26;
printf("%c->%c¥n",plain_txt[i],cipher_txt[i]);
}
cipher_text[i]='¥0';
printf("暗号文は %s です。¥n",cipher_text);
} 11 12 13 14 15 16 17 18 11 12 13 14 15 16 17 18
C
言語における文字列(1)
st[0]
t
st[1] st[2] st[3] st[4] st[5] st[6] st[7] st[8] st[9]
e s t ¥0
文字列の最後には、NULL がつきます。
(「つきます」というか、「つけます」)
C言語では、文字列は配列として扱うことができる。
例えば、文字列
"test" が、サイズ10の文字型の配列 stに保存されているなら、
40/28
C言語における文字列(2)
NULLがないと、どうなるのか?
st[0]
t
st[1] st[2] st[3] st[4] st[5] st[6] st[7] st[8] st[9]
e s t ¥0
文字列は test と。
計算機
g o m i ¥0
st[0]
t
st[1] st[2] st[3] st[4] st[5] st[6] st[7] st[8] st[9]
e s t -
文字列は test-test と。
計算機
g o m i ¥0
この¥0 が違う文字だと… …
文字列を扱うときには、文字列の末尾に NULLがついているかどうかが重要になる
41/28
解説 (1)
#include<stdio.h>
int main(){
int i,key;
char plain_text[20],cipher_text[20];
printf("文字列を入力してください。¥n");
scanf("%s",plain_text);
printf("ずらす文字数を入力してください。¥n");
scanf("%d",&key);
#include<stdio.h>
int main(){
int i,key;
char plain_text[20],cipher_text[20];
printf("文字列を入力してください。¥n");
scanf("%s",plain_text);
printf("ずらす文字数を入力してください。¥n");
scanf("%d",&key);
その1/2:
01 02 03 04 05 06 07 08 09 10 01 02 03 04 05 06 07 08 09 10
平文と暗号文を 保存する配列を準備
平文を読み込み。
42/28
解説 (2)
その2/2:
for(i=0; i<strlen(plain_text); i++){
cipher_text[i]='a'+(plain_text[i]-'a'+key)%26;
printf("%c->%c¥n",plain_txt[i],cipher_txt[i]);
}
cipher_text[i]='¥0';
printf("暗号文は %s です。¥n",cipher_text);
}
for(i=0; i<strlen(plain_text); i++){
cipher_text[i]='a'+(plain_text[i]-'a'+key)%26;
printf("%c->%c¥n",plain_txt[i],cipher_txt[i]);
}
cipher_text[i]='¥0';
printf("暗号文は %s です。¥n",cipher_text);
} 11 12 13 14 15 16 17 18 11 12 13 14 15 16 17 18
strlen()は、文字列の長さを返す関数
Excelのときと同様にして3文字ずらす
暗号文の末尾にNULLを付加