計算機数学演習 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
© Copyright 2024 Paperzz