Link

リンク

サルにも分かるRSA暗号

文字と数値

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

現在、暗号の計算はコンピュータで行うのが一般的です。 コンピュータの内部では 「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/
480 491 502 513 524 535 546 557
568 579 58: 59; 60< 61= 62> 63?
64@ 65A 66B 67C 68D 69E 70F 71G
72H 73I 74J 75K 76L 77M 78N 79O
80P 81Q 82R 83S 84T 85U 86V 87W
88X 89Y 90Z 91[ 92\ 93] 94^ 95_
96` 97a 98b 99c 100d 101e 102f 103g
104h 105i 106j 107k 108l 109m 110n 111o
112p 113q 114r 115s 116t 117u 118v 119w
120x 121y 122z 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 を見ても、もとの数値に一意に戻すことができなくなってしまうからです。

戻る
進む
ページ上部へ