情報セキュリティ 第04回 はじめに 現代暗号 日常で使用されている暗号

はじめに
情報セキュリティ
第04回




大久保誠也


静岡県立大学経営情報学部

はじめに
現代暗号とは
秘密鍵暗号と公開鍵暗号
秘密鍵暗号
秘密鍵暗号の構成要素例
演習:秘密鍵暗号の構成要素
演習:C言語でおこなうシフト演算
1
2/28
日常で使用されている暗号

現代暗号

日常でも、結構、暗号は使用している。
Webブラウジング
ユニバーサルパスポート(Web学生支援システ
ム)
Webショッピング
携帯電話の通話内容
意識していなくても、機械が勝手に暗号化された通信
を行ったりしてくれる。
そういう仕組みになっている。
3/28
4/28
firefoxで見るhttps(1)


firefoxで見るhttps(2)
ユニバーサルパスポート(Web学生支援システム)は、
通信が暗号化されています。
大学のTOPページから、 Web学生支援システムにア
クセスしてみましょう。
5/28

httpsで通信している時、FirefoxのURLバーは次のよう
になります

鍵の部分をクリックしてみましょう。
6/28
firefoxで見るhttps(3)

firefoxで見るhttps(4)
認証局(今回はやりませんが、安全性に密接に関係
します)等が表示されます。

詳細を表示させることも可能です。
どの程度の暗号強度なのかも表示されます。
7/28
8/28
firefoxで見るhttps(5)

暗号の目的
httpsでも、正しくない証明書の場合(つまり、安全な
通信でない場合)は、次のようになります。
 平文(送りたい文)を暗号化し、暗号文にする。
 この際、鍵を使用する。
平文
This is a pen.
(16進数表記)
5468697320697320612070656E2E0A
鍵 test
暗号文 ;zB¥j
https://trisha/ にアクセスしてみましょう
(16進数表記)
883BC0A17AA746D3DCADCE425C6A10AC
10/28
9/28
シーザー暗号では弱い

暗号化されていると、
元の文章がわからない。
現代暗号の安全性の根拠
シーザー暗号
文字ずらすことで暗号化・復号
ex 暗号化:DOG → GRJ
(各文字を、3文字分後にずらす)
復号 :GRJ → DOG
(各文字を、3文字分前にずらす)


基本的に、どんな暗号でも、時間をかければ、いずれ
必ず解ける。
安全であるとは『実時間で解くのは難しい』ということ。
数学的な難しさに、安全性の根拠を求めることが多い
この数学の問題は難しそうだ!
今使うには、欠陥が多い。
 単純すぎる。
 鍵が26パターンだけ。総当たりで発見できる。
等々……
11/28
これ元にして暗号を作れば、きっと安全だ!

本当に簡単に解けないかは、証明されていない
(方法を、今の人類が知らないだけの可能性も)
12/28
因数分解は難しい?


因数分解は、現在の計算機では、非常に時間がかか
る問題であると考えられています。
15=3*5は簡単にわかる。
では、75462131は?
正解は、7591*9941。
このぐらいなら、計算機で解けるけど、桁数が大きくな
るほど難しくなる!
公開鍵暗号と秘密鍵暗号
13/28
2種類の暗号方式
暗号と鍵
共
 平文から暗号文を生成するとき、鍵を使用する。
鍵を利用して暗号化
平文
暗号文
 復号するときも鍵を使用する。
適切な鍵を利用しないと、平文に戻せない。
正しい鍵で
複合
暗号文
14/28
公
正しい鍵以外では
複合できない
平文
暗号文
 秘密鍵方式
 暗号化も複合も、同じ鍵を使用する。
 秘密鍵を使用する。鍵は秘匿しておく必要がある。
 一般的に、処理が軽い。
変な
15/63
15/28
文
秘
 公開鍵方式
 暗号化と復号で、異なる鍵を使用する。
 公開鍵と秘密鍵があり、秘密鍵は秘匿し、公開鍵
は公開しておく。
 一般的に、処理が重い。
16/28
秘密鍵暗号
 暗号化も復号も、同じ鍵を使用する。
