暗号とは何かを理解する方法
正直に言うと、暗号学を深く掘り下げていくと、コードと暗号文の違いがかなり分かりにくくなることがあります。しかし、一般的に暗号文とは、判読可能な情報を判読不可能な情報(暗号文)に変換するアルゴリズムのことです。「cypher(サイファー)」と呼ぶ人もいますが、これは古い綴り、あるいは別の綴りです。一般的に、「コード」と「暗号文」は互換性があるかのように使われますが、厳密には異なるものです。コードは、単語やフレーズを置き換えることで、二次的な意味を付与します。例えば、一見無害な単語の背後にメッセージを隠すなどです。一方、暗号文は、アルゴリズムと秘密鍵に基づいて文字やデータをスクランブルすることで、より複雑な意味を持つようになります。実際には両者の境界線が曖昧なので、この違いは厄介な問題となることがあります。特に、単語を置き換えているだけで、実際には何も暗号化していない場合は、すべてを「コード」と呼ぶ人もいます。しかし、電子メールやデータ転送のセキュリティ保護など、実際の暗号化を扱う場合は、暗号こそが求めているものです。なぜなら、セキュリティは当然、鍵を秘密にしておくことにかかっているからです。誰かに秘密のアルゴリズムを推測されたり、総当たり攻撃で暗号を解読されたりするのは避けたいものです。だからこそ、現代の暗号化では共有可能なアルゴリズムを採用しながらも、鍵を秘密にしているのです。「ヴィジュネル暗号」や「AES 暗号化」という言葉を目にしたことがあれば、それは特定のアルゴリズム、つまりデータをスクランブルする特別な方法を持つ暗号です。現代の暗号は、アルゴリズム自体は鍵以外全員に知られていても安全になるように設計されています。これは、セキュリティは方法ではなく鍵にあるべきだとするケルクホフの原理に基づいています。ちなみに、シーザー暗号や ROT13 のような古典的な暗号は時代遅れです。基本的な置換や転置しか必要としないため、かなりの努力で解読できてしまうため、あまりにも単純すぎます。現代の暗号技術はそれを乗り越え、実際にテストされ安全性が証明された数学的に複雑なアルゴリズムを採用しています。現在、これらのアルゴリズムはメールの暗号化、銀行データの暗号化、そしてインターネット上の秘密保持全般に利用されています。確かに、両者の違いを理解することは重要ですが、日常的な暗号技術においては、ほとんどの人が強力でテスト済みのアルゴリズム(AESなど)を採用し、鍵を秘密にしています。当然のことながら、誰も簡単に標的にされるようなことは望んでいません。
実際に暗号化を触ってみたい、あるいはアルゴリズムをいろいろ試してみたいという方は、GitHubリポジトリ:Winhanceなどのリソースをチェックしてみてください。これらの仕組みがどのように構成されているかを知るには良い出発点となるでしょう。特に、暗号をいじったり、基礎を学んだりすることに興味がある方には最適です。ただし、最新のアルゴリズムでも、基本的な用途には過剰すぎる場合があるので、最初は少し戸惑っても心配しないでください。
コードは実際には暗号ではない
コードとは、通常、特定の単語やフレーズに意味を割り当てるシステムを指します。コードの単語やフレーズ自体には正当な意味があり、広く理解されている場合もありますが、そのコードは「知る人」だけが理解できる二次的な意味を付与します。あるいは、コードが全く意味をなさない文字の組み合わせである場合もあります。
例えば、お互いに信頼できるかどうかを確認したい2人のエージェントは、一対のコードフレーズを使うかもしれません。「この時期のパリの天気は良いそうですね。」と「個人的にはダブリンの方がずっと好きです。」は、チャレンジ・レスポンス・コードフレーズのペアと言えるでしょう。確立された意味と二次的な意味を持つコードフレーズを使う利点の一つは、外部の観察者が会話を全く平凡で、隠された意味があるとは考えにくいと判断できることです。このようなコードフレーズシステムは、もっともらしい否認可能性という利点があります。
ただし、選んだフレーズが通行人に使われないよう注意が必要です。最初のコードフレーズを一般の人に話した場合、少し奇妙に聞こえるかもしれませんが、それ以外は単なる雑談に過ぎません。コードフレーズの返答は、聞いている人にとっては意味が通じるものの、一般の人が言う可能性は極めて低いものを選ぶ必要があります。
暗号の中には、単語を全く使わないものもあります。例えば、「UBDIBF」は「任務完了、全目標達成」を示す暗号です。このような暗号を見たり聞いたりした人は、何らかの秘密メッセージが送られていると推測できます。しかし、暗号を知らなければ、その意味を推測することはできません。このような暗号は、短くて伝達しやすいという利点があります。しかし、どちらの方法も、工作員が正しい暗号を忘れてしまうリスクがあります。
暗号
暗号とは、メッセージをアルゴリズム的に改変し、暗号文と呼ばれる出力を解読不可能にする手法です。暗号の仕組みが理解され次第、暗号全体が役に立たなくなるのを防ぐため、「鍵」を用いて出力を変化させます。
現代の暗号技術では、アルゴリズムを定義する方法が2つあります。1つ目は鍵の種類によるものです。対称暗号は、データの暗号化と復号に同じ鍵を使用します。対称鍵は一般的に秘密鍵と呼ばれます。非対称暗号は、データの暗号化と復号にそれぞれ異なる鍵を使用します。通常、データの暗号化に使用される非対称鍵は公開鍵と呼ばれ、復号鍵は秘密鍵と呼ばれます。このように鍵と秘密鍵を利用することで、誰でもメッセージを暗号化でき、秘密鍵の正当な所有者だけがメッセージを復号して読むことができるという確信を持つことができます。
暗号はストリーム暗号とブロック暗号に分類できます。ストリーム暗号は連続したシンボルのストリームを暗号化します。ブロック暗号は固定サイズのデータブロックを暗号化するため、データがブロックサイズにぴったり収まらない場合はパディングが必要になります。
古典暗号と現代暗号
古典的な暗号は比較的単純でした。これは、当時の技術レベルが低かったため、暗号を手作業または簡単な道具で使用せざるを得なかったためです。これらの暗号では、転置や置換が用いられる傾向がありました。シーザー暗号やROT13などの置換暗号は、アルファベットの1文字を別の文字に置き換えます。ROT13では、各文字がアルファベットの13文字後の文字に置き換えられます。転置暗号も同様の動作をしますが、各文字のシフトは同一ではありません。このような手法は、転置アルファベットが文字ごとに変更される場合でも、比較的簡単に解読できます。これは、使用可能な鍵空間が狭く、使用できる異なる鍵の数に限りがあるためです。敵が暗号を解読してしまえば、すべての鍵を試してシステムを破ることができます。
現代の暗号はケルクホフの原理に基づいています。これは、たとえ鍵以外のシステム全体が敵に知られたとしても、暗号システムは安全を維持すべきであるというものです。そのため、現代の暗号は公開されており、セキュリティを損なうことなく十分に研究されています。今では鍵だけを秘密にすればよく、システム全体を秘密にしておくよりもはるかに管理しやすいのです。
結論
暗号は暗号化アルゴリズムの別名です。この用語をコードと互換的に使う人もいます(暗号化=エンコードのように)。しかし、これは厳密には正しくありません。コードは、そのコードの意味が秘密に保たれることを前提としています。また、コードは任意に決定することもできます。暗号は、任意のデータを暗号化するための繰り返し可能なアルゴリズムです。暗号のセキュリティは、鍵が秘密に保たれることを前提としています。
「暗号」という用語は、アラビア語でゼロを意味する「صفر (sifr)」に由来します。ローマ数字にはゼロの概念がなかったため、中世にアラビア数字がヨーロッパに広まった際に、このアラビア語の単語は中世ラテン語の「cifra」に取り入れられました。時が経ち、イギリスでこの用語は「cipher」へと進化しました。ゼロという新しい概念は理解しにくいと考えられていたため、実際には暗号化されていなくても、理解しにくいメッセージや通信を指す言葉として使われました。