コード (暗号)

コード  とは、メッセージを特別な知識や情報無しでは意味が分からないように変換する秘匿手段の一つであり、暗号の一種である。軍の運用など、ある程度の規模の活動に必要な、相当量の単語やフレーズについて、事前の合意により、別の単語、無意味な文字列、数字などに置き換える暗号である。

1. コードとサイファ
-----------

ここでそもそも、前述のような分類は、コンピュータの利用が前提となっている現代の暗号学より以前の、ロータリスイッチなどの電気機械による暗号機の時代の暗号学の頃に確立されているが、現代の理論から見て一応は、コードを“syllabic and lexical cipher”などとしてサイファの一種と見なし理論的には扱うことは不可能ではない。しかし、暗号の長い歴史の中でサイファとは別系統のものとして独自の発展や進化を遂げてきており、英語圏他欧州も含め、codeとcipherという別の語があるように、別種のものとして扱われている。

サイファでは、秘密は鍵に集中するのであり、その方式を秘匿することによる強度上の利点は純粋な理論的には存在しない。そのため、むしろ広く暗号学界によってその方式に攻撃の研究が為されたほうが安全性が保証されたものになる、と言えるし、そうでなくとも広く使われている方式の暗号を利用したほうが、その暗号通信を「特徴のある通信」にしてしまうことを防げる。一方でコードは、その方式自体が秘密でなければならない。ただしもし、そのように定義するならば、コードは、現代の暗号学による狭義の現代暗号ではありえないことになる。ケルクホフスの原理の記事も参照。

なお、英語 code は暗号化を目的としないものを含む。その意味では、公開され市販もされていたようなコードブックというようなものもある。そういったものを使う場合、必要であれば、それと別に秘密のコードブックも用意し、電報などでのやりとりには、さらにそちらで変換する。

また一種のコードと言えなくもないが、一種の乱数表のようなものとして、きちんとそのような目的のため設計されたものではなく、市販の辞書や聖書などの書籍をそのまま利用した暗号、フィクションでの例だがシャーロック・ホームズの「恐怖の谷」に登場するような暗号は「ブック暗号」という別の分類がある。

2. 種類
-----

2.1. PlaincodeとEnciphered code
------------------------------

enciphered codeは19世紀末から20世紀半ばまで外交および軍事暗号として広く利用された。これはplaincodeの通信文を圧縮できる長所を活かしながら、オーソドックスに強度を付加できる点にあった。

しかし高度に訓練された暗号手を必要としたのが欠点であり、機械式暗号が実現されると可及的速やかに置き換わった。

2.1.1. Plaincode
----------------

placodeやbasecode、生のコードとも言う。コード換字のみで暗号化する。つまり一次式暗号である。

一般にコード、符牒、暗号書、codebook、repertory、cipher dictionay、word bookとはplaincodeを指す。

多くの場合plaincodeを丸暗記するのは現実的でない、それ故に暗号書を携帯、保管、配送する必要が生じる。plaincodeを組織的に丸暗記した例としてはコードトーカーがある。

Plaincodeの編纂においては利用する組織のモラル、ドクトリン、知識が必ず反映される。よってPlainecodeを盗んで査読すると単に相手の通信文が読めるだけでなく、計り知れない情報が推論できる。

企業の商用コードに「違法」や「賄賂」のコード語句が有れば、恐らくその企業は違法行為や贈賄をしているであろう。敵軍のコードに新兵器のコード語句があれば編纂当時に実用化されているだろう。味方の秘密兵器名がそのまま有れば当時から秘密が漏れているだろう。

たとえば、昭和19年に編纂した日本陸軍暗号書5号には「硫黄島」や「艦載機」の語句が当初採用されていなかった。つまり陸軍が硫黄島で戦い、艦載機の攻撃を受けるとは想定していなかったことがわかる。

2.1.2. Enciphered code
----------------------

