| 目次 | 索引 |
|---|---|
h2 暗号 toc-cryptography
h3 暗号の仕組み toc-cryptography-system
index 暗号 cryptography あんこう
とは、秘密の通信を行う仕組みのことです。
暗号における登場人物は、送信者、受信者、および悪意の第三者です。
送信者は受信者に対してメッセージを送ります。
このとき、何らかの方法でメッセージを変換してから送信します。
通信の途中で第三者はメッセージを盗聴しますが、
変換されたメッセージはなかなか理解できません。
一方、受信者は変換方法についての知識を持っていますので、
受信したメッセージを逆変換して内容を理解します。
変換前のメッセージを
index 平文 plaintext ひらふん
と呼び、変換後のメッセージを
index 暗号文 cryptogram あんこうふん
と呼びます。
変換方法についての知識は、
index 鍵 key かき
と呼ばれます。
暗号文に変換することを
index 暗号化 encryption あんこうか
と言い、鍵を使って元に戻すことを
index 復号 decryption ふくこう
と言います。
鍵を使わずに元に戻すことを
index 解読 cryptanalysis かいとく
と言います。
良い暗号とは、暗号化と復号が簡単で、解読が難しいものです。
h3 単純な暗号 toc-simple-cryptographies
話を簡単にするために、平文はアルファベットの大文字の列とし、
スペースは使わないことにします。
はじめに紹介するのは
index シーザー暗号 Caesar cipher しいさああんこう
です。
これは、平文の文字を、
アルファベット順の K 個後の文字に置き換えるものです。
ただし、'Z' の次は 'A' に戻るとします。
シーザー暗号では、K の値が鍵になります。
復号は、K 個前の文字に置き換えるとできます。
例えば、平文を "HIDEYONOGUCHI" とし、
K = 3 としますと、暗号文は "KLGHBRQRJXFKL" となります。
シーザー暗号はすぐに解読されます。
なぜなら、K = 1, K = 2, ..., K = 25 をすべて試し、
意味の通るものを選べばよいからです。
シーザー暗号を拡張したものに、
index ビジネル暗号 Vigenere cipher ひしねるあんこう
があります。
ビジネル暗号では、鍵はアルファベットの列です。
例として、平文を "ICHIYOHIGUCHI" とし、
鍵を "ABC" とします。
まず、平文を書き、その下に鍵を繰り返し書きます。
そして、平文の文字の直下が 'A' ならば、
アルファベット順の次の文字に置き換え、
'B' ならば次の次の文字に置き換え、'C' ならば 3 個後の文字に置き換え、
…とします。
ICHIYOHIGUCHI 平文
ABCABCABCABCA 鍵
JEKJARIKJVEKJ 暗号文
ビジネル暗号では、鍵が長ければ長いほど解読が難しくなります。
h3 公開鍵方式 toc-public-key-system
シーザー暗号でもビジネル暗号でも、
暗号解読者に鍵が盗まれますと、もうおしまいです。
したがって、鍵は通信相手に安全に配送し、厳重に管理する必要があります。
しかし、通信相手が増えますと、鍵の配送と管理が負担になってきます。
例えば、A 子は友達の B 子と秘密の通信をするために、
B 子のための鍵を作り、
それを B 子に (直接会うなどして) こっそり教えたとします。
そして、A 子は新たに C 子と友達になり、
C 子とも秘密の通信を始めるとします。
このとき、C 子に B 子のための鍵を教えるわけにはいきません。
なぜなら、B 子とのやり取りが C 子に解読されてしまうからです。
結局、友達が一人増えるたびに新しい鍵を作り、
それをこっそり教えることになります。
何度も鍵をこっそり教えることも、
たくさんの鍵を盗まれないようにすることも大変です。
この問題を解決するために、
暗号化の鍵と復号の鍵を別にする暗号方式が考え出されました。
この方式では、暗号化の鍵は広く世間に公開します。
復号の鍵は秘密にしておきます。
これが、
index 公開鍵方式 public key system こうかいかきほうしき
です。
公開する鍵を
index 公開鍵 public key こうかいかき
と呼び、秘密にする鍵を
index 秘密鍵 secret key ひみつかき
と呼びます。
公開鍵方式に対して、暗号化の鍵と復号の鍵が同じ暗号方式を、
index 共通鍵方式 common key system きようつうかきほうしき
と呼びます。
公開鍵方式では、
A 子は自分の公開鍵をホームページなどを使って公開します。
秘密鍵は自分のパソコンなどに保存し、他人には一切教えません。
A 子に対して B 子が送信を行う場合、
B 子は A 子の公開鍵を取得し、これを使って暗号化します。
暗号文を受信した A 子は、自分の秘密鍵を使って復号します。
B 子も自分の公開鍵を公開してくれれば、
A 子から B 子への通信も行えます。
また、A 子は C 子のための新しい鍵を作る必要もありません。
公開鍵方式では、秘密鍵を一度も他人に教えることはありません。
また、通信相手が増えても、
秘密鍵は自分のものを一つだけ管理すればよいのです。
公開鍵方式が成立するためには、以下の条件が必要です。
・公開鍵で暗号化して秘密鍵で復号すると、元の平文に戻る。
・公開鍵と秘密鍵は異なる。
・公開鍵から秘密鍵を求めることは、コンピュータを使っても難しい。
・暗号化も復号も、コンピュータで簡単に処理できる。
この条件を満たす暗号方式としては、
RSA アルゴリズムが有名です。
index RSA アルゴリズム RSA algorithm RSAあるこりすむ
は、数論に基づいた暗号化・復号の方法です。
これは、まず、100 桁程度の素数を 3 個ランダムに生成し、
最大のものを s とし、残りを q, r とします。
n = q * r と置きます。
n は 200 桁程度になります。
次に、条件
(p * s) % ((q - 1) * (r - 1)) = 1
を満たす p (≠ s) を探します。
ここで、% は割った余りを求めるという剰余演算です。
このとき、公開鍵は (p, n) であり、
整数 x (0 ≦ x < n) の暗号化は式 x ^ p % n によって行われます。
ここで、x ^ p は x を p 回掛けるという、べき乗演算です。
秘密鍵は (s, n) であり、
整数 x (0 ≦ x < n) の復号は式 x ^ s % n によって行われます。
数学的な性質により、
この暗号化を行ってからこの復号を行うと元に戻ります。
暗号化と復号の式のべき乗演算と剰余演算は、
少し工夫しますと、コンピュータで簡単に計算できます。
問題は、公開鍵 (p, n) から秘密鍵 (s, n) がなかなか導けないことです。
s を知るためには、どうしても q と r が必要です。
これは、n を因数分解するしかありません。
しかし、200 桁もの整数を因数分解するのは、
コンピュータで何万年もかかる難問であると考えられています。
ここで、RSA アルゴリズムの具体例を示します。
ただし、本来の 100 桁程度の計算は理解の妨げになりますので、
1〜2 桁の計算で済むようにします。
また、本来の n は 200 桁程度になりますので、
平文のビット列を 700 ビット程度 (10^200≒2^700) のブロックに
分割してから暗号化しますが、
ここでの n は小さな数ですので、平文を 1 文字ごとに暗号化します。
まず、3 個の素数 19, 17, 3 を選び、
q = 17, r = 3, s = 19 とします。
n = q * r = 51 です。
上記の条件
(p * s) % ((q - 1) * (r - 1)) = 1
を満たす p を探し、p = 27 を見つけます。
したがって、公開鍵は (p, n) = (27, 51) であり、
秘密鍵は (s, n) = (19, 51) です。
平文を "HIDEYONOGUCHI" とします。
下記の表にしたがって符号化しますと、
7 8 3 4 24 14 13 14 6 20 2 7 8
となります。
式 x ^ p % n によって暗号化しますと、
31 2 24 13 48 44 4 44 39 41 8 31 2
となります。
したがって、暗号文は "fCYNwsEsnpIfC" となります。
式 x ^ s % n によって復号しますと、
7 8 3 4 24 14 13 14 6 20 2 7 8
となります。
したがって、元の平文 "HIDEYONOGUCHI" に戻ります。
文字 符号 べき乗
7 19 21 23 27 29
---------------------------------
A 0 0 0 0 0 0 0
B 1 1 1 1 1 1 1
C 2 26 8 32 26 8 32
D 3 45 27 39 45 24 12
E 4 13 13 4 13 13 4
F 5 44 23 14 44 11 20
G 6 48 12 24 48 39 27
H 7 46 37 28 46 31 40
I 8 32 2 26 32 2 26
J 9 36 15 42 36 15 42
K 10 22 31 40 22 37 28
L 11 20 5 44 20 29 41
M 12 24 45 3 24 6 48
N 13 4 4 13 4 4 13
O 14 23 41 29 23 44 5
P 15 42 9 36 42 9 36
Q 16 16 16 16 16 16 16
R 17 17 17 17 17 17 17
S 18 18 18 18 18 18 18
T 19 43 25 49 43 25 49
U 20 11 44 5 11 41 29
V 21 30 30 21 30 30 21
W 22 10 40 31 10 28 37
X 23 14 29 41 14 5 44
Y 24 12 3 45 12 48 6
Z 25 49 19 43 49 19 43
a 26 2 32 8 2 32 8
b 27 39 48 6 39 3 45
c 28 37 22 10 37 46 7
d 29 41 11 20 41 23 14
e 30 21 21 30 21 21 30
f 31 40 7 46 40 10 22
g 32 8 26 2 8 26 2
h 33 33 33 33 33 33 33
i 34 34 34 34 34 34 34
j 35 35 35 35 35 35 35
k 36 9 42 15 9 42 15
l 37 28 10 22 28 7 46
m 38 47 47 38 47 47 38
n 39 27 6 48 27 45 3
o 40 31 46 7 31 22 10
p 41 29 20 11 29 14 23
q 42 15 36 9 15 36 9
r 43 19 49 25 19 49 25
s 44 5 14 23 5 20 11
t 45 3 39 27 3 12 24
u 46 7 28 37 7 40 31
v 47 38 38 47 38 38 47
w 48 6 24 12 6 27 39
x 49 25 43 19 25 43 19
y 50 50 50 50 50 50 50
例題 1.
A 子は、RSA アルゴリズムのための素数として
q = 17, r = 3, s = 23 を選び、n = q * r = 51 とし、
(p, n) = (7, 51) を公開鍵として友達全員に公開し、
(s, n) = (23, 51) を秘密鍵として自分のパソコンに隠しておきました。
1. この公開鍵と秘密鍵が、
RSA アルゴリズムの条件を満たしていることを確認してください。
2. A 子の友達になったつもりで、人名など、
アルファベット 10 文字以上の平文を考え、
それを公開鍵によって暗号化してください。
x ^ p % n の計算は上記の表を利用してください。
3. A 子になったつもりで、受け取った暗号文を、
秘密鍵によって復号してください。
x ^ s % n の計算は上記の表を利用してください。
解答例 1.
1. p * s = 161, (q - 1) * (r - 1) = 16 * 2 = 32 であり、
161 / 32 = 5.03... なので、
(p * s) % ((q - 1) * (r - 1)) = 161 % 32
= 161 - (5 * 32)
= 161 - 160
= 1
となる。
2. 平文を "ICHIYOHIGUCHI" とする。
これを上記の表にしたがって符号化すると、
8 2 7 8 24 14 7 8 6 20 2 7 8
となる。
式 x ^ p % n によって暗号化すると、
32 26 46 32 12 23 46 32 48 11 26 46 32
となる。
したがって、暗号文は "gaugMXugwLaug" となる。
3. 暗号文は "gaugMXugwLaug" すなわち
32 26 46 32 12 23 46 32 48 11 26 46 32
である。
式 x ^ s % n によって復号すると、
8 2 7 8 24 14 7 8 6 20 2 7 8
となる。
したがって、平文は "ICHIYOHIGUCHI" となる。
h2 演習 9 toc-exercises
B 子は、RSA アルゴリズムのための素数として
q = 17, r = 3, s = 29 を選び、n = q * r = 51 とし、
(p, n) = (21, 51) を公開鍵として友達全員に公開し、
(s, n) = (29, 51) を秘密鍵として自分のパソコンに隠しておきました。
1. この公開鍵と秘密鍵が、
RSA アルゴリズムの条件を満たしていることを確認してください。
2. B 子の友達になったつもりで、人名など、
アルファベット 10 文字以上の平文を考え、
それを公開鍵によって暗号化してください。
x ^ p % n の計算は上記の表を利用してください。
3. B 子になったつもりで、受け取った暗号文を、
秘密鍵によって復号してください。
x ^ s % n の計算は上記の表を利用してください。
今日の演習9の答案をkonishi@twcu.ac.jpあてにメールで送ってください。 メールには、学生番号、氏名、科目名、授業日(11月26日)を明記してください。