文字と数値

シーザー暗号は暗号化する単位が文字なので、自由な文を伝えられることが分かりました。しかし、文字が単位であるということは、平仮名ではせいぜい五十個程度の鍵しか用意できないことになります。もっと鍵を増やすにはどうしたらよいでしょうか?

現在、暗号の計算はコンピュータで行うのが一般的です。コンピュータの内部では 「A」 を 「A」として扱うのではなく、各文字に固有に割り付けた 文字コード と呼ばれる 数値 に変換して扱っています。文字への数値の割り付けにはいくつかの種類があり、例えば最も代表的な ASCIIコード(アスキーコード)と呼ばれる文字コードでは、「A」 には 65 、「B」 には 66、 …などと数値が割り付いています。

ASCII コードとして決められている 数値と文字 の対応
(文字の書かれていない数値には特殊な文字が割り付いています)

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 25 26 27
28 29 30 31
32 33 ! 34 35 #
36 $ 37 % 38 & 39
40 ( 41 ) 42 * 43 +
44 , 45 46 . 47 /
48 0 49 1 50 2 51 3
52 4 53 5 54 6 55 7
56 8 57 9 58 : 59 ;
60 < 61 = 62 > 63 ?
64 @ 65 A 66 B 67 C
68 D 69 E 70 F 71 G
72 H 73 I 74 J 75 K
76 L 77 M 78 N 79 O
80 P 81 Q 82 R 83 S
84 T 85 U 86 V 87 W
88 X 89 Y 90 Z 91 [
92 \ 93 ] 94 ^ 95 _
96 ` 97 a 98 b 99 c
100 d 101 e 102 f 103 g
104 h 105 i 106 j 107 k
108 l 109 m 110 n 111 o
112 p 113 q 114 r 115 s
116 t 117 u 118 v 119 w
120 x 121 y 122 z 123 {
124 | 125 } 126 ~ 127

ASCIIコードでは 0 から 127 までの数値を使い、英字の大文字・子文字、および数字・記号などが割り当てられています。

シーザー暗号で “ABCD” というローマ字の文を暗号化する場合、「各文字をアルファベット順で何文字かずらして別の文字に置き換えていくので、鍵はたかだか 26 通りからしか選べません。しかし、ASCIIコードで一旦数値に変換すれば、これで「ずらす数」が 128 通りまでになるので鍵が多少増えます。

さらに、文を2文字ずつに区切って、2文字で1つの数値(ブロック)と考え、”AB” なら 65 × 128 + 66 、 “BC” なら 66 × 128 + 67 のように数値化すれば、合計 128 × 128 = 16384 個の種類の数値が存在することにとなります。

これを暗号化の置き換え単位と考えれば、シーザー暗号のような「ただ数値をずらすだけ」の簡単な暗号方式であっても、かなりの数の鍵が存在することになります。もちろん2文字を単位とせずとも、3文字( 128 × 128 × 128 個の鍵パターンが存在する)でもいいですし、理論上は無限に増やすことができます(こうして暗号化の単位を大きくすると鍵が増えるのは、結局、単語の単位で置き換えを行なう隠語に似てきます)。

さらに、文字を数値として扱うと暗号化の方法を「50音順で何文字かずらす」などと表現せず、「鍵の値を使った数式に平文の数値(文字コード)を入れて別の数値に変換する」というように、暗号化方法を 数式で表現 することが可能になるという大きな利点があるのです(数学的に言えば関数とか写像等)。例えば、鍵を a 、平文をASCIIコードで変換した数値を x 、暗号文の数値を y とする時のシーザー暗号は y = a + x と表すことができます(但し 128 を越えた時は 128 で割った余りをとることにする)。

このように、現代暗号では文字を公に決められた ASCII コード等で「数値」に変え、その値を別の値に変えるという数式によって暗号化手順が表現されています。さらに、複数の文字ずつを単位として数値化し、別の数値に変換するという暗号化を行えば、鍵の数を増やすこともできます。暗号化して得られた数値は、逆の計算を行って得た数値を再び ASCII コードで文字に直せば元の平文を得らることができます。

ちなみに、ASCIIコードのような取り決めは、文字をそれに従って数値にした後で初めて暗号化するため、暗号化処理自体とは直接関係がありません。そのため ASCIIコードのような公知の方法を使えば全く問題ありません。また、暗号化する際の数式は、通常は 平文の数値と暗号化後の数値が 1 対 1 の対応 になっていなければなりません。65 という数値を暗号化すると 71 に変わる時、67 も暗号化すると 71 に置き換えられてしまうとしたら、暗号化した後の 71 を見ても、もとの数値に一意に戻すことができなくなってしまうからです。
戻る次へ