配布プリント

計算機数学演習 A 2014.6.13. 整数の合同式
この講義の資料は, http://www.sm.u-tokai.ac.jp/~nakayama/ より入手することができる.
1
シーザー暗号
シーザー暗号とは, 各文字について後に何文字かずらすことで暗号化する方法である. 復号するには, 前に文字をずら
せば復号化できる.
• 暗号化 hello → ifmmp (各文字を 1 文字後にずらす)
• 復号化 ifmmp → hello (各文字を 1 文字前にずらす)
問題 1. シーザー暗号について, 以下を答えよ.
1. 平文が japan であるとする. 各文字を 10 文字後にずらすことで暗号化せよ.
2. 暗号文が fxnw であるとする. 各文字を 5 文字前にずらすことで復号化せよ.
次のように文字を数値に変換することにする.
a
b
c
d
e
···
x
y
z
0
1
2
3
4
···
23
24
25
注意 2. 計算機上では文字も数値として扱われるが, 通常使われるのは ASCII コードと呼ばれるものである. そのコー
ド体系では, アルファベット小文字は次のように数値に変換される.
a
b
c
d
e
···
x
y
z
97
98
99
100
101
···
120
121
122
問題 3. アルファベット大文字については ASCII コードでどのような数値に変換されるか, web で調べてみよ. また, そ
れを確かめるような C のプログラムを書け.
文字を数値に変換すると, シーザー暗号の暗号化は,
y ≡x+b
mod 26
と書ける. ここで, x は平文の 1 文字に対応する数値であり, y はそれを暗号化した文字に対応する数値であり, b はずら
す文字数である. 逆に復号化は,
x≡y−b
mod 26
y ≡ ax + b
mod 26
となる.
2
アフィン暗号
アフィン暗号の暗号化は,
と書ける. ここで, x は平文の 1 文字に対応する数値であり, y はそれを暗号化した文字に対応する数値であり, a は 26 と
互いに素な整数のいずれかであり, b はずらす文字数である. 復号化するには, 上の 1 次合同式を x について解けばよい.
例 4. アフィン暗号の例として, 次のようなに暗号化することを考える.
y ≡ 5x + 1
mod 26
ここで, x が 0, 1, . . . , 25 について y がどうなるかを表にすると,
1
x
y
0
1
1
6
2
11
3
16
4
21
5
0
6
5
7
10
8
15
9
20
10
25
11
4
12
9
13
14
14
19
15
24
16
3
17
8
18
13
19
18
20
23
21
2
22
7
23
12
24
17
25
22
となる. y が 0, 1, . . . , 25 を動いていることに注意する.
この表を用いて, 平文 test を暗号化すると, 暗号文は svns となる. 逆に暗号文 evsnft は復号化すると, 元の平文は
letsgo となる.
問題 5. アフィン暗号に関して, 次を解け.
1. アフィン暗号 y ≡ 3x + 2 mod 26 について, 上の例のような x, y についての表をつくれ.
x
y
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2. この表を用いて, 平文 math を暗号文に変換せよ. 逆に暗号文 eiaopio を平文に復号化するとどうなるか?
3. このような表を表示する Asir のプログラムをつくれ. (ヒント: % が Asir では割った余りを計算する演算子であっ
た. 例えば, 101%26 で 101 を 26 で割った余りが計算できる.)
問題 6. アフィン暗号の暗号化関数 y ≡ ax + b mod 26 について, なぜ a は 26 と互いに素でなければならないか. たと
えば, a = 2 だとどのような不都合が生じるか?
Asir での文字列の取扱い
3
Asir で文字列は "test is a message." のようにダブルクォーテーション " で囲まれたアルファベット, 数字や記号
の列である. 文字列を操作するための命令が用意されている.
Asir での文字列の取り扱い
[1923] S="This is a string";
文字列を変数 S に代入
This is a string
[1924] str_len(S);
文字列 S の長さを計算
16
[1929] sub_str(S, 0, 3);
文字列 S の第 0 文字目から第 3 文字目までを取り出す
This
[1928] sub_str(S, 5, 6);
文字列 S の第 5 文字目から第 6 文字目までを取り出す
is
[1927] sub_str(S, 5, 5);
文字列 S の第 5 文字目を取り出す
i
[1933] S+S+S+S;
文字列の結合
This is a stringThis is a stringThis is a stringThis is a string
[1937] asciitostr([65, 66, 67, 68, 69]);
ABCDE
[1940] asciitostr([97, 98, 99, 100, 101]);
abcde
[1941] strtoascii("test");
[116,101,115,116]
[1942] strtoascii("ABCDEFG");
[65,66,67,68,69,70,71]
数値を文字に変換 (ASCII に従い)
数値を文字に変換 (ASCII に従い)
文字列を数値に変換
文字列を数値に変換
参考文献
[1] D. ハーディー, C. ウォーカー, 応用代数学入門, ピアソンエデュケーション
2
25