Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

基礎: ストリーム暗号

暗号学、すなわち通信を保護する技術の研究は、コンピューターサイエンスに先立つ数学の一分野です。 セキュリティエンジニアの大多数は、暗号学の専門家である必要はありません。 しかし、すべてのセキュリティエンジニアは暗号学に対して健全な敬意を持つべきです。

私たちの社会が依存しているシステムには、金融取引を支えるものを含め、すべて何らかの「信頼」という概念があります。 通信相手は、自分が「話している」相手がなのかを確信を持って識別できます(認証)。 そして、その「会話」がプライベートであると安心できます(機密性)。

暗号ライブラリは、認証や機密性といった性質を支える技術的な仕組みです。 その信頼を構築し、維持するための中核的な手段です。 それらがなければ、現代のデジタルサービスのほとんどは実用的ではないでしょう。

セキュリティエンジニアを志す者として、既存の暗号 API を活用する前に理解に努めるべき基本概念があります。 まして、自分たちで暗号アルゴリズムを実装する前にはなおさらです(これは一般には推奨されません)。

大まかに言うと、対称暗号化はどのように機能するのか?

Alice と Bob という典型的な 2 人のユーザーが、安全に通信したいと考えています。 しかし問題があります。 彼らは、公共のインターネットや、2 基の低軌道(LEO)衛星を隔てる物理空間のような、安全でないチャネルを介してメッセージを交換する必要があります。 Mallory という名前の悪意ある攻撃者は、安全でないチャネルを通じて送信されるデータを閲覧し、場合によっては変更できます。

暗号化は機密性を提供します。これは、Alice が送信したメッセージの平文の内容を Bob だけが読め、その逆も同様であるという数学的な保証です。 Mallory は蚊帳の外に置かれます。彼女が捕捉したどのメッセージも、暗号化されているため、ランダムなごみと見分けがつかないように見えます。 メッセージの暗号化された、理解不能な形式は暗号文と呼ばれます。

実世界の通信プロトコルは、データ完全性(Mallory が転送中に Alice のメッセージを変更していないことの証明)も保証し、データ認証(Bob が偽物ではなく本物の Alice と話していることの証明)も提供します。 しかし、この議論の目的上、私たちが関心を持つのは機密性だけです。

では、Alice と Bob は暗号化を使ってどのように通信の機密性を保てるのでしょうか? 対称(別名「秘密鍵」)暗号は、わかりやすい選択肢です。 Alice と Bob が事前に安全なチャネルを使って暗号化について合意できれば、同じ対称暗号アルゴリズム(第 2 章の RC4 など)を使って、その後の安全でないチャネル上の通信を保護できます。

安全なチャネルは Mallory がアクセスできないものである必要があります。なぜなら、Mallory が鍵を知らない場合にのみ機密性を実現できるからです(したがって秘密鍵です)。 もしかすると Alice と Bob は、通信を予定している数か月前に一度対面で会い、鍵について合意するかもしれません。 安全なチャネルを用意するのは、多くの場合面倒です。 ときにはまったく実用的でないこともあります。

非対称(別名「公開鍵」)暗号は、この問題に対処します。 しかしそれは、この議論の範囲外の話題です。

Kerckoffs の原理

Mallory は秘密鍵を知っていてはいけません。 しかし、おそらく意外なことに、Alice と Bob が使用する正確な暗号化アルゴリズムを Mallory が知っているほうが、実際には望ましいのです!

Kerchoff の原理1は、暗号システムは、鍵を除くすべてを攻撃者が知っていたとしても安全であるべきだと述べています。 Alice と Bob の通信における安全性の保証は、よく知られ、十分に検証された暗号化アルゴリズムの数学的性質に由来すべきであり、特定の詳細を隠すことに由来すべきではありません(それは「隠蔽によるセキュリティ」であり、実際にはしばしば失敗する戦略です)。

わかりました。ではストリーム暗号とは何ですか?

Alice と Bob が秘密鍵について合意した後で、実際に暗号化を行うために使用できる対称アルゴリズムの一種です。

ストリーム暗号は、理論上は 1 ビットずつ暗号化できます。 ストリーム暗号はデータを連続したビットストリームとして「考え」ます。 実際には、現代のコンピューターはバイトアドレス可能なメモリを使用するため、ほとんどの実装は 1 バイト(8 ビット)ずつ暗号化します。

対照的に、ブロック暗号はデータを固定サイズのチャンクに分割する必要があります。 一般的な Advanced Encryption Standard(AES)2では、ブロックは 128 ビット(16 バイト)でなければなりません。

ストリーム暗号とブロック暗号はどちらも同じ目的を達成しますが、ストリーム暗号はメモリフットプリントが小さく、実行時間が速い傾向があります3。 そのため、低リソースの組み込みシステムやリアルタイムデータ処理によく使用されます。

任意のストリーム暗号アルゴリズムの「賢さ」は、有限サイズの鍵(RC4 では Alice と Bob が 40 ビットから 2,048 ビットまでの任意の長さを選べます)を、入力データと同じ長さのキーストリームへ変換する方法にあります(入力データは任意の長さになり得ます。たとえば 10 GB のファイルを暗号化する必要があるかもしれません)。

ストリーム暗号アルゴリズム設計の課題は、予測不可能なキーストリームを作ることです。 暗号化と復号は決定論的な操作であるにもかかわらず、Mallory からメッセージを効果的に隠すためには、キーストリームは(再現不可能な物理現象を測定して生成されたかのように)真にランダムに見えなければなりません。 暗号学者は、キーストリーム生成関数を*暗号論的に安全な疑似乱数生成器(CSPRNG)*と呼びます。

予測不可能なキーストリームを生成できれば、暗号化は簡単です。キーストリーム内のすべてのビット/バイトを、平文内の対応するビット/バイトと XOR して暗号文を生成します。

第 2 章の RC4 実装を見れば、これが実際にどのように機能するのかを感じ取れるはずです!

安全でないチャネル上での二者間通信。Paar らによる "Understanding Cryptography"、38 ページに基づく。

暗号学についてさらに学ぶにはどこを見ればよいですか?

Paar と Pelzl による Understanding Cryptography4 と、それに対応する動画講義5 をお勧めします。

多くの暗号学の本は博士課程レベルの数学の背景を前提としており、平均的な実務エンジニアにはほとんど読めません。 他の本はあまりにも単純化しすぎて、すべての数学を漫画のような図に置き換えています(このセクションもその罪を犯しています)。 Understanding Cryptography はその中間にある良い本です。学部レベルの数学経験があれば理解しやすい一方で、本物でもあります。


  1. ケルクホフスの原理。Wikipedia(2022年閲覧)。

  2. Advanced Encryption Standard。Wikipedia(2022年閲覧)。

  3. これは一般化した説明であり、性能特性はアルゴリズムと実装によって大きく異なります。また、特定のアルゴリズムがハードウェアで実装されている場合もあり、その場合は同等のソフトウェア実装よりもはるかに高速になります。たとえば、現代の x86 プロセッサは AES 専用の命令セット拡張を提供しており、その高速化は最大 13 倍に達することがあります6

  4. [個人的なお気に入り] 暗号理論を理解する。Christof Paar、Jan Pelzl(2009)。

  5. オンライン暗号理論コース。Christof Paar、Jan Pelzl(2009)。

  6. Advanced Encryption Standard New Instructions(AES-NI)分析:セキュリティ、性能、消費電力。Eslam AbdAllah、Yu Rang Kuang、Changcheng Huang(2020)。