計算では解けない暗号の作成手順です。
集合と写像の概念を使った『 暗号の数学的構造 』を、もう少し具体的に考察します。そして、それをベースにして、計算によっては解けない暗号を作ってみます。
数学的原理は、極めて単純です。
演算規則によってではなくて、乱数表によって暗号を作ります。
乱数表は、演算規則が成り立っていないので、これを使うと計算の世界をはみ出して、別の世界の暗号が出来上がってしまいます。
なお、ここでは、数や群の概念も使います。
置換テーブル(乱数表)を使った表記法
暗号は、平文を暗号に投影、変換したものですから、その数学的構造は、集合と写像の概念を使って、下記のように記述されました。
|
暗号処理 |
:平文の集合 --> 暗号の集合 |
... |
投影表現 |
この表現は、ただ漠然と、暗号の仕組みを定性的に述べただけです。全体の枠組みを述べただけで、具体的な投影方法については、何も語っていません。そこで、具体的にどのように投影するかを、考察します。
前提条件として、平文文字の集合も、暗号文字の集合も、有限個の元から構成されていると仮定します。そして、それは、正の整数を使って数えることがでる。負の整数も、少数も、実数も使う必要がないと仮定します。
このような有限個の正の整数で数えることができる集合同士の写像を、具体的に表現する最も基本的な方法は、元の1個1個について、具体的に対応関係を記述していくことです。
話を、単純化する為に、平文も、暗号も、0から9までの10個の記号で構成されていると仮定しますと、それは、例えは、下記のように記述できます。
上段の平文文字が、対応する下段の暗号文字に変換(投影)されます。例えば、平文の『 0 』 は、暗号の『 7 』に変換されます。
|
@ 平文 |
: 0 1 2 3 4 5 6 7 8 9 |
|
|
A 暗号 |
: 7 3 5 1 0 2 9 8 6 4 |
|
このように、1個1個対応関係を具体的に羅列した表現形式を、数学では、置換テーブルと呼んでいます。暗号の世界では、乱数表と呼んでいます。今後は、乱数表と、置換テーブルを同じ意味に使っていきます。
上記の置換テーブルに、ひとつの約束(前提条件)を持ち込めば、もっと、表記を単純化できます。
平文と暗号の対応関係は、どの順番で記述しても、数学的には問題ありません。上と下の対応関係のみが重要で、記述順番は、どうでもいい問題ですが、平文は、順番通り並んでいると仮定したら、思考作業上は、便利になります。(順番の定義が問題ですが)
上記の記述で、「@ 平文」は、判り切っているので、省略しても、意味が伝わります。「A 暗号」の記述だけ見れば、どのような変換が行われるか判断出来ます。そこで今後は置換テーブルを「B
乱数表」のように表現します。乱数表の表示内容自体が、そのまま、暗号への変換結果を表現しています。
|
@ 平文 |
: 0 1 2 3 4 5 6 7 8 9 |
|
|
A 暗号 |
: 7 3 5 1 0 2 9 8 6 4 |
|
|
↓ |
↓ |
|
|
B 乱数表 |
: 7 3 5 1 0 2 9 8 6 4 |
|
このような置換テーブルは、10進数の場合、数学的には、10! = 約 360万通りあります。
|
暗号処理 |
:平文の集合 --> 暗号の集合 |
... |
投影表現 |
と抽象的に表現しましたが、実際の投影方法は、具体的に置換テーブルを使って記述すると、360万通り存在します。
このような360万通りの中から、1個を選び出し、実際に、平文を暗号文字に変換した暗号方式を、暗号の世界では、置換暗号と呼んでいます。古典的な暗号作成方法です。
このような古典的置換暗号には、よく知られているように、脆弱性があります。同じ置換テーブルを使い続けるので、同じ平文文字は、必ず、同じ暗号文字に変換されます。この為、文字の使用頻度が、暗号文の中に残ってしまいます。平文文字の使用頻度は、統計的に判っています。目の前の暗号文の暗号文字の出現頻度を調べれば、その頻度は、大雑把いには、一致しますから、どの平文文字が、どの暗号文字に変換されたかを、推測可能になります。
このような脆弱性を回避する方法は、1文字毎に、使用する置換テーブルを変えることです。置換テーブルを変えれば、同じ平文文字でも、別の暗号文字に変換されますから、使用頻度の問題は、クリアできます。
しかし、ここで、具体的にそれを実行しようとしたら、困った問題に直面します。360万個の置換テーブルを、どうやって、管理するかです。どの置換テーブルをどの順番で使ったを記録しておかないと、復号もできません。復号の時にも、同じ、置換テーブル(厳密には、逆テーブル)を、同じ順番で適用しなければいけないからです。
360万個を識別する為に、連番を振ったら、7桁必要です。実際には、ランダムに番号を振る訳にもいかないので、管理の都合上、番号と内容がある程度一致するようにする必要があります。元々がランダムな内容なので、そのまま、テーブルの内容を記述する以外に方法がありません。どうしても、10桁は必要です。使った置換テーブルを記録する為に、膨大な情報が必要になってしまいます。
360万個、全部を使いたいけど、管理コストは抑えたい。ジレンマに陥ります。そこで、この2つの矛盾を解決する為に、多少、妥協します。選抜手段を2段階にします。
まず、第1段階目の選抜は、暗号処理を開始する前の初期化処理の時に行います。360万個の置換テーブルから、ランダムに10個を抽出します。10個抽出するのは、この話が10進数を例にして話を進めている為です。10個の中から、1個を指定するだけだったら、1桁あれば充分ですから、これなら、なんとかなりそうです。
第2段階の選抜は、その抽出した10個の置換テーブルをどの順番で使うかです。これには、パスワード情報を使います。パスワード情報を元にして、周期の長い疑似乱数列を生成し、この疑似乱数の値を使って、使う順番を決めます。パスワードをそのまま使わないのは、周期が短くなり過ぎて、特定されやすくなる為です。
乱数表の選抜方法を2段階にする |
第1段階 |
暗号処理を開始前に行います。
全体(360万個)の中から、ランダムに10個を選抜します。 |
第2段階 |
実際の暗号処理です。
この選抜された10個をランダムな順番に使って、平文を暗号化します。
具体的には、使う順番は、パスワード情報を利用して決めます。
パスワードがランダムで、予測困難なことを前提とします。 |
実際に作ってみます。まず、最初に、適当に下記のような乱数表(置換テーブル)を10個抽出して、準備します。
項目番号 |
: 0 1 2 3 4 5 6 7 8 9 |
|
|
乱数表0 |
: 0 1 2 3 4 5 6 7 8 9 |
|
|
乱数表1 |
: 1 2 3 4 5 6 7 8 9 0 |
|
|
乱数表2 |
: 2 3 4 5 6 7 8 9 0 1 |
|
|
乱数表3 |
: 3 4 5 6 7 8 9 0 1 2 |
|
|
乱数表4 |
: 4 5 6 7 8 9 0 1 2 3 |
|
|
乱数表5 |
: 5 6 7 8 9 0 1 2 3 4 |
|
|
乱数表6 |
: 6 7 8 9 0 1 2 3 4 5 |
|
|
乱数表7 |
: 7 8 9 0 1 2 3 4 5 6 |
|
|
乱数表8 |
: 8 9 0 1 2 3 4 5 6 7 |
|
|
乱数表9 |
: 9 0 1 2 3 4 5 6 7 8 |
|
|
そして、次のような平文文字列『 6,5,4,3,2,1 』 を暗号化することを検討します。例えば、この平文の1文字目は、乱数表3
を使って変換します。2文字目は、乱数表8を使います。3文字目以降も、使う乱数表をランダムに適当にきめます。どのような暗号が作成されるでしょうか?
1文字目は、平文文字6ですから、項目番号6の列を見ます。使用する乱数表は、3ですから、乱数表3の行を見ます。列6と行3の交点の値、9が変換される暗号文字です。
同様に、2文字目は、平文文字5ですから、項目番号5の列をみます。使う乱数表は、8ですから、乱数表8の行をみます。列5と、行8の交点3が、変換される暗号文字です。以下同様に調べていきます。結果は、下の表のようになります。
|
平文 |
使う乱数表 |
作成される暗号 |
|
演算規則を使った表現 |
1文字目: |
6 |
3 |
9 |
|
6 + 3 = 4 |
2文字目: |
5 |
8 |
3 |
|
5 + 8 = 3 |
3文字目: |
4 |
4 |
8 |
|
4 + 4 = 8 |
4文字目: |
3 |
1 |
4 |
|
3 + 1 = 4 |
5文字目: |
2 |
0 |
2 |
|
2 + 0 = 2 |
6文字目: |
1 |
7 |
8 |
|
1 + 7 = 8 |
規則正しく並んだ文字列が、ランダムな文字列に変換できましたね。暗号作成、成功です。めでたし。めでたし。一件落着です。
でも、あれ〜!。。。。。このパタン、何処かで見たことあります。
そう、加算型算術暗号そのものです。下記のような計算式を使って作った暗号と同じ結果になっています。いつの間にか、群(演算規則)が、姿を現していました。
『幽霊の正体見たり枯れ尾花。』。
算術暗号は、置換暗号の一種だったのです。規則正しく並んだ乱数表(?)を10個取り出し、それを規則正しく並べて(?)、規則正しく適用(?)していただけでした。このような、規則正しさを、数学の世界では、演算規則と呼んでいます。数学的には、『
演算する。』という人間の行為は、このような意味だったのです。このような『
約束事。』を表現していたのです。
数学では、あるものを、あるものに変換したり、投影する行為を、写像、又は、関数と、呼んでいます。置換テーブルも、演算規則も、あるものを、あるものに、投影したり変換したりしていますから、数学的には、写像の一種です。だから、置換テーブルと、演算規則が、ある特定の条件下で、等価になることは、当たり前ですね。
ちなみの Xor 計算式を使った暗号は、下記のような乱数表(置換テーブル)の組と等価になります。
項目番号 |
: 0 1 2 3 4 5 6 7 8 9 |
乱数表0 |
: 0 1 2 3 4 5 6 7 8 9 |
乱数表1 |
: 1 0 3 2 5 4 7 6 9 8 |
乱数表2 |
: 2 3 0 1 6 7 4 5 0 1 |
乱数表3 |
: 3 2 1 0 7 6 5 4 1 0 |
乱数表4 |
: 4 5 6 7 0 1 2 3 2 3 |
乱数表5 |
: 5 4 7 6 1 0 3 2 3 2 |
乱数表6 |
: 6 7 4 5 2 3 0 1 4 5 |
乱数表7 |
: 7 6 5 4 3 2 1 0 5 4 |
乱数表8 |
: 8 9 0 1 2 3 4 5 0 1 |
乱数表9 |
: 9 8 1 0 3 2 5 4 1 0 |
|
平文 |
使う乱数表 |
作成される暗号 |
|
演算規則を使った表現 |
1文字目: |
6 |
3 |
5 |
|
6 Xor 3 = 5 |
2文字目: |
5 |
8 |
3 |
|
5 Xor 8 = 3 |
3文字目: |
4 |
4 |
0 |
|
4 Xor 4 = 0 |
4文字目: |
3 |
1 |
2 |
|
3 Xor 1 = 2 |
5文字目: |
2 |
0 |
2 |
|
2 Xor 0 = 2 |
6文字目: |
1 |
7 |
6 |
|
1 Xor 7 = 6 |
演算方法(約束事)の内容が変わりますから、当然、乱数表(置換テーブル)も変わりますが、規則正しく並んでいる事実は変わりません。演算規則が、『
規則正しいルール(?) 』だからです。
このような乱数表は、10進数の場合、全体で、10! = 約360万個 存在しています。
算術暗号では、この360万個の中から、規則正しく並んだ10個だけを選びだし、毎回、この10個を使い続けてきました。前回使用した乱数表も、今回使う乱数表も同じです。この乱数表の中身は、少し、数学に詳しい人なら、全員が知っている常識です。
恐ろしくなりませんか?『
規則正しく並んだ、全員が知っている、同じ乱数表を使い続けていることが。』
自分は、これに気が付いた時、恐ろしくなりました。あまりにも、狭い世界の中で、ゲームをやっていたからです。これでは、ゲームの裏ルールや、隠しコマンドを特定されてしまいます。
算術暗号では、演算規則に縛られているので、置換暗号の一種であるにも係らず、極めて限定的に乱数表を使っています。強い拘束条件で乱数表を使うことによって、演算規則という約束事を成り立たたせています。つまり、暗号文の中に演算規則が残っています。いや、この残っている演算規則を利用して復号している訳ですから、正確には、「残している。」と言った方が正確です。演算規則によって作られた暗号は、演算規則によって復号しています。
暗号の過去の歴史を振り返ってみると判ることですが、暗号文の中に残っている規則や、平文の痕跡が、解読の手掛かりになってきました。
現代の解読者たちも、計算によって、なんとか、暗号を解こうとしています。明確には自覚していませんが、本能的に、この暗号文の中に残っている規則性に注目して、ここを攻略の手掛かりにしようとしています。
皮肉なことですが、
演算規則そのものが、セキュリティホールになっています。この規則性が、解読の手掛かりを与えています。
ここでの目的は、単純です。
特別な10個の乱数表も含めて、360万個全てを使って、暗号を作ることです。算術暗号では、規則性がない為に
捨てられていた残りの乱数表も使って暗号を作ることです。
これらの乱数表を使うと、そもそも、計算では使っていない乱数表なので、計算では解けなくなってしまいます。変換結果が、演算規則の範囲外にはみ出してしまいます。前提条件が異なるので、どんなに頑張っても、計算では、解くことができません。
全知全能だと思っていた計算世界の限界を見た思いです。
実際に、フォンノイマン型コンピュータへ実装する場合、10進法ではなくて、8bit、即ち、256進法(1byte)が処理上便利なので、乱数表も、256個の記号から構成された置換テーブルを使います。即ち、256!
= 約 10の500乗個の乱数表を使って、暗号を作る事を、検討します。
乱数表を使った置換暗号。第2ラウンド。
過去の乱数表を用いた置換暗号は失敗しました。
その原因は、先ほども述べたように、乱数表(置換テーブル)を固定した為でした。 でも、当時は、しかたありませんでした。全てが手作業だったので。あまり、複雑な変換は出来ませんでした。
ところが、現代は違います。コンピュータの性能が向上したので、複雑な作業が可能です。力任せの乱暴な作業も充分可能です。
そこで、力任せに、大量の乱数表(置換テーブル)を準備し、それを、暗号処理毎に、ランダムに使い分ける方法を検討します。
平文(バイトストリーム)に、この多量の乱数表をランダムに適用して、暗号文(バイトストリーム)を生成します。乱数表を固定しないようにします。
作業手順1:パスワードの準備。
まず、人間が、数桁のパスワードを準備します。人間は、この一個のパスワードを使い続けます。
4,5桁から、精々10桁程度のパスワードを想定します。人間の能力では、これが限界です。この程度の数桁のパスワードを記憶して使い続けることが、精一杯です。
当然、毎回、異なったパスワードを使うなんて芸当も不可能です。何を使ったか、管理出来ないからです。一個を使い続けるのが、やっとです。
作業手順2:毎回、異なったランダムな鍵を生成。
システムは、暗号処理の度に、人間が作った一個のパスワード情報を利用して、ランダムな鍵を生成します。
人間が作ったパスワードは、暗号処理には、直接使わないで、パスワード情報を利用して機械が生成した鍵を使います。この鍵は、暗号処理の度に、毎回、ランダムに生成します。
つまり、人間は、数桁の同じパスワードを使い続けているにも関わらず、実際の暗号化の鍵は、毎回、異なるようにします。平文攻撃で、鍵を解かれた時の対策の為です。
作業手順3:周期1兆桁の疑似乱数への変換。
生成した鍵を、周期1兆桁の疑似乱数(バイトストリーム)に変換します。
そして、先頭部分は捨てます。疑似乱数の最初の部分は、種と計算式の影響が出やすいので、どうしてパタン化します。それを特定されることを避ける為です。
何桁捨てるかは、鍵のチェックサムの値によって決めます。情報を再現し辛くする為です。つまり、解読者への嫌がらせです。鍵が判らなければ、何桁捨てたかも判らないので、その判らない鍵を、疑似乱数列のパタンから推測することは、より、困難になります。ニワトリが先か、タマゴが先かのジレンマに苛まれることになります。
作業手順4:1億枚の乱数表の準備。
最大、1億枚の乱数表を準備します。
鍵の情報を利用して、この1億枚の乱数表の中から、ランダムに、256枚を抽出します。鍵は、毎回異なっていますから、抽出される乱数表も、毎回異なります。
256枚抽出するのは、変換元の平文と、疑似乱数が、バイトストリーム(256進法)の為です。
作業手順5:実際の処理手順
実際の変換作業は、次のようにして行います。
平文(バイトストリーム)の1文字目を変換する時には、疑似乱数の1桁目の値を参照します。その値が、5だったら、抽出した256枚の乱数表から、5番目の乱数表を取出して、変換に使用します。2文字目の変換は、疑似乱数の2桁目の値が、13だったら、13番号の乱数表を使います。
言葉で説明すると、複雑そうに見えますが、数学的には、とても簡単です。ただ単に、
平文と乱数をインデックにして2次元配列を参照しているに、過ぎないからです。だから、この暗号は、とても、高速に動作します。
このような手順で変換すると、結果は、演算規則では、予測不可能となります。演算規則とは、全く無関係な変換処理を施している為です。統計処理を施しても、全ての文字が、乱数表によって、無造作にばら撒かれているので、どの文字も、同じ値に収束します。特徴が全く見いだせなくなります。
「計算で、解ける、解けない。」の問題以前に、暗号文の中には、演算規則の痕跡が残っていないので、計算すること自体が無意味になります。
作業手順6:揺れ動くシステム
ハッシュ関数のパラメータも、同様な手順を使って、毎回、動的に変化させます。この暗号は、ハッシュ計算を多用していますが、その計算パラメータも、毎回、鍵の情報を利用して、変化させます。
全ての情報や仕様を、パスワードや、鍵に集中させ、この値によって、
システム全体が、大きく揺れ動くように設計します。このようにすると、プログラムを解析しても、動作原理ぐらいは判るかもしれませんが、実際の、解読の手掛かりとなる固定パラメータは、それほど、多くは収集できなくなります。結局、パスワードが判らなけれは、何も解らないことになってしまいます。
技術上の壁
このような暗号システムを実装する為の壁は、次の4点です。
|
壁1: 毎回異なるランダムな鍵の生成 |
|
壁2: 乱数表の作成と保存 |
|
壁3: 乱数表の抽出と、操作方法 |
|
壁4: 疑似乱数の多様性の確保。 |
壁1:毎回異なるランダムな鍵の生成
同じパスワードから、どうやって、毎回、異なった鍵を生成するのか。
そのランダムに生成した鍵を、復号時に、どうやって知るのか。
まさか、神様をアルバイトに雇う訳にもいきません。
壁2:乱数表の作成と保存
1億枚ものユニークな乱数表(置換テーブル)を、どうやって準備するか。
その1億枚がユニークで重複していないことを、どうやって確認するのか。比較アルゴリズムは、件数が増えると、幾何級数的に時間がかかります。
膨大なデータをどうやって保管するのか。1億件の置換テーブルをCSVファイルに出力したら、約50Gbになります。DataBaseに保存したら、倍の100Gb になります。管理手間が半端ではありません。
壁3:乱数表の抽出と、操作方法
1億枚の乱数表の中から、毎回、異なった256枚を、どうやって抽出するのか。
管理、抽出の必要上、何らかのナンバリング(背番号)が必要ですが、それをどうするか。
乱数表自体は、膨大な数あります。256進法(8bit=256個の記号を使用)なので、256!=約 10の500乗あります。だから、これを全部使おうとしたら、これだの情報が必要になってしまいます。つまり、乱数表の内容をそのまま記述したら、情報量が大きくなり過ぎて、身動きがとれなくなります。
そこで、この256!個の全体集合に対して、32bit整数で番号付けが可能な、何らかの部分集合を定義して、この部分集合内の元を、この背番号で管理する工夫が必要です。
最も単純な方法は、これらの乱数表を、データベースに保存して、レコード番号で管理することです。背番号で管理出来るなら、256byte
の情報を、4byte(32bit)で管理可能になります。このように、管理情報が縮退するのは、部分集合を定義して、使う範囲を限定してしまう為です。使う範囲を限定するなら、その中を数えるのは簡単です。
壁4:疑似乱数の多様性の確保。
数桁の鍵から、超長周期の疑似乱数を生成するとき、どうやって、鍵と同じ程度の多様性を確保するか?
疑似乱数の種をコントロールすれば、様々なパタンが作成可能です。でも、最大、32bit分(40億パタン≒10の9乗)のパタンしか生成できせん。疑似乱数の種は、32bit整数だからです。
10桁の鍵の場合、理論的には、総数が256の10乗(10の24乗)程度ありますから、疑似乱数のパタン数も、この程度は、確保できなければ意味がありません。
壁を乗り越えました。
この4つの壁を乗り越えることができたので、実際に、運用可能な実証システムを作ってみました。
実際のプログラムは、400kb程度の小さな実行ファイル1個のみです。データベースは不要です。インストール等の準備作業も不要です。基本的には、コピーしただけで動作します。
運用手順
0. |
パソコンに、.Net Framwork 4 以上をインストールします。
このプログラムは、Framwork 4 上で動きます。
Windows10の場合、出荷時からインストールされていますから、不要です。 |
|
|
1. |
このプログラムをパソコンにコピーします。 |
2. |
マウスでダブルクリックして起動します。 |
3. |
暗号化したいファイルを、ドラッグ・ドロップします。 |
4. |
「暗号」ボタンを押します。 |
5. |
パスワードを聞かれるので、4、5桁のパスワードを入力します。 |
以上の操作で、無限鍵暗号のファイルが作られます。
同じファイルを、同じパスワードで暗号化しても、毎回、異なった鍵で暗号化されますから、暗号文も毎回異なったものになります。
なお、作成場所は、元ファイルと同じフォルダです。ファイル名は、元ファイルの拡張子が、Fx に変更されたものです。
大げさなことを言っていた割には、実際の運用は、単純です。
操作手順は、Zipファイルの場合と、ほとんど、同じです。
しかし、作られている暗号文は、計算では解くことが出来ない無限乱数列暗号になっています。
1 |
変換は、置換テーブル(乱数表)を使っているので、演算規則が成り立っていません。 |
2 |
周期1兆桁の疑似乱数を使っているので、1テラバイトのファイルを暗号化しても、繰り返しが起りません。 |
3 |
疑似乱数のパタン数は、元になった鍵の分だけあります。しかも、その鍵は、毎回、ランダムに変わります。この為、疑似乱数のパタンを予測するのは、極めて困難になります。 |
このようなトリッキーなことが可能になるのは、暗号処理の特殊性の為です。暗号処理では、双方向の一意性を追求する必要はなく、片方向の一意性だけ追及すれば充分です。暗号作業も、復号作業も、作業手順は、全く同じです。同じ手順を踏めば、同じ結果が生まれることだけ、保証出来ていれば、復号は可能になります。反対方向の一意性は保証する必要がありません。最期の一瞬に、置換テーブルの代わりに、その逆変換であるリバーステーブルを使うことが、唯一の注意点です。
以上が、演算規則が成り立っていないので、計算では解くことができない暗号の作り方の概要です。
数学的には、極めて、単純な話です。変換作業に、演算規則ではなくて、乱数表(置換テーブル)を、ランダムに使っているだけです。
この暗号の攻略方法
この暗号の攻略方法は、試行錯誤、即ち、総当たり攻撃のみとなります。
この暗号の特徴を整理すると、下記のようになります。
- 演算規則を使って暗号を作っていないので、計算では解けません。
- 平文攻撃も、毎回、鍵が異なっているので、無力化されています。
- プログラムの解析も、固定パラメータが少ないので、あまり、参考になる情報を収集出来ません。
- 多くの仕様がパスワードに集中している為、パスワードが判らなければ何も解りません。
暗号文その物の中に、演算規則を含めた特徴が残っていない為に、多くの理論的な攻撃方法が無力化されています。統計的手法も、乱数表をランダムに使っているので、無力化されています。たとえば、同じ文字が繰り返している『11111111.。。。』という文字列を暗号化した暗号文の平均値を取っても、『22222.。。』という文字列を暗号化した結果の平均値を取っても、同じ値に収束します。演算規則が成り立っていない為です。
このような規則性を持っていないものを解く唯一の方法は、原始的ですが、試行錯誤、即ち、総当たり攻撃のみです。
ところが、その総当たり攻撃も、この暗号の処理手順の
副作用として、不可能になっています。この暗号は、置換テーブルを準備する初期化処理に時間がかかります。算術暗号に比べて、大量の情報を前もって準備する必要があるからです。自分のパソコンで0.1秒掛かります。
人間にとって、0.1秒は、全く気にならないので、運用面では問題になりませんが、総当たり攻撃する者にとっては、深刻な問題になります。1秒間に10回しか、試せないからです。ちょっと、パスワードの桁数を長くしただけで、破綻してしまいます。
運用時には、2次元配列を参照するだけですから、高速に動作しますが、総当たり攻撃の時には、初期化処理の重たさが、致命傷になります。守る側には便利ですが、攻める側には厄介です。
乱数表暗号から見た、算術暗号の問題点
もう一度、繰り返しになりますが、算術暗号も、数学的には、置換暗号の一種です。
入力と出力が1対1に対応している限り、算術規則と等価な置換テーブルを定義可能です。
算術暗号の問題点は、この置換テーブルの使い方が、極めて限定的だということです。この限定された使い方を、数学者の方は、演算規則と呼んでいます。演算規則に縛られた狭い範囲の変換しか出来ていません。
演算規則が成り立つ範囲の置換テーブルしか使っていませんから、暗号文の中に、演算規則や、ルールが残っています。いや、その暗号文の中に残っている演算規則を使って、復号しているので、正確には、残っているのではなくて、残しているのですよね。演算規則で作られた暗号は、その演算規則で復号されています。このような平文由来のルールや規則性は、解読の手掛かりとなってしまいます。
ワザワザ、手間暇かけて、手掛かりを残すぐらいだったら、てっとり早く、ルールを無視して、
乱数表で、ぐじゃぐじゃにした方が確実です。こちらは、考え方が単純な分、各種の検証作業も楽です。検証作業が楽なら、検証漏れも少なくなります。
自分が解けないことと、暗号が解けないことを、同一視している算術暗号には、一抹の不安を感じます。