情報セキュリティ 第05回
大久保誠也 静岡県立大学経営情報学部
2/42
はじめに
秘密鍵暗号の復習
公開鍵暗号の考え方
RSA暗号
演習:RSA暗号
はじめに
3/42
前回の復習
4/42
論理積
x y x y 0 0 0 0 1 0 1 0 0 1 1 1
ビット毎の論理積の例:2つの0,1の値がどちらも1なら1に、
さもなければ0になる。
記号は
で書かれることが多い。C言語等ではビット毎の論理積を&で書く
00100101 00101101
&10110101
5/42
論理和
x y x y 0 0 0 0 1 1 1 0 1 1 1 1
ビット毎の論理和の例:2つの0,1の値のどちらかが1なら1に、
さもなければ1になる。
記号は
で書かれることが多い。C
言語等ではビット毎の論理積を|
で書く10111101 00101101
| 10110101
6/42
排他的論理和
x y x y 0 0 0 0 1 1 1 0 1 1 1 0
ビット毎の排他的論理和の例:2つの0,1の値が同じなら0に、
異なっていたら1になる。
記号は
で書かれることが多い。10011000
もとのデータと
00101101
一緒 10110101 10011000
00101101
10110101
7/42
使用例 3 :
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
6の2進数表記は0110 i=0からスタート 0
の2
進数表記は0000
0110 & 0000 = 0000 10進数表記で0
0110 | 0000 = 0110 10進数表記で6 0110 ^ 0000 = 0110
10
進数表記で6
8/42使用例 3 :
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
6の2進数表記は0110 i=1のとき
1
の2
進数表記は0001
0110 & 0001 = 0000 10進数表記で0
0110 | 0001 = 0111 10進数表記で7 0110 ^ 0001 = 0111 10
進数表記で7
9/42
使用例 3:
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
6
の2
進数表記は0110 i=2のとき
2の2進数表記は0010
0110 & 0010 = 0010 10進数表記で2
0110 | 0010 = 0110 10進数表記で6 0110 ^ 0010 = 0100
10進数表記で4
10/42使用例 3:
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
#include<stdio.h>
int main(){
int i;
int test;
test=6; // 110 for(i=0;i<=3;i++){
printf("---i=%d ¥n",i);
printf("%d ¥n",test & i );
printf("%d ¥n",test | i );
printf("%d ¥n",test ^ i );
} }
6
の2
進数表記は0110 i=3のとき
3の2進数表記は0011
0110 & 0011 = 0010 10進数表記で2
0110 | 0011 = 0111 10進数表記で7 0110 ^ 0011 = 0101 10進数表記で5
11/42 11/63
暗号と鍵
平文から暗号文を生成するとき、鍵を使用する。
復号するときも鍵を使用する。適切な鍵を利用しないと、平文に戻せない。
平文 暗号文
平文 暗号文
鍵を利用して暗号化
正しい鍵で 複合
変な 暗号文 文
正しい鍵以外では 複合できない
12/42
2 種類の暗号方式
秘密鍵方式
暗号化も複合も、同じ鍵を使用する。
秘密鍵を使用する。鍵は秘匿しておく必要がある。
一般的に、処理が軽い。
公開鍵方式
暗号化と復号で、異なる鍵を使用する。
公開鍵と秘密鍵があり、秘密鍵は秘匿し、公開鍵 は公開しておく。
一般的に、処理が重い。共
公 秘
13/42
秘密鍵暗号
暗号化も復号も、同じ鍵を使用する。共
秘密鍵
秘密鍵は第三者に渡してはいけない。
処理が軽いため、大きい平文を暗号化できる。共 共
平文 暗号文 暗号文 平文
14/42
秘密鍵のイメージ
暗号化も復号も、同じ鍵を使用する。鍵を持っている人は開けることができて、
鍵を持っていない人は開けることができない 鍵を持っている人は開けることができて、
鍵を持っていない人は開けることができない
15/42 ID
PASSWD
Alice
Bob
② 送信
あsdふぁsd Jlkjぇwkf
③ 「秘密鍵」で復号
ID PASSWD
あsdふぁsd Jlkjぇwkf
① 「秘密鍵」で 暗号化
盗聴しても、
復号できな い……。
共
共
秘密鍵暗号による通信
16/42 ID
PASSWD
Alice
Bob
① 「秘密鍵」で 暗号化
盗聴する ぞ!
共
秘密鍵、持って無い!
送ってもらうわけにも いかないしなぁ
秘密鍵暗号と鍵配送問題
17/42
鍵配送問題解決のアイデア
ID PASSWD
Alice
Bob
盗聴する ぞ!
開ける鍵と閉める鍵を わけちゃえば いいんじゃない?
18/42
公開鍵暗号
19/42
公開鍵と秘密鍵 (1)
秘密鍵と公開鍵は、一対のもの公 秘
公開鍵 秘密鍵
ペア
秘密鍵は、自分しか知らない。
公開鍵は、世間に公開する。
処理が重いため、小さい平文を暗号化するのに使用 される。例えば、秘密鍵暗号の秘密鍵を暗号化する。20/42
秘密鍵と公開鍵 (2)
暗号化と復号では、異なる鍵を使用する。公開鍵で暗号化し、秘密鍵で復号する。
秘密鍵は第三者に渡してはいけない。
処理が重いため、基本的に小さい平文を暗号化する。公 秘
平文 暗号文 暗号文 平文
21/42
秘密鍵と公開鍵(3)
提案されている実現方法は、秘密鍵で暗号化し、公 開鍵で復号できる公開鍵暗号方式が多い。
この性質は、次回以降に行う「認証」を実現する際に 利用されている。秘 公
平文 暗号文 暗号文 平文
22/42
公開鍵暗号のイメージ
鍵付きの貯金箱:
誰でも中にお金を入れることができる(箱が公開鍵に相当)。
中身を取り出せるのは鍵を持っている人だけ。(鍵が秘密鍵に相当)
ID PASSWD
Alice
Bob
③ 送信
あsdふぁsd Jlkjぇwkf
④ 「秘密鍵」で復号
ID PASSWD
あsdふぁsd Jlkjぇwkf
② 「公開鍵」で 暗号化
秘 公
① 送信
公
公開鍵暗号方式
盗聴しても、
復号できな
公 い……。
代表的な暗号
公開鍵暗号方式 RSA暗号
楕円曲線暗号
秘密鍵暗号方式 DES
AES
RC4
いろいろあります
25/42 ID
PASSWD
Alice
Bob
③ 送信
あsdふぁsd Jlkjぇwkf
あsdふぁsd Jlkjぇwkf
② 偽「公開鍵」で 暗号化
① 送信
公
鍵配送問題
復号できる
秘 ぞ 差し替えて
公 やろう
公
本物である 保証は?
26/42
RSA 暗号
27/42
RSA暗号とは
代表的な公開鍵暗号方式の一つ。 1977年に、Rivest、Shamir、Adelmanの3人が発見。
当時、まだアイデアしかなかった公開鍵暗号方式に、
具体的な実現方法を示した。
最初の公開鍵暗号方式だが、現在でも幅広く使用さ れている。
因数分解の難しさに安全性の根拠を置く。
因数分解が解けると、暗号も解ける。
因数分解が、将来も難しい保証はない。あくまでも、今の人類が効率的な解き方を知らな
いだけ。 28/42
RSA暗号の鍵
秘密鍵
素数p
素数q
(p 1)(q 1)と素かつ(p 1)(q 1)より小さい、
適当な正の整数
e
公開鍵 n=p q
ed mod (p 1)(q 1)= 1 となるような d
29/42
RSA 暗号の暗号化と復号
平文
を暗号化して暗号文Cを作成する場合。 C=M
dmod n
ここでd
とn
は公開鍵であることに注意。
平文
を暗号化して暗号文C
を作成する場合。 M=C
emod n
ここでe
は秘密鍵、nは公開鍵であることに注意。
公開鍵n
が因数分解できてp
とq
がわかると、p,q,d
から秘密鍵e
もばれてしまう!30/42
RSA 暗号の理屈
C
emod n は本当に元の平文Mに戻るのか?
M
n C
emod
n n
M
dmod )
emod
(
n M
edmod
n M
(p1)(q1)1mod
オイラーの定理より pとqが素数ならば
ed
の決め方から数式を展開 Cの作り方より
31/42
演習: RSA 暗号
32/42
演習: RSA 暗号 鍵の準備 (1)
素数を入力
素数を入力 (p1)(q1)より小さく、(p1)(q1) と素な、正の数を入力
33/42
演習:RSA暗号 鍵の準備(2)
=B3*B4
と入力LCM(B3-1,B4-1)
と入力34/42
演習:RSA暗号 鍵の準備(3)
ed/B8のあまりの値が1になるような d
を探して入力演習: RSA 暗号 暗号化 (1)
暗号化したい値を入力
nより小さい値
演習: RSA 暗号 暗号化 (2)
=B11
=mod(F3*$B$11,$B7) F4のセルを
コピーして ペースト 計算したM^eを入力。今回は=F7
37/42
演習: RSA 暗号 復号
暗号化と同様にしてC^dを計算
計算したC^dを入力。
今回は=I13 38/42
注意点
mod は、あまりを計算する演算です。
例:10÷3= 3 あまり 1 なので、
10 mod 3 = 1 となる。
今回の演習では、MS-Excelの制限で、あまり大きい 値を暗号化・復号することができません。
小さい値で行いましょう。
39/42
やること
40/42
課題の提出
今日のMS-Excelのファイルを経情グループウェアから 提出する。
ファイル名は学籍番号の末尾にfをつけたものとする。
グループ名は『H28_情報セキュリティ』です。