共
秘密鍵
秘密鍵暗号
共
平文
共
暗号文
暗号文
平文
 秘密鍵は第三者に渡してはいけない。
 処理が軽いため、大きい平文を暗号化できる。
17/28
18/28
秘密鍵のイメージ
秘密鍵暗号による通信
③ 「秘密鍵」で復号
 暗号化も復号も、同じ鍵を使用する。
共
Bob
ID
PASSWD
① 「秘密鍵」で
暗号化
ID
あsdふぁsd
Jlkjぇwkf
② 送信
PASSWD
鍵を持っている人は開けることができて、
鍵を持っていない人は開けることができない
共
あsdふぁsd
Jlkjぇwkf
盗聴しても、
復号できな
い……。
Alice
19/28
20/28
鍵配送問題
Bob
共
① 「秘密鍵」で
暗号化
ID
秘密鍵暗号の構成要素例
PASSWD
Alice
盗聴する
ぞ!
秘密鍵、持って無い!
送ってもらうわけにも
いかないしなぁ
21/28
構成要素の要件
排他的論理和
 暗号文は平文に戻すことができる必要がある!
2つの0,1の値が同じなら0に、
異なっていたら1になる。
記号は で書かれることが多い。
平文+鍵 → 暗号文
暗号文+鍵 → 平文
 では、そのような処理はどういうものか?
少なくとも、可逆でなければならない
秘密鍵暗号方式では、
比較的単純な動作を組み合わせることで
実現していることも多い
22/28
x y x・y
0
0
1
1
0
1
0
1
0
1
1
0
ビット毎の排他的論理和の例:
00101101
・ 10110101
10011000
23/28
10011000
・ 10110101
00101101
もとの
データと
一緒
24/28
順番の入れ替え(1)
順番の入れ替え(2) シフト
ビットごとに、ある規則に従って入れ替える。
すべてのビットを右か左に、おなじだけずらす。
右と左は繋がっている。
0 0 1 0 1 1 0 1
0 0 1 0 1 1 0 1
1 0 0 1 1 1 0 0
1 0 1 0 0 1 0 1 1 0 1
逆に入れ替えると、もとに戻る。
0 0 1 0 1 1 0 1
1 0 0 1 1 1 0 0
逆向きに同じだけシフトすると、もとに戻る。
25/28
26/28
他の方法
 表にしたがって入れ替える。
(表にしたがって逆に戻すと、元に戻る)
 ある一定の規則にしたがって、0や1を付け加える。
(ある一定の規則にしたがって、0や1を取り除くと
元に戻る)
 小さいサイズに分割する。
(結合すると元に戻る)
演習:秘密鍵暗号の構成要素
等々
27/28
28/28
暗号化:順番の入れ替え(1)
暗号化:初期準備
 右に3ビットシフトします。
 鍵と平文を入力しておきましょう。
=G2
29/28
=H2
=F2
=I2
=B2
=C2
=D2
=E2
30/28
暗号化:順番の入れ替え(2)
暗号化:排他的論理和
 25ページ目と同じような入れ替えを行います。
=D3
=C3
 鍵とのビット毎の排他的論理和を行います。
=H3
=B3
=IF(B$1=B4,0,1)
=G3
=F3
=I3
これらも同様
(B5をコピーすればOK)
=E3
31/28
暗号化:以上を繰り返す
32/28
復号:初期準備
 繰り返します
 鍵と暗号文を入力しておきましょう。
コピー
最後の列が暗号文
33/28
復号:順番の入れ替え(2)
復号:排他的論理和
 25ページ目の逆順の入れ替えを行います。
 鍵とのビット毎の排他的論理和を行います。
=IF(B$13=B14,0,1)
34/28
これらも同様
(B15をコピーすればOK)
35/28
=D15
=C15
=G15
=B15
=H15
=F15 =E15
=I15
36/28
復号:順番の入れ替え(1)
復号:以上を繰り返す
 左に3ビットシフトします。
 繰り返します
コピー
=E16
=F16
=D16
=G16
=H16
=I16
=B16
=C16
最後の列が平文
37/28
38/28
やってみよう
課題の提出
 平文は10111001、暗号文は11111111。
 鍵は何でしょう?



