コード (暗号)

コード (code) とは、メッセージを特別な知識や情報無しでは意味が分からないように変換する秘匿手段の一つであり、暗号の一種である。軍の運用など、ある程度の規模の活動に必要な、相当量の単語やフレーズ（あるいはもっと長いメッセージ）について、事前の合意により、別の単語、無意味な文字列、数字などに置き換える暗号である。 （まず、コードとサイファ（cipher）の分類の概要について、暗号#概要 を参照のこと） ここでそもそも、前述のような分類は、コンピュータの利用（暗号を運用する側だけでなく、攻撃側もまたコンピュータを利用できるということ）が前提となっている現代の暗号学より以前の、ロータリスイッチなどの電気機械による暗号機の時代の暗号学の頃に確立されているが、現代の理論から見て一応は、コードを“syllabic(音節) and lexical(語彙) cipher”などとしてサイファの一種と見なし理論的には扱うことは不可能ではない。しかし、暗号の長い歴史の中でサイファとは別系統のものとして独自の発展や進化を遂げてきており、（日本ではどちらも「暗号」にひっくるめてしまっており、codeとcipherを訳し分ける必要がある場合のための定訳といったようなものも無いが）英語圏他欧州も含め、codeとcipherという別の語があるように、別種のものとして（暗号学では）扱われている。 （現代の）サイファでは、秘密は鍵に集中するのであり、その方式を秘匿することによる強度上の利点は純粋な理論的には存在しない。そのため、むしろ広く暗号学界によってその方式に攻撃の研究が為されたほうが安全性が保証されたものになる、と言えるし、そうでなくとも広く使われている方式の暗号を利用したほうが、その暗号通信を「特徴のある通信」にしてしまうことを防げる。一方でコードは、その方式自体が秘密でなければならない。ただしもし、そのように定義するならば、コードは、現代の暗号学による狭義の現代暗号ではありえない（（狭義の）現代暗号とは、秘密が鍵のみに集中するような方式ということだから）ことになる。ケルクホフスの原理の記事も参照。 なお、英語 code は暗号化を目的としないものを含む（文字コード（character code）などの用例におけるcode）。その意味では、公開され市販もされていたようなコードブックというようなものもある（w:Commercial code (communications)）。そういったものを使う場合、必要であれば、それと別に秘密のコードブックも用意し、電報などでのやりとりには、さらにそちらで変換する。 また一種のコードと言えなくもないが、一種の乱数表のようなものとして、きちんとそのような目的のため設計されたもの（en:Random number book）ではなく、市販の辞書や聖書などの書籍をそのまま利用した暗号（規約さえ秘匿できれば、表自体は盗まれることの心配をしなくてよく、また自国以外で活動する諜報員には入手しやすさという利点もある）、フィクションでの例だがシャーロック・ホームズの「恐怖の谷」に登場するような暗号は「ブック暗号」という別の分類がある（英語版で記事名が en:Book cipher である通りサイファと扱われることもあるが（注に書いた通りそれに近い性格もある）、英語版の2017年10月現在の記事には「book ciphers are more properly called codes.」とあるように、コードと扱われることもある）。 enciphered codeは19世紀末から20世紀半ばまで外交および軍事暗号として広く利用された。これはplaincodeの通信文(時間)を圧縮できる長所を活かしながら、オーソドックスに強度を付加できる点にあった。 しかし高度に訓練された暗号手を必要としたのが欠点であり、機械式暗号が実現されると可及的速やかに置き換わった。 placode(プレイコード)やbasecode、生の(裸の)コードとも言う。コード換字のみで暗号化する。つまり一次式暗号である。 一般にコード、符牒、暗号書(一次暗号書)、codebook、repertory、cipher dictionay、word bookとはplaincodeを指す。 多くの場合plaincodeを丸暗記するのは現実的でない、それ故に暗号書を携帯、保管、配送する必要が生じる。plaincodeを組織的に丸暗記した例としてはコードトーカーがある。 Plaincodeの編纂においては利用する組織(企業、官庁、軍隊)のモラル、ドクトリン、知識が必ず反映される。よってPlainecodeを盗んで査読すると単に相手の通信文が読めるだけでなく、計り知れない情報が推論できる。 企業の商用コードに「違法」や「賄賂」のコード語句が有れば、恐らくその企業は違法行為や贈賄をしているであろう。敵軍のコードに新兵器のコード語句があれば編纂当時に実用化されているだろう。味方の秘密兵器名がそのまま有れば当時から秘密が漏れているだろう。 たとえば、昭和19年に編纂した日本陸軍暗号書5号には「硫黄島」や「艦載機」の語句が当初採用されていなかった。つまり陸軍が硫黄島で戦い、（米海軍の）艦載機の攻撃を受けるとは想定していなかったことがわかる。 encicode(エンサイコード), superenciphered code, reciphered codeとも言う。 まずコードで換字を行い、強度を高めるためにサイファでさらに暗号化する。二次式暗号（あるいはそれ以上）である。 enciphered codeを採用する理由はいくつかある。 plaincodeが盗まれる、紛失する等で秘匿性が失われた(と判断された)場合に応急措置として採用する場合。 plaincodeの秘匿性を不要として、二次暗号化とその鍵変更だけで強度を確保する場合(例えば市販の商用コードをPlaincodeに用いる) plaincodeの秘匿性も必要として、さらに強度を高める場合。 記号転換が許す限りサイファの形式には何ら制限はない。換字式や転置式、ストリームやブロック暗号が使える。 よく知られる乱数式暗号や乱字式暗号とはenciphered codeの一種である。俗に「乱数の剥ぎ取り」と呼ばれる作業はenciphered codeを元のplaincodeに戻そうとする事である。 15世紀にアルベルティが最初に考案したとされる。彼は1〜4の数字から構成されるplaincodeを作成し、次いで彼の考案した暗号円盤で換字することでenciphered codeとした。しかしこの考案は19世紀末まで実用化される事はなかった。 一般に未知のenciphered code解読は対照平文が入手できても困難である。しかしplaincodeが盗まれたり鹵獲されたりあるいは理論的に再構築(reconstruction)されると一挙に強度が低下する欠点がある。これはヴィジュネル暗号において仮定語(クリブ)が利用可能になるのと等しい。 plaincodeの設計(編集)の善し悪しが、enciphered code全体の強度を左右する事がある。 極めてセンシティブな語句、例えば金額や非合法な単語だけにコード(コードネーム、符牒、隠語)を割当てて残りは平文のまま通信する。コード編纂が非常に簡便だが暗号強度は低くなる。例えば接続詞、前置詞、疑問符、句読点等はコードにされない事が多いが、これらは判明しているとコード解読に役立つからである。 大手商社や外交、軍用コードが該当する。サイファと同様に「暗号化できるものは全て暗号化せよ」のセオリーにより、使用される語彙を統計調査してコードを割り当てる。通信する集団の文体や言葉遣いが揃っている事、揃う様に教育する事も重要である。編纂時に未知か不要と判断された固有名詞等をコード化する場合は2つの方法、スペルアウトと補遺がある。また必要であれば付録辞典も併用してコード編纂を効率化する。 応急的に採用。事前に相手との取り決めは不要である。単文字や音節のコードを組み合わせて綴る。なお解読側からは貴重な手がかりとなる。 例えば第一次世界大戦にてドイツ陸軍は野戦コードに"Distilliertes Wasser"(蒸留水)が無かった当時、これをd + ist + i + ll + ie + r + te + s + wasserと9つのコードでスペルアウトした。連合軍コード解読班は高頻度のistやsを含む特徴的なコード群を探す事で他のコードも芋づる式に特定できた。 またサイファからコードに配置換えになった暗号手が原語を探すのを面倒がり代わりに全て単文字でスペルアウトした事故もある。 spare groupとも言う。頻繁にスペルアウトする語句を将来追加する為に対応原語を未定としたコードを幾つか用意しておく。補遺のコードに原語を割り当てるのはコードの運用母体が行うので、個々の発信者が独自には利用できない。 例えば少人数が狭い地域で扱うplaincodeであれば人名、地名、艦名、商品名は都度スペルアウトして済むが、規模が大きくなると付録辞典(別冊の専用plaincode)を用意する必要が有る。当然ながら本編のplaincode側に「次のコードからは人名事典」「人名事典の終わり」といったコードも用意する必要が有る。 入れ変わりの多い人名、艦名、商品名の管理が別冊内で一元管理できるので、本編plaincodeを編集する必要が無い。 膨大な地名や商品名には膨大なコードを割り当てる必要があるが、本編のコードと重複割当が可能になる。 日本語訳から誤解しやすいが冊数自体というよりは、正確には「単表制」「2表制」とでも呼んだほうが暗号方式的には正しい（運用まで含めたシステム全体から見れば、表が分かれている場合、暗号化と復号のどちらか片方の作業は片方の1冊のみで行えるという運用上の点からは、2冊という表現も当を得ていないわけでもない）。英語の "alphabetical" と "randomized" という表現は、語の対応あるいは表の構成をあらわしていると言える。 one-part code、alphabetical codeとも。 次に述べる2冊制では、対応を完全にランダムにできるのに対し1冊制は、対応に、あるいは対応付けのための排列に何らかの制限があり、暗号化用と復号用の対応表が兼用できるようなもの、と言える。 例えばアルファベット3文字で色を伝える暗号の例を以下に示す。ここではその暗号全体として「色に関する語の暗語はCAから始まる」「どちらも辞書順で並んでいる」という制限がある。これにPurpleの原語を将来追加しようとすると対応する暗語はCAGとCAIに挟まれたCAHしか選択の余地がない。攻撃側もこの規則性が使えるので「もしRedがCAIならば、BlueはCAHより前に有るはずだ」などとなる。またコードブックの紛失や盗難で使えなくなり新しく編纂しなおす場合でも（運用全体を再編しない限り）BlueがRedの前に来る関係を崩す事ができない。 1冊制の例(暗号化用と復号用を兼用) two-part code、randomized code、hatted codeとも。 この方式では、原語と暗語の対応はランダムである。言い換えると、原語側を辞書順など何らかの組織立った順序に並べた時には暗語側の順序には何の法則も無くランダムであり、逆に、暗語側を何らかの順序で並べた時の原語側の順序も同様である。このため実用的な速度での作業のためには、暗号化用と復号用の別の表を必要とすることからその名がある。なお2冊に別けて製本する必要は無く、1冊にまとめてあることも多い。 2冊制の例 1 (暗号化用) 2冊制の例 2 (上記で暗号化されたものからの復号用) この方式には1冊制と比べ、不規則さにより、攻撃が難しくなる利点がある。 さらに1冊制よりもエラーの検出が容易である利点もある。例えば上記の1冊制コードにおいて、Blackを示すCAAの3文字目のAが通信エラーにCになった場合、復号側においてCACを、システム的に通信エラーだと気付くことは不可能である（平文の文意から気付くかもしれないが、それは「システム的」ではないし、もしかしたら本来意図した平文が「間違った文章」なのかもしれないわけである）。しかし2冊制の場合はコードが1文字違いの別コードになっても、類似性のある原語(別の色)になる可能性が低いのでエラーを検知しやすい。 このような暗号が運用されていた時代には考案されていなかった現代のコンピュータで使われているアルゴリズムだが、フィッシャー–イェーツのシャッフルなどによってランダム化すれば良い。あるいは古くから使われていた手法としては、単語カードを作り、それを袋に入れてよくかき混ぜてから1つずつ取り出すとか、全ての語にあらかじめ乱数を割り振り、その乱数の値に従ってソートする、といったような手法がある。 例1 ルイ14世の大暗号（ロシニョールが作成）： コードブックは「act=486、ion=102、…」のように音節単位で3桁の数に対応させる（600個程ある）。暗号文「486-102」を復号すると act-ion になる。19世紀末フランス軍の暗号解読者バズリが解読を発表した。 例2 日露戦争で使われた暗号文：「アテヨ イカヌ ミユトノホウニセツシ、ノレツ ヲハイタダチニヨシスコレヲワケフ ウメルセントス、ホンジツテンキセイロウナレドモナミタカシ」。コードブックは「アテヨ=敵、イカヌ=艦隊、ノレツ=連合艦隊、…」のように秘匿したい単語をカナ3文字に対応（2文字目は単語の最初と同じ音にもなっている）させている。平文は「敵 艦隊見ユトノ警報ニ接シ、連合艦隊 は直チニ出動、コレヲ撃沈 滅セントス、本日天気晴朗ナレドモ波高シ」となる。 例3 真珠湾攻撃で使われた暗号文：「ニイタカヤマノボレ1208」（＝12/8に日米開戦、事前に決めておいたフレーズを合図とした）。なお、「ト」の連打(＝全軍突撃せよ）、「トラトラトラ」(＝我、奇襲に成功せり）などもよく知られているが、正確には電信の短点連打音等の聞き分け易い音を合図としたものである。日本海軍機が搭載していたのは無線機電話機ではなく、無線電信機であったため、交戦時に複雑な電文の送信・聴取は困難なことから、和文電信で単純な符号の組み合わせなる(「ト」は短点3ツ、「ラ」は短点4ツを組み合わせて)、短点連打音(＝全軍突撃せよ）、短点7ツの反復音(＝我、奇襲に成功せり）を合図としたものである。 例4 単語を暗号書（コードブック）で対応する数字に変え、さらに乱数表から一定の法則で抜き出した数字を加える暗号もある。復号には、暗号作成時に使用したものと同一の乱数表と暗号書が必要。太平洋戦争における日本海軍がこうした暗号を使用していた。 一般的事項 長田順行,「暗号」,社会思想社、1985 桧山 良昭,「暗号を盗んだ男たち―人物・日本陸軍暗号史 」, 光人社NF文庫, 1993 釜賀一夫, 「基礎暗号学―情報セキュリティのために (1)」, サイエンス社, 1989 Lambros D. Callimahos, William F. Friedman, "Military Cryptanalytics: Includes Problems and Computer Programs , Vol 2, No 45, Part 2", Aegean Park Pr, 1985 David Kahn, "The Codebreakers: The Story of Secret Writing", Scribner, 1996 解読理論と演習 William F. Friedman, "Solving German Codes in World War I ", Aegean Park Pr, 1979 Wayne G. Barker, "Cryptanalysis of an Enciphered Code Problem: Where an Additive Method of Enchipherement Has Been Used", Aegean Park Pr, 1979 British War Office, "Course in Cryptanalysis: Explanatory Text and Short Exercises/Si Course Vol 1", Aegean Park Pr Army Records Society,"The British Army and Signals Intelligence During the First World War", Sutton Pub Ltd, 1992 商用コード William F. Friedman, "History of the Use of Codes", Aegean Park Pr, 1977 実例 National Security Agency, "Nsa Reveals How Codes of Mexico Were Broken", Aegean Park Pr, 2000 National Security Agency, "VATICAN code systems", Aegean Park Pr 陸軍参謀本部, 「陸軍暗号書 5号 昭和19年07月01日調製」, 1944 (靖国神社、靖国偕行文庫所蔵) ^ 加藤正隆『基礎 暗号学 Ⅰ』（サイエンス社）における分類とその解説を参照のこと。 ^ なおコンピュータプログラムに関して、「ソースコード」などコードという語があるのは、コンピュータの黎明期（プログラミング言語の発達前の1950年代）に、プログラムというものはまるで暗号のようだ、ということで暗号を指すコードから転じて使われるようになったという特殊な由来があるため注意。 ^ という意味ではサイファに近い性格がある。 ^ 一般には同一の版である必要があるが、聖書などは神学において精密な議論が必要だったという経緯から、専門家のための聖書は場所を正確に示すための補助が付いている。 ^ "hat" は、真の乱数を得るための古典的な操作である「袋に数などを書いた小片を多数入れてよくかき混ぜてから取り出す」という手法の代名詞である、シルクハットからか。 ^ 原理的には、表を端から順番に全て見ていって探せばよいわけであるから、時間がいくらでもあるならば（という非現実的な設定においては）表はひとつで良い。 表示 編集