シーザー暗号は暗号化の単位が文字なので、 自由な文を伝達できることは分かりました。 しかし、文字を単位としている以上、 平仮名ではせいぜい五十個程度の鍵しか用意できないことも分かりました。 もっと鍵を多くするには一体どうしたらよいでのしょうか?
現在、暗号の計算はコンピュータを用いて行うのが一般的です。 実は、そのコンピュータの内部では 「A」 を 「A」 として 扱うのではなく、文字コードと言う、各文字ごとに固有に 対応付けられた数値に変換して扱っています。 文字と数値との対応付けには、いくつかの種類があり、 例えば最も代表的なASCIIコード(アスキーコード) と呼ばれる文字コードでは、 「A」 には 65 、「B」 には 66 …という数値を対応付けています。
| 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 通りまでOKなので鍵が多少増えます。 さらに、文を2文字ずつに区切って2文字ずつを1つの数値(ブロック)と考え "AB" なら 65 × 128 + 66 、 "BC" なら 66 × 128 + 67 のように数値化すれば、 合計 128 × 128 = 16384 個の種類の数値が存在することにとなり、 これを暗号化の置き換え単位と考えれば、 シーザー暗号のような「ただ数値をずらすだけ」の簡単な暗号方式であっても かなりの数の鍵が存在することになります。 もちろん2文字を単位とせずとも、3文字 ( 128 × 128 × 128 個の鍵パターンが存在する) でもいいですし、理論上は無限に増やすことができます (こうして暗号化する単位を大きくすると鍵が増えるというのは、 実は結局、単語レベルで置き換えを行なう隠語に似てきます)。
さらに、文字を数値として扱うことで、 暗号化方法を「何文字かずつずらす」などと表現するのではなく、 「鍵を使った数式に、平文の数値(文字コード)を入れて別の数値に変換する」 (数学的に言えば関数とか写像等)というように、数式で表すことが 可能になるというとても大きな利点があるのです。 例えば、鍵を a 、平文をASCIIコードで変換した数値を x 、暗号文の数値を y とする時のシーザー暗号はy = a + xと表すことができます (但し 128 を越えた時は 128 で割った余りをとることにする)。
このように、現代暗号では文字を ASCIIコード などによって 事前に公に決められた複数の文字数ずつを単位として一旦 「数値」 に直した上で、 その数値を別の数値に変換するという暗号化を行うことで、 鍵の数を増やし、また暗号化の方法を数式で表せるようにしています。 暗号化して得られた数値は、 復号して得た数値を再び ASCIIコード で文字に直せば元の文を得られます。
ちなみに、ASCIIコード のような取り決めは、 文字をこれに従って数値にした後で、初めて暗号化して数値を変換するので、 暗号化自体とは直接関係がありません。そのため ASCIIコード などのように公開されている方法を使って全く問題ありません。 また、暗号化に利用する数式は、 通常は平文の数値と暗号化後の数値が 1 対 1 の対応に なっていなければなりません。 65 という数値が暗号化すると 71 に置き換わる時、 67 も暗号化すると 71 に置き換えられるのでは、 暗号化した後の 71 を見ても、 もとの数値に一意に戻すことができないからです。