今日のMS-Excelのファイルを経情グループウェアか
ら提出する。
ファイル名は学籍番号の末尾にdをつけたものとする。
グループ名は『H26_情報セキュリティ』です。
 実際の暗号では、もっと複雑な式を、もっと長
大な鍵を用いて暗号化しています。
39/28
40/28
課題の概要

演習:
C言語で行うシフトと
ビット演算
41/28
今回は、C言語で
 シフト演算
 ビット演算
を行います。
42/28
C言語における
シフト演算とビット演算

使用例 1:
C言語では >> , << でビットシフトを実行できる
#include<stdio.h>
#include<stdio.h>
88 >>
>> 1;
1;
//
// 100を右に1ビットシフトして010に
100を右に1ビットシフトして010に

int
int main(){
main(){
short
short int
int test;
test;
test=8;
test=8; //
// 0000000000000100
0000000000000100
C言語では、&, | , ~, ^ でビット毎のand, or, NOT,
XORが計算できる。
88 || 1;
1;
//
// 100と001にのORを計算して、101になる。
100と001にのORを計算して、101になる。
}}
コンパイルは
gcc
gcc sample08a.c
sample08a.c
として行う。
printf("%d
printf("%d ¥n",test);
¥n",test);
printf("%d
printf("%d ¥n",test
¥n",test >>
>> 1);
1);
printf("%d
¥n",test
printf("%d ¥n",test >>
>> 2);
2);
printf("%d
¥n",test
<<
1);
printf("%d ¥n",test << 1);
printf("%d
printf("%d ¥n",test
¥n",test <<
<< 2);
2);
43/28
44/28
使用例 1:解説
使用例 2:
#include<stdio.h>
#include<stdio.h>
int
int main(){
main(){
int
int test;
test;
#include<stdio.h>
#include<stdio.h>
8は2進数だと1000
で表される。
test=8;
test=8; //
// 1000
1000
}}
printf("%d
printf("%d ¥n",test);
¥n",test);
printf("%d
printf("%d ¥n",test
¥n",test >>
>> 1);
1);
printf("%d
printf("%d ¥n",test
¥n",test >>
>> 2);
2);
printf("%d
printf("%d ¥n",test
¥n",test <<
<< 1);
1);
printf("%d
printf("%d ¥n",test
¥n",test <<
<< 2);
2);
1000の2ビット左シフトは
100000。10進数の32。
int
int main(){
main(){
コンパイルは
printf("%d
printf("%d ¥n",
¥n", 10
10 && 6);
6); //
// 1010
1010 && 0110
0110 == 0010
0010
printf("%d
1010
|| 0110
printf("%d ¥n",
¥n", 10
10 || 6);
6); //
//gcc
1010sample08b.c
0110 == 1110
1110
gcc
sample08b.c
printf("%d
printf("%d ¥n",
¥n", 10
10 ^^ 6);
6); //
// 1010
1010 || 0110
0110 == 1100
1100
として行う。
}}
1000の1ビット右シフトは
100。10進数の4。
1000の2ビット右シフトは10。
10進数の2。
1000の3ビット右シフトは1。
10進数の1。
45/28
46/28
使用例 3:
#include<stdio.h>
#include<stdio.h>
int
int main(){
main(){
int
int i;
i;
int
int test;
test;
課題の提出

コンパイルは
gcc
gcc sample08c.c
sample08c.c
として行う。

test=6;
test=6; //
// 110
110
}}

使用例1~3の実行結果と、2と3がどのような計算を
してそのような出力をしたかの説明をつけて、提出す
る。
ファイル名は学籍番号の末尾にeをつけたものとする。
グループ名は『H26_情報セキュリティ』です。
for(i=0;i<=3;i++){
for(i=0;i<=3;i++){
printf("------i=%d
printf("------i=%d ¥n",i);
¥n",i);
printf("%d
printf("%d ¥n",test
¥n",test && ii );
);
printf("%d
printf("%d ¥n",test
¥n",test || ii );
);
printf("%d
printf("%d ¥n",test
¥n",test ^^ ii );
);
}}
47/28
48/28