encicode, superenciphered code, reciphered codeとも言う。

まずコードで換字を行い、強度を高めるためにサイファでさらに暗号化する。二次式暗号である。

enciphered codeを採用する理由はいくつかある。

plaincodeが盗まれる、紛失する等で秘匿性が失われた場合に応急措置として採用する場合。
plaincodeの秘匿性を不要として、二次暗号化とその鍵変更だけで強度を確保する場合
plaincodeの秘匿性も必要として、さらに強度を高める場合。記号転換が許す限りサイファの形式には何ら制限はない。換字式や転置式、ストリームやブロック暗号が使える。

よく知られる乱数式暗号や乱字式暗号とはenciphered codeの一種である。俗に「乱数の剥ぎ取り」と呼ばれる作業はenciphered codeを元のplaincodeに戻そうとする事である。

15世紀にアルベルティが最初に考案したとされる。彼は1〜4の数字から構成されるplaincodeを作成し、次いで彼の考案した暗号円盤で換字することでenciphered codeとした。しかしこの考案は19世紀末まで実用化される事はなかった。

一般に未知のenciphered code解読は対照平文が入手できても困難である。しかしplaincodeが盗まれたり鹵獲されたりあるいは理論的に再構築されると一挙に強度が低下する欠点がある。これはヴィジュネル暗号において仮定語が利用可能になるのと等しい。

plaincodeの設計の善し悪しが、enciphered code全体の強度を左右する事がある。

2.2. 通信文を全て暗号化できるか
------------------

2.2.1. 平文とコードを混ぜる場合
-------------------

極めてセンシティブな語句、例えば金額や非合法な単語だけにコードを割当てて残りは平文のまま通信する。コード編纂が非常に簡便だが暗号強度は低くなる。例えば接続詞、前置詞、疑問符、句読点等はコードにされない事が多いが、これらは判明しているとコード解読に役立つからである。

2.2.2. 全てコードにする場合
-----------------

大手商社や外交、軍用コードが該当する。サイファと同様に「暗号化できるものは全て暗号化せよ」のセオリーにより、使用される語彙を統計調査してコードを割り当てる。通信する集団の文体や言葉遣いが揃っている事、揃う様に教育する事も重要である。編纂時に未知か不要と判断された固有名詞等をコード化する場合は2つの方法、スペルアウトと補遺がある。また必要であれば付録辞典も併用してコード編纂を効率化する。

2.2.2.1. スペルアウト
---------------

応急的に採用。事前に相手との取り決めは不要である。単文字や音節のコードを組み合わせて綴る。なお解読側からは貴重な手がかりとなる。

例えば第一次世界大戦にてドイツ陸軍は野戦コードに"Distilliertes Wasser"が無かった当時、これをd + ist + i + ll + ie + r + te + s + wasserと9つのコードでスペルアウトした。連合軍コード解読班は高頻度のistやsを含む特徴的なコード群を探す事で他のコードも芋づる式に特定できた。 またサイファからコードに配置換えになった暗号手が原語を探すのを面倒がり代わりに全て単文字でスペルアウトした事故もある。

2.2.2.2. 補遺
-----------

spare groupとも言う。頻繁にスペルアウトする語句を将来追加する為に対応原語を未定としたコードを幾つか用意しておく。補遺のコードに原語を割り当てるのはコードの運用母体が行うので、個々の発信者が独自には利用できない。

2.2.2.3. 付録辞典
-------------

例えば少人数が狭い地域で扱うplaincodeであれば人名、地名、艦名、商品名は都度スペルアウトして済むが、規模が大きくなると付録辞典を用意する必要が有る。当然ながら本編のplaincode側に「次のコードからは人名事典」「人名事典の終わり」といったコードも用意する必要が有る。

入れ変わりの多い人名、艦名、商品名の管理が別冊内で一元管理できるので、本編plaincodeを編集する必要が無い。
膨大な地名や商品名には膨大なコードを割り当てる必要があるが、本編のコードと重複割当が可能になる。

2.3. 1冊制と2冊制
------------

日本語訳から誤解しやすいが冊数自体というよりは、正確には「単表制」「2表制」とでも呼んだほうが暗号方式的には正しい。英語の "alphabetical" と "randomized" という表現は、語の対応あるいは表の構成をあらわしていると言える。

2.3.1. 1冊制
----------

one-part code、alphabetical codeとも。

次に述べる2冊制では、対応を完全にランダムにできるのに対し1冊制は、対応に、あるいは対応付けのための排列に何らかの制限があり、暗号化用と復号用の対応表が兼用できるようなもの、と言える。

例えばアルファベット3文字で色を伝える暗号の例を以下に示す。ここではその暗号全体として「色に関する語の暗語はCAから始まる」「どちらも辞書順で並んでいる」という制限がある。これにPurpleの原語を将来追加しようとすると対応する暗語はCAGとCAIに挟まれたCAHしか選択の余地がない。攻撃側もこの規則性が使えるので「もしRedがCAIならば、BlueはCAHより前に有るはずだ」などとなる。またコードブックの紛失や盗難で使えなくなり新しく編纂しなおす場合でもBlueがRedの前に来る関係を崩す事ができない。

1冊制の例



2.3.2. 2冊制
----------

two-part code、randomized code、hatted codeとも。

この方式では、原語と暗語の対応はランダムである。言い換えると、原語側を辞書順など何らかの組織立った順序に並べた時には暗語側の順序には何の法則も無くランダムであり、逆に、暗語側を何らかの順序で並べた時の原語側の順序も同様である。このため実用的な速度での作業のためには、暗号化用と復号用の別の表を必要とすることからその名がある。なお2冊に別けて製本する必要は無く、1冊にまとめてあることも多い。

2冊制の例 1 

2冊制の例 2 

この方式には1冊制と比べ、不規則さにより、攻撃が難しくなる利点がある。

さらに1冊制よりもエラーの検出が容易である利点もある。例えば上記の1冊制コードにおいて、Blackを示すCAAの3文字目のAが通信エラーにCになった場合、復号側においてCACを、システム的に通信エラーだと気付くことは不可能である。しかし2冊制の場合はコードが1文字違いの別コードになっても、類似性のある原語になる可能性が低いのでエラーを検知しやすい。

2.3.2.1. ランダム化について
------------------

このような暗号が運用されていた時代には考案されていなかった現代のコンピュータで使われているアルゴリズムだが、フィッシャー–イェーツのシャッフルなどによってランダム化すれば良い。あるいは古くから使われていた手法としては、単語カードを作り、それを袋に入れてよくかき混ぜてから1つずつ取り出すとか、全ての語にあらかじめ乱数を割り振り、その乱数の値に従ってソートする、といったような手法がある。

3. コードの例
--------

例1 ルイ14世の大暗号： コードブックは「act=486、ion=102、…」のように音節単位で3桁の数に対応させる。暗号文「486-102」を復号すると act-ion になる。19世紀末フランス軍の暗号解読者バズリが解読を発表した。
例2 日露戦争で使われた暗号文：「アテヨ イカヌ ミユトノホウニセツシ、ノレツ ヲハイタダチニヨシスコレヲワケフ ウメルセントス、ホンジツテンキセイロウナレドモナミタカシ」。コードブックは「アテヨ=敵、イカヌ=艦隊、ノレツ=連合艦隊、…」のように秘匿したい単語をカナ3文字に対応させている。平文は「敵 艦隊見ユトノ警報ニ接シ、連合艦隊 は直チニ出動、コレヲ撃沈 滅セントス、本日天気晴朗ナレドモ波高シ」となる。
例3 真珠湾攻撃で使われた暗号文：「ニイタカヤマノボレ1208」。なお、「ト」の連打(＝全軍突撃せよ）