コラム

既知平文攻撃とは?COA/CPA/CCAの違いも整理

更新: 桐生 遼介
コラム

既知平文攻撃とは?COA/CPA/CCAの違いも整理

イミテーション・ゲームで繰り返し話題になる“お決まりの挨拶”を思い出すと、既知平文攻撃の勘どころがすっと入ります。たとえば読者自身がシーザー暗号の1文字だけ「この平文がこの暗号文に化けた」と知れば、1分もかからず全体のずらし幅に手が届くはずです。

イミテーション・ゲームで繰り返し話題になる“お決まりの挨拶”を思い出すと、既知平文攻撃の勘どころがすっと入ります。
たとえば読者自身がシーザー暗号の1文字だけ「この平文がこの暗号文に化けた」と知れば、1分もかからず全体のずらし幅に手が届くはずです。
ここで押さえたいのは、既知平文攻撃(KPA)は特定の裏ワザ名ではなく、攻撃者が平文と対応する暗号文の組を知っているという前提条件のことだ、という点です。

本稿は、映画や古典暗号のエピソードから暗号の考え方をつかみたい人にも、AESやGCM、ChaCha20-Poly1305などの用語や仕組みの説明で混乱している人にも向けています。
クリブが歴史上どう使われ、そこから現代暗号の IND-CPA や AEAD へどう話がつながるのかをたどりつつ、COA・KPA・CPA・CCAの違いを表で整理し、「AESなら何でも安全」というありがちな誤解ではなく、アルゴリズム本体とモード運用を分けて見る視点まで一気に通します。

導入——映画のクリブは、いまのKPAと何が違う?

映画イミテーション・ゲームで印象に残る「お決まりの文句」は、暗号の世界でいうクリブの入り口です。
クリブとは、暗号文のどこかに含まれているはずだと見当をつけられる平文断片のことです。
毎朝の気象通報が混じる無線ログの束を机に広げ、「この時間の通信なら天気の定型句が入るはずだ」と目を凝らす。
あるいは文末近くにHeil Hitlerのような挨拶が差し込まれていそうだと考える。
そういう“想像の作業机”に座ってみると、どこが手がかりになるのかが急に具体的になります。
暗号解読は、正規の鍵で戻す復号とは違って、こうした断片から構造や鍵を逆算していく営みです。

このとき整理しておきたいのは、既知平文攻撃(KPA)が攻撃者が平文とそれに対応する暗号文の組を知っているという前提条件であるという点です。
映画のクリブはそのイメージを与えてくれますが、攻撃モデル全体の中では一段高い位置にあります。
攻撃者能力が弱い順に並べると、まず暗号文しか見えない暗号文単独攻撃(COA)があり、その次に平文と暗号文の対応を一部知っている既知平文攻撃(KPA)が来ます。
さらに攻撃者が自分で平文を選んで暗号化させられる選択平文攻撃(CPA)、そして暗号文を持ち込んで復号結果に関する情報まで引き出せる選択暗号文攻撃(CCA)へと続きます。
能力が一段上がるごとに、攻撃者は暗号の内部構造を探るための材料を一つ多く手に入れるわけです。

ここで読者が混同しがちなのが、「既知平文があるなら、もう危ないのでは」という感覚です。
古典暗号では、その直感はたいてい当たります。
シーザー暗号のように規則が単純なら、平文1文字と暗号文1文字の対応だけで、全体のずらし幅まで届くことがあります。
エニグマでも、クリブそのものに加えて「ある文字は自分自身には暗号化されない」という機械の性質や、通信手順の癖が突破口になりました。
歴史的なクリブは、たしかに強力でした。

ただし、その感覚をそのまま現代暗号に持ち込むと話がずれます。
現代の対称暗号は、既知平文が何組か見えても、それだけで鍵が抜け落ちるようには作られていません。
AESについて語るときに「平文と暗号文が1組わかったら終わり」とはならないのは、そのためです。
もちろん安全性はアルゴリズム本体だけでなく、ECBCBCCTRGCMのようなモードや、IV・ノンスの扱いまで含めて見なければなりませんが、設計思想そのものは古典暗号とは別物です。
現代では、少なくともCPAに対して区別できないこと、つまり IND-CPA のような概念で語るのが標準になっています。
さらに認証まで含めるなら、CCAを意識した整理や、適応的に問い合わせを変えていく適応的CPA/CCAまで視野に入ります。

適応的とは、攻撃者が前の応答を見て次の問い合わせを変えられるモデルを指します。
具体的には、暗号化オラクルに何度も平文を投げて観察するのが適応的CPAであり、復号側の反応を踏まえて次の暗号文を選べるのが適応的CCAです。
KPAはここまでの強い前提を許さないモデルです。
KPAを起点に攻撃モデルを一段ずつ確認すると、映画のクリブと現代の安全性定義が同じ座標軸上で理解できます。
まず定義を並べ、攻撃者が何を知っているかと、どの問い合わせを選べるかを明確に切り分けます。
まず定義をきちんと並べ、どこまでが「知っている情報」で、どこからが「選べる問い合わせ」なのかを切り分けます。
次に、古典暗号で既知平文がどれほど効いたのかを、手で追える感覚に落として体験します。
そのうえで、COA・KPA・CPA・CCAを比較し、線形解読法がKPA、差分解読法がCPAとして語られる位置づけも確認します。
そこまで来ると、AESやChaCha20-Poly1305の説明に出てくる IND-CPA、AEAD、さらにはCCA耐性という言葉が、ただの略号ではなく「攻撃者に何を許したうえで安全と言っているのか」を示すラベルとして読めるようになります。

既知平文攻撃とは何か

KPAの正式な定義と範囲

既知平文攻撃、いわゆるKPA(Known-Plaintext Attack)は、攻撃者が平文とそれに対応する暗号文の組をすでに知っているという前提で考える攻撃モデルです。
ここでの要点は、平文を推測できることではなく、対応関係がある組を持っているということです。
暗号文だけを眺める暗号文単独攻撃(COA)より一段強い条件で、攻撃者が自分で平文を選んで暗号化させる選択平文攻撃(CPA)よりは弱い条件に位置づけられます。

この定義を言葉だけで読むと少し乾いて見えますが、実際に机の上へ置いてみると輪郭が出ます。
たとえば、手元にメールの原文と暗号化後のバイナリが数通分ある場面を想像してみてください。
件名も本文も読めるメールと、その送信時に生成された暗号化データが対応づけられている。
そこで自然に湧く疑問は、「この条件だけで本当に鍵まで到達できるのか?」でしょう。
まさにその問いを立てるための枠組みがKPAです。
KPAは「もう破れた」という宣言ではなく、「攻撃者がここまでは知っている状態で、その暗号方式はどこまで持ちこたえるか」を測る物差しです。

古典暗号では、この物差しがそのまま突破口になる場面が多くありました。
シーザー暗号なら、平文1文字と暗号文1文字の対応だけでずらし幅がわかり、残り全部を戻せることがあります。
単一換字暗号でも、対応表が十分に埋まれば全体像が見えてきます。
エニグマでは、定型句やあいさつのようなクリブが、機械の性質と組み合わさって実戦級の手がかりになりました。
ここでは「既知平文がある」という事実が、そのまま暗号規則の露出につながっていたわけです。

一方で、現代の適切な対称暗号は、既知平文が何組かあるだけで鍵回復に直結しないよう設計されています。
AESでは、平文と暗号文の1組が見えても、そこから実用的に鍵を抜く既知平文攻撃は知られていません。
ただし、ここで語っているのは暗号アルゴリズム本体の話で、実務ではECBCBCCTRGCMのようなモードや、IV・ノンスの扱いを切り分ける必要があります。
パターン漏えいや運用ミスが絡むと、見えてくる情報の質が変わるからです。
KPAの定義そのものは単純でも、何が危険になるかは方式と運用で景色が変わります。

cryptanalysisとdecryptionの区別

この話題で混線しやすいのが、暗号解読と復号を同じもののように受け取ってしまう点です。
英語ではここをcryptanalysisとdecryptionで分けます。
decryption(復号)は、正しい秘密鍵を持つ正規利用者が、暗号文を元の平文へ戻す操作です。
いわば鍵穴に正しい鍵を差して扉を開ける行為です。

それに対して、cryptanalysis(暗号解読)は、正規の鍵を持たない立場から、暗号文やその周辺情報を手がかりにして、平文・鍵・内部構造へ迫る営みです。
こちらは鍵穴の形、扉の癖、出入りの記録を観察して、そもそもどんな鍵が使われているのかを逆算する作業に近いものです。
KPAはこのcryptanalysisの文脈に属します。
既知平文攻撃という名前に「攻撃」と入っているのは、正規の復号手順をなぞる話ではなく、情報条件を増やしたうえで暗号解読がどこまで進むかを問うからです。

映画や小説では、この二つがしばしば一緒くたに描かれます。
イミテーション・ゲームでも、画面の上では「暗号を解く」動きが強く印象に残りますが、あれは正規鍵で戻す復号ではありません。
クリブ、通信習慣、機械の癖を材料にして、内部状態へじわじわ近づく暗号解読です。
エニグマで「ある文字は自分自身に暗号化されない」という性質が効いたのも、まさにcryptanalysisの発想でした。
正規の鍵を持っているなら、そんな迂回路は要りません。

この区別を頭に置くと、「既知平文があるなら復号できるのか」という問いも整理できます。
正確には、「既知平文という条件を使って、暗号解読は前進するのか」と言い換えるべきです。
古典暗号では答えがそのまま「大きく前進する」になりやすく、現代暗号では「その条件だけでは足りない」が基本線になります。
問いの主語がdecryptionではなくcryptanalysisだと見抜けるだけで、記事や教材の説明が急に読みやすくなります。

攻撃モデルと攻撃手法を分離する

KPAを理解するときにもう一つ外せないのが、攻撃モデル攻撃手法を分けて考えることです。
KPAは「どうやって攻めるか」の名前ではなく、「攻撃者が何を知っているか」という条件の名前です。
ここを混同すると、線形解読法や総当たり探索と同じ棚にKPAを並べてしまい、話の軸がずれてしまいます。

たとえば、線形解読法は既知平文攻撃の枠組みで語られる代表的な手法です。
平文と暗号文の組を多数集め、暗号内部のビット関係に偏りがないかを統計的に探る方法だからです。
一方、差分解読法は選択平文攻撃の文脈に置かれます。
攻撃者が入力差分を自分で選び、その出力差分の振る舞いを観察する必要があるからです。
どちらも「手法」ですが、KPAやCPAはその手法を成立させるための「前提条件」です。
ここは地図の縮尺と、地図の上で歩くルートくらい別の話です。

総当たりも同じです。
鍵候補を順に試す総当たりは、手法としては単純ですが、攻撃者が何を持っているかで効率や判定方法が変わります。
平文と暗号文の対応が1組あれば、「この鍵候補で暗号化した結果が一致するか」を照合できます。
つまり、KPAは総当たりという手法を補助する情報条件にもなりえます。
しかしKPAそのものが総当たりではありません。
条件と方法をきちんと切り分けると、攻撃の議論が急に立体的になります。

この切り分けは、現代暗号の安全性を読むときにも効いてきます。
今の対称暗号は、少なくともCPAに対する識別不可能性、すなわちIND-CPAを目標に設計されるのが普通です。
CPAに耐えるなら、それより弱い条件であるKPAやCOAにも耐える、という順序関係で理解できます。
ここでも語られているのは「どんな手法が存在するか」より先に、「攻撃者へ何を許したうえで安全と言うのか」というモデルの話です。
ChaCha20-Poly1305やAES-GCMの説明でノンスやIVの扱いが何度も強調されるのも、アルゴリズム単体ではなく、攻撃者に見える情報と運用条件まで含めて安全性を定義しているからです。

KPAを「既知平文という裏ワザ」だと思って読むと、歴史的な逸話は面白くても、現代暗号の説明で足元をすくわれます。
KPAは裏ワザ名ではなく、攻撃者の立ち位置を指定するラベルです。
そのうえで、線形解読法のような個別の技法が乗る。
こう整理しておくと、映画のクリブからAESやChaCha20-Poly1305の安全性議論まで、同じ座標軸の上で眺められます。

まずは手を動かす:古典暗号で既知平文がどれほど強いか

シーザー暗号の1分演習

まずは、既知平文攻撃が「なるほど、これは効く」と腹落ちする最短コースから入ります。
相手がシーザー暗号を使っていて、平文の E が暗号文の H に対応していたとします。
この時点で、アルファベットを3文字ぶん後ろへずらしたと読めます。
E の次が F、次が G、その次が H なので、シフト量は 3 です。

ここまで分かると、あとは雪崩のように進みます。
たとえば暗号文がKHOORなら、各文字を3つ戻せばよいので、K は H、H は E、O は L、O は L、R は O となって、HELLOに戻ります。
筆者はこの手の入門演習をメモの端で何度もやりますが、毎回おもしろいのは「1文字の対応が、全文の規則をそのまま暴いてしまう」感覚です。
鍵というより、物差しが1本見つかった瞬間に全部の目盛りが読める、という印象に近いです。

シーザー暗号では、規則が「全ての文字を同じだけずらす」ただ1つなので、既知平文がたった1文字でも決定打になる場面があります。
だから古典暗号の世界では、平文と暗号文の組が1つ見えるだけで全体が崩れる、という話が誇張ではなく成立します。
KPAの強さを体で覚えるには、この小さな演習がいちばん手っ取り早いです。

単一換字での複数対応と推測

次に、同じ古典暗号でも少しだけ手応えの違う相手として単一換字暗号を見てみます。
これは、A はいつも Q、B はいつも M、E はいつも X、といった具合に、各文字を別の文字へ固定で置き換える方式です。
シーザー暗号と違って、「全部を同じだけずらす」という一本の規則ではありません。
文字ごとに対応表を持っているので、1組見えただけでは全体は決まりません。

たとえばメモ用紙に、平文の E が暗号文の X、平文の A が暗号文の Q と書けたとします。
この2つだけでは、まだ他の文字の対応は大量に残っています。
ここで筆者がよくやるのは、解けた文字だけ先に盤面へ置いて、空欄の多いクロスワードのように眺める方法です。
暗号文の中に X が多ければ、E は英語で頻出だから筋が通るな、と考える。
Q が語頭や短い単語の中に現れるなら、A 以外の可能性はどうか、と疑う。
単語の形、文字の頻度、繰り返し方を合わせて、候補を少しずつ削っていきます。

ここで見えてくるのは、既知平文が「そのまま答え」になる場合と、「推理の足場」になる場合があることです。
単一換字暗号では、26文字すべての対応が一度に分かるわけではありません。
数個の対応が判明しても、未確定部分にはまだ複数の候補が残ります。
だから頻度分析や、ありえそうな単語の推測が必要になります。
シーザー暗号が定規1本で全部測れる世界だとすれば、単一換字暗号はジグソーパズルの端だけ先に見えている状態です。
角と辺が分かれば進みますが、中央はまだ推理が要ります。

この違いは、KPAが万能ではなく、「どの方式に対して、どのくらい規則が露出するか」で効き方が変わることも教えてくれます。
古典暗号に強いとはいっても、1文字対応の破壊力は方式ごとに濃淡があるわけです。

ペア数が増えると何が起きるか

既知平文攻撃の直感で見逃せないのが、平文と暗号文のペアが増えるほど、候補が急に細くなることです。これは古典暗号で触ると、手の感覚としてよく分かります。

シーザー暗号なら、1文字対応の時点でシフト量が見えてしまうことがあります。
単一換字暗号では、そこまで一直線には進みませんが、それでも2組、3組と対応が増えるたびに景色が変わります。
最初は E と A しか分からず、暗号文の中に空欄だらけだったものが、T や O や N まで見えてくると、短い単語の輪郭が立ちます。
1つの単語が推定できると、その単語に含まれる新しい文字対応が増え、今度は別の単語が読める。
手がかりが手がかりを呼ぶので、途中からは一問一答というより連鎖反応です。

この「増えるほど有利になる」感覚は、実際に紙へ書くとよく伝わります。
2組だけのときは、候補がまだ横に広がっています。
3組になると、合わない対応が目立ち始めます。
さらに対応が積み重なると、整合しない仮説が次々に脱落します。
暗号解読の場面で、たった1つのクリブより、複数の平文断片が価値を持つのはこのためです。
情報が足し算ではなく、掛け算のように効いてきます。

筆者は古典暗号の講座でこの段階を説明するとき、よく「懐中電灯が1本ずつ増える感じ」とたとえます。
1本では部屋の一角しか見えませんが、2本、3本と増えると家具の位置関係まで読めるようになります。
単一換字暗号でも同じで、1つの対応は一点照明にすぎません。
しかし対応表が少しずつ埋まると、暗号文全体の構造が急に立体的になります。
KPAが強いのは、単に“知っている情報がある”からではなく、その情報が他の部分の推測まで連れてくるからです。

クリブとは何か——エニグマ解読で果たした役割

cribの定義と運用

crib(クリブ)は、暗号解読の文脈では既知、または高い確率でそうだと見込める平文断片を指します。
もともとの語感には「カンニングペーパー」や「答えの手がかり」のような含みがあり、その名の通り、暗号文のどこかに潜んでいるはずの言い回しを足場にして突破口を作る発想です。
戦時の無線傍受では、通信の中身を最初から全部知っている必要はありません。
「この種の報告なら冒頭にこの語が入りがちだ」「締めの敬礼は毎回ほぼ同じだ」という断片的な見当が、十分に武器になりました。

前のセクションで見た古典暗号では、既知平文が規則をそのままあぶり出す場面がありました。
エニグマ相手では事情がもう少し機械的で、平文断片それ自体に加えて、機械の癖や運用の癖を組み合わせていきます。
そこで効いてくるのがクリブです。
つまり「この暗号文のどこかに “eins” が入っているのではないか」「この長さなら気象通報の定型句が重なるのではないか」と見当をつけ、位置をずらしながら当てていくわけです。

筆者がこの仕組みを説明するときは、受信ログの束を想定して、暗号文の上に E I N S といった短い語をずらしながら重ねてみます。
複数の解説や解析報告では "eins" が頻出したと記述されており、クリブとして重宝されたとされますが、一次史料の定量的な裏取りは限られるため、出典に注意する必要があります。
どの位置に置くと矛盾が出るかを照合していく作業は、解読というより盤面の見えないパズルを立ち上げる感覚に近いのです。
筆者は受信ログの束を想定して、暗号文の上に eins のような短い語をずらしながら当ててみる説明をします。
複数の解説や解析報告では eins が頻出したとする記述が見られ、クリブとして重宝されたとされていますが、一次史料による厳密な頻度の裏取りは限られます。
したがって「約90%」といった断定的な比率を掲げる際は出典注記を付けるか、「一部資料では〜とされる」といった慎重な表現にとどめるのが適切です。
どの位置に置くと矛盾が出るかを照合していく作業は、解読というより盤面の見えないパズルを立ち上げる感覚に近いのです。

自己文字に写らない性質

エニグマ解読でとりわけ重要なのが、ある文字が自分自身に暗号化されないという性質です。
たとえば平文の E が暗号文の E になることはありませんし、A も A にはなりません。
この制約だけでクリブ探索の効率が大きく変わります。

たとえば暗号文のある位置にeinsを置いてみるとします。
そのとき、重ねた場所で E と暗号文の文字が同じなら、その配置はその場で脱落です。
I も N も S も同様です。
筆者はこの条件を初めて紙上で試したとき、「候補が減る」というより「通れない道が一瞬で消える」と感じました。
とくにE は E にならないという制約は、見た目以上に強い。
何も制約がないときは、それらしく見える並びがあちこちに残ります。
ところが自己一致禁止を入れた途端、候補の多くがばさっと落ちる。
暗号解読が数学であると同時に、手触りのあるパズルでもあると実感する瞬間です。
この性質は、クリブをただ「ありそうな語」として置くのではなく、「置けない位置をすばやく消す道具」に変えました。
Heil Hitlerのような長めの定型句なら、文字数が多いぶん自己一致に引っかかる箇所も増えます。
気象通報の定型句でも同じで、候補の位置をずらしていくたびに、ありえない重なりを除外できる。
つまりエニグマ解読では、クリブの内容と機械の性質が噛み合って、探索空間を狭めていったわけです。

自己文字に写らない性質

映画イミテーション・ゲームで印象的に描かれる「お決まりの文言を狙う」発想は、単なるドラマ的演出ではありません。
平文の予想、通信運用の癖、そして「自己文字に写らない」という機械の特性が重なったところに、史実としてのクリブの切れ味があります。
読んでいると地味な事務処理に見える場面でも、実際には「ここには置けるか、置けないか」を詰める知的な選別が続いていたのです。

攻撃モデルを並べる:COA・KPA・CPA・CCAの違い

COA/KPA/CPA/CCAの定義

既知平文攻撃を理解すると、その周囲にある攻撃モデルも並べて見たくなります。
ここは用語の棚を一度きれいに整える場面です。
筆者は初学者向けに説明するとき、紙片に「暗号文だけ」「平文と暗号文の対応がある」「好きな平文を暗号化できる」「好きな暗号文を復号できる」と書いて机に並べます。
すると、読者は自然に「下に行くほど攻撃者の手札が増える」とつかめます。
この感覚が入ると、COA、KPA、CPA、CCAの並びは丸暗記ではなく、条件カードの強弱として頭に残ります。

COAは暗号文単独攻撃です。
攻撃者が見られるのは暗号文だけで、平文もオラクルもありません。
古典暗号なら頻度分析が代表例で、文字の出現頻度や並びの癖から元の規則を探ります。
これは4つの中でいちばん弱い条件です。

KPAは既知平文攻撃です。
攻撃者は、ある平文とそれに対応する暗号文の組を持っています。
前の節で見たクリブは、この文脈にきれいに収まります。
古典暗号ではこの条件だけで一気に景色が変わります。
シーザー暗号は平文1文字と暗号文1文字の対応だけで全体が読めることがあり、単一換字暗号でも対応表が十分に集まれば全体像が見えてきます。
逆に、対応が少なければ推測作業が残るので、KPAといっても「何組わかっているか」で手触りは変わります。

CPAは選択平文攻撃です。
攻撃者が自分で平文を選び、それを暗号化した結果を観察できます。
つまり、既知平文が偶然手に入るのを待つのでなく、「この入力を入れたらどう出るか」を自分で試せる立場です。
古典的な説明なら、差分のある入力を投げて規則性を見るイメージが近いでしょう。
KPAより一段強いのは、観測対象を攻撃者が設計できるからです。

CCAは選択暗号文攻撃です。
攻撃者は自分で選んだ暗号文を復号させ、その結果を得られます。
これはここまでで最も強いモデルです。
暗号化だけでなく復号にも触れられるので、システムのふるまいから情報を引き出せる余地が増えます。
現代暗号の実務では、このモデルを意識しないと「暗号としては強いのに、復号エラーの出し方やAPIの設計で崩れる」という話が現実に起こります。

攻撃者能力の順序は、COA < KPA < CPA < CCAです。
左から右へ進むほど、攻撃者に許された操作が増えます。
現代の適切な対称暗号では、COAに耐えるのは出発点にすぎません。
KPAでも鍵回復に直結せず、さらにCPAやCCAまで見据えて安全性を定義する、という流れが今の標準です。

適応的CPA/CCAとは

ここで「適応的」という言葉も押さえておきたいところです。
適応的CPAや適応的CCAでは、攻撃者は一度だけ問い合わせるのではなく、前の問い合わせ結果を見て次の問い合わせ内容を変えられます
この反復性が、現代暗号でいうオラクル攻撃の空気感です。

たとえば適応的CPAなら、ある平文を暗号化して得た暗号文を見て、「では次は、この1ブロックだけ変えた平文を投げよう」と次の入力を組み立てられます。
適応的CCAでは、その構図が復号側にも広がります。
ある暗号文に対する反応を見て、次はそこを少し改変した暗号文を試す、といった具合です。
単発の問い合わせよりも、対話を重ねながら弱点をあぶり出す形になります。

この話が現代的なのは、暗号を数学の箱としてだけでなく、暗号化オラクルや復号オラクルにアクセスできるシステムとして考えるからです。
API、通信プロトコル、トークン処理、復号エラーの返し方まで含めて安全性を見る発想です。
AES本体の鍵長は128/192/256ビット、ブロック長は128ビットですが、実務で問題になるのはアルゴリズム名だけではありません。
AES-ECBのように平文パターンが見えやすい使い方は敬遠され、AES-GCMやChaCha20-Poly1305のようなAEADが主流になったのも、単に読まれないだけでなく、改ざんやオラクル的な悪用までまとめて防ぎたいからです。

そのため現代暗号の文脈では、「既知平文に耐えるか」だけで話を閉じません。
IND-CPAや、さらに認証まで含めたAEADの安全性が重視されるのは、攻撃者が机の上で条件カードを並べ替えるだけでなく、実際にシステムへ問い合わせながら次の一手を組み立てる時代になったからです。

線形/差分解読法の位置づけ

攻撃モデルと具体的な解読法の対応も、ここで短く整理しておくと混乱が減ります。
線形解読法は松井充が1993年に示した手法で、位置づけとしてはKPA文脈で語られるのが基本です。
平文と暗号文の対応組を集め、内部のビット関係に偏りがあるかを統計的に探ります。
既知の対応ペアが積み重なるほど、見えなかった内部構造に輪郭が出てきます。

一方の差分解読法は、BihamとShamirが1989年に提案した手法で、CPAの文脈で説明されることが多いです。
こちらは、攻撃者が差分を意図して作った平文ペアを暗号化させ、その出力差分の伝わり方を観察して鍵に迫ります。
KPAでも似た観測はできますが、差分解読法の利点は、攻撃者がどの差分を入れれば暗号内部でどのように広がるかを自分で仕込める点にあります。
だからCPA側に置いたほうが筋が通ります。

この2つを並べると、攻撃法の名前だけで覚えるより、どんな手札を持つ攻撃者を想定しているかで整理したほうが頭に残ります。
線形解読法は既にある対応ペアを読み取るタイプに近く、差分解読法は差のある入力を作って観察するタイプに近いです。
映画で描かれるクリブから入った読者でも、この軸で見ると古典と現代が一本につながります。

攻撃モデルの比較表

文章だけだと混線しやすいので、1分で見返せる形に並べます。

攻撃モデル攻撃者が持つ情報・能力強さの位置典型的な見方・例現代暗号での意味
COA(暗号文単独攻撃)暗号文のみ最も弱い頻度分析、パターン観察最低限ここで崩れないことが前提
KPA(既知平文攻撃)平文と対応する暗号文の組COAより強いクリブ、既知の定型句、線形解読法適切な対称暗号ならこれだけで鍵回復に至らない
CPA(選択平文攻撃)攻撃者が選んだ平文を暗号化できるKPAより強い暗号化オラクル、差分解読法近代的安全性定義の中心になりやすい
CCA(選択暗号文攻撃)攻撃者が選んだ暗号文を復号できる最も強い復号オラクル、改ざん応答の悪用実装やプロトコルも含めた堅牢性が問われる

モードや方式に目を向けると、この表の読み方がさらに具体的になります。
AES-ECBは暗号アルゴリズムそのものより、同じ平文ブロックが同じ暗号文ブロックになってしまう見え方が問題です。
AES-CBCはIV運用でその欠点を和らげますが、認証は別に考える必要があります。
AES-GCMやChaCha20-Poly1305は、平文パターンを隠すだけでなく認証もまとめて扱います。
ChaCha20-Poly1305は256ビット鍵、96ビットノンス、128ビットタグを用いるAEADとして定着しており、GCMも96ビットIVと128ビット級のタグを前提に運用する設計です。
ここでノンスを再利用すると、方式の看板とは無関係に土台が崩れます。
筆者はこの点を、強い金庫に同じ合鍵番号を毎回貼って回るようなものだと説明しています。
暗号名だけ見て安心するのでなく、どの攻撃モデルまで含めて守っている設計かを見るほうが、実態に近い読み方になります。

現代暗号はなぜ既知平文攻撃に耐えられるのか

AES本体とモードを分ける

古典暗号の感覚でいると、「平文と暗号文の対応が何組か分かったなら、そこから鍵へ迫れるのでは」と考えたくなります。
ここでいちばん大切なのは、AESそのものと、AESをどう使うかというモードを分けて考えることです。
現代のブロック暗号は、その二つを一緒くたにすると見通しが一気に悪くなります。

AESはブロック暗号で、決まった長さのブロックを鍵付きの置換として変換します。
現時点の知見では、平文と対応する暗号文が1組や数組わかっただけで、実用的な計算量で鍵そのものを回復する既知平文攻撃は知られていません
ここが、シーザー暗号や単純な換字式暗号と大きく違うところです。
古典暗号では「対応が見えた瞬間に規則も見える」場面がありましたが、AESでは1組見えても、その背後の鍵空間はほとんど動きません。

ただし、ここで「ではAESという名前が付いていれば何でも同じだけ安全だ」と思うと、別の落とし穴に入ります。
実務ではAES-ECBAES-CBCAES-GCMのように、同じAESでも使い方が別物です。
ブロック暗号本体が堅牢でも、モードの選び方やIV・ノンスの扱いが悪ければ、平文の形や構造が見えてしまいます。
現代暗号は古典暗号と断絶した魔法の箱になったのではなく、設計の焦点が「アルゴリズム本体」だけでなく「運用を含む方式全体」へ広がった、と捉えると腑に落ちます。

ECBのパターン漏えい

その違いがいちばん直感的にわかるのがECBです。
ECBでは、同じ平文ブロックは同じ暗号文ブロックになります。
鍵を直接ばらしてしまうわけではありませんが、繰り返しの模様は暗号文の側に残ります。

筆者が初めてこの話を腹落ちさせられたのは、有名な「同じ画像をECBで暗号化すると輪郭が残る」という例を見たときでした。
画面全体は読めないのに、明るい部分と暗い部分の配置だけが、ぼんやりシルエットとして浮かび上がるのです。
まるでモザイクをかけたはずの絵から、服のしわや背景の塊だけが残ってしまう感覚でした。
あれを見ると、「暗号化したのに見えているものがある」という事実が、一気に手触りを持ちます。

ここで漏れているのは、ふつうの意味での既知平文攻撃の成功とは少し違います。
ECBのまずさは、「平文/暗号文ペアから鍵が取れる」ことより、「同じものが同じように暗号化される」せいで、構造が観測できる点にあります。
だからAESの評価とAES-ECBの評価は分けて読む必要があります。
AES本体に実用的KPAがないことと、ECBが推奨されにくいことは、矛盾ではなく、見ている層が違うだけです。

IND-CPAの直感

現代暗号の「既知平文に耐える」を、もう少し現代的な言葉で言い換えると、IND-CPAの直感に近づきます。名前は少し硬いですが、考え方はそこまで遠くありません。

イメージとしてはこうです。
攻撃者は、過去にいくつもの平文と暗号文の対応を知っている。
さらに、自分で選んだ平文を暗号化させる力まである。
それでも、新しく出てきた暗号文について「これは候補Aの暗号化か、候補Bの暗号化か」を見分けられないなら、その方式は強いとみなします。
つまり、既知平文がたくさんあっても、次の暗号文から新しい平文の中身を当てる足場にならないことが、現代的な安全性の芯です。

古典暗号だと、既知の対応はそのまま「規則の露出」でした。
けれど現代暗号では、対応ペアは過去の観測記録にとどまり、未来の暗号文の意味を決定的には教えてくれません。
たとえば、過去の通信で「LOGIN」「ERROR」「YES」のような定型句をいくつも知っていても、新しい暗号文を見た瞬間に「これはその延長だから中身はこれだ」と読めるわけではない。
その“先回りを許さない”感覚が、IND-CPAの直感です。

もちろん、これはモード込みの話です。
AES-GCMやChaCha20-Poly1305のような現代的な方式が評価されるのは、ブロックやストリームの変換が強いだけでなく、平文パターンを隠し、さらに認証まで与える設計になっているからです。
反対に、ノンスを再利用するとストリーム暗号系では同じキーストリームがぶつかり、そこから平文どうしの関係が露出します。
現代暗号は「アルゴリズム名が強い」だけでは足りず、IND-CPAやAEADといった設計目標まで含めて眺めると輪郭がきれいにつながります。

平文/暗号文ペア数の“誤解”整理

初学者向けの教材やQ&Aで、「AES-192なら平文/暗号文の組が何組あれば鍵が決まるか」といった問いが流通しています。
ここには、候補鍵をたくさん落とせることと、真の鍵を現実的に見つけられることが混ざりやすい、という落とし穴があります。

たしかに、平文/暗号文の組が増えるほど、でたらめな候補鍵の大半はふるい落とされます。
直感としては、「2組のペアがあれば、もう候補鍵はだいぶ絞れたのでは」と感じるはずです。
その感覚自体は外れていません。
筆者も最初はそこに引っ張られました。
1組目で候補を並べ、2組目で多くが消えたら、もう出口が近いように見えるからです。

けれど、そこから先に残る探索量が問題です。
少数のペアで偽鍵の大半を排除できることと、真の鍵に到達することは別です。
前者は情報のふるい分けで、後者は天文学的な鍵空間を実際に横断する話だからです。
候補が理屈の上で細って見えても、それを現実の計算で突き止める壁は依然として高いまま残ります。
ここを飛ばして「何組で鍵が求まる」と言い切ると、古典暗号の感覚を現代暗号へ持ち込みすぎることになります。

誤答として出回りがちな「何組あれば十分」という言い回しは、情報理論的な見積もりと実用攻撃の難しさを混同しています。
実務の目線では、少数の平文/暗号文ペアが見えても、AESに対してそれだけで鍵回復へ進めるわけではありません。
ここでもやはり、古典暗号との違いは「既知平文が無意味になった」のではなく、既知平文が与える情報が、鍵回復へ直結しないよう設計されたところにあります。
古典から現代への変化は断絶というより、攻撃者に渡るヒントの価値を、数学とモード設計で少しずつ削ってきた進化だと見るのが自然です。

AESだけでは足りない場面——モード、IV/ノンス、AEAD

AESという名前だけ見ていると、強いアルゴリズムを選べば話は終わり、と感じがちです。
ですが実務では、暗号本体より先にどのモードで包むかIVやノンスをどう回すか、そして認証を一緒に付けるかで安全性の景色が変わります。
前の節で触れたECBのように、アルゴリズムそのものより「使い方の層」で情報が漏れる例は珍しくありません。

位置づけをざっくり並べると、CBCとCTRは「暗号化の見え方を整える」ための代表的なモードで、GCMはそこに認証まで組み込んだ現代的な形です。
CBCはブロック同士を連鎖させ、CTRはカウンタから鍵流を作って平文と組み合わせます。
GCMはCTR系の暗号化に認証タグを加えたもの、と捉えると筋が通ります。
ここでつまずきやすいのが、どの方式でも IV やノンスは単なる添え物ではない、という点です。
ここを雑に扱うと、AES本体の強さとは別のところから崩れます。

IV/ノンス運用の要点

CBCでは IV が毎回きちんと変わることが前提になります。
狙いは、同じ平文ブロックが出ても同じ暗号文の出だしにならないようにすることです。
CTRやGCMではノンスの役割がもっと切実で、同じ鍵で同じノンスを二度使わないことが安全性の土台になります。
GCMは 96ビット IV を標準的に扱う設計で、この非反復性に強く依存します。
ChaCha20-Poly1305も同じく 96ビットのノンスを使う AEAD で、鍵ごとのノンス重複を許しません。

筆者はこの話を説明するとき、机の上で時系列メモを書きます。
たとえば午前の送信で、平文attack at dawnがあるノンスで暗号化され、午後に別メッセージretreat at noonが、うっかり同じノンスで暗号化されたとします。
CTR系やChaCha20系では、どちらも同じ鍵流を使ってしまうので、攻撃者は二つの暗号文を XOR した瞬間に、鍵流が消えて平文どうしの XOR を得ます。
最初の時点では「中身そのものは見えていない」と思えても、午後のログが加わった瞬間に景色が変わるのです。
さらに夜になって、どちらか一方の文面の一部が既知だった、たとえば定型ヘッダや API パスのような断片が分かったとすると、もう片方の同じ位置の文字列が芋づる式に戻ってきます。
机上シミュレーションをやると、漏えいは一発で全文復元とは限らないものの、「関係しか漏れないから平気」とは到底言えないことがよく分かります。

GCMのノンス再利用は、ここがさらに怖いところです。
機密性だけでなく認証側まで巻き込み、同一鍵・同一ノンスの再利用が破局点になります。
平文間の関係が露出するだけでなく、タグの安全性にも傷が入り、偽造可能性に踏み込まれます。
だから実装では「ランダムなら何とかなるだろう」ではなく、鍵ごとに重複しない設計を先に決める必要があります。
高スループットの系では、筆者は乱数任せより、プロトコルで定めた構成に沿ってカウンタ管理する設計のほうが事故の芽を潰しやすいと感じます。
再起動、並列処理、複数ノード配備が絡んだ瞬間、うっかり同じ値を踏む場面が出るからです。

💡 Tip

IV とノンスは「秘密にする値」ではなく、「同じ鍵の下で衝突させない値」と捉えると整理がつきます。CBCでは予測されにくい初期値が要り、CTRやGCMでは一意性が核心です。

AEADとは何か

ここで出てくるのがAEADです。
正式には Authenticated Encryption with Associated Data、つまり認証付き暗号です。
暗号文を読めなくするだけでなく、「途中で書き換えられていない」と検証できる形まで一つの設計にまとめます。
Associated Data は、暗号化はしないが認証には含めたい情報です。
通信ヘッダや種別情報のように、見えていてよいが改ざんは困るものがここに入ります。

この発想がいるのは、機密性だけでは防げない攻撃があるからです。
現代暗号では、平文を隠せるかどうかを IND-CPA や IND$-CPA といった形で議論しますが、それだけでは足りません。
暗号文が勝手に作り替えられないこと、つまり INT-CTXT のような完全性の性質まで必要になります。
暗号化だけして認証がない方式は、「読めない」一方で「いじれる」ことがあります。
ここが、初学者がいちばん驚く判断材料になります。

筆者が CTF を通ってこの感覚をつかんだとき、印象に残ったのは「暗号が解けなくても勝てる問題がある」という事実でした。
平文を読む力がなくても、暗号文の一部をひっくり返して受信側の挙動差を見るだけで、情報が少しずつ落ちてくる場面があります。
CBCで認証なしのまま復号エラーの出方が漏れると、パディングオラクルのような別種の攻撃が成立します。
攻撃者は鍵を知らないまま、サーバの「その暗号文はそれっぽい形に復号できたか」という反応だけを使って、平文を削っていけます。
ここでは KPA だけを考えていても足りません。
暗号文を改ざんできる相手を前提にした CCA 寄りの目線が必要になります。

この意味で、AEAD は「暗号化のオプション」ではなく、「暗号文を受け取るシステムのふるまいを守る枠組み」です。
読めないことに加えて、正しい送り手が作ったものだけを通す。
そこまで揃って、ようやく通信路として落ち着きます。

ChaCha20-Poly1305とAES-GCM

実務でよく名前が出る AEAD の代表がChaCha20-Poly1305とAES-GCMです。
前者はChaCha20で暗号化し、Poly1305で認証する組み合わせです。
IETF の仕様であるRFC 8439では、256ビット鍵と 96ビットノンスを使う形が基本になっていて、認証タグは 128ビットです。
後者のAES-GCMも、GCM の標準的な運用では 96ビット IV と 128ビットタグが中核にあります。
どちらも「暗号化+認証」を一体で扱うので、単なるAES-CBCやAES-CTRより、現代プロトコルでそのまま使いやすい構図になっています。

一次資料に当たるなら IETF の RFC 8439(ChaCha20-Poly1305)や NIST SP 800-38D(GCM)を参照してください。
RFC 8439: NIST SP 800-38D: これらはノンス/IV の扱いや実装上の注意点を明記しています。
この二つを並べると、「現代暗号はAESさえ選べば終わりではない」という話が、抽象論でなく見えてきます。
CBCは文脈によってはまだ登場しますが、認証を別で足さないと改ざん耐性が抜け落ちます。
CTRは機密性の部品としては筋がよくても、ノンス再利用で一気に崩れます。
GCMは認証まで含めて現代的ですが、ノンス再利用に対しては神経質なくらい厳密です。
そこへChaCha20-Poly1305を並べると、いま主流の議論が KPA 止まりではなく、モード運用、ノンス設計、認証の有無まで含めて安全性を定義する段階に移っていることが分かります。

既知平文攻撃から見える現代暗号の安全性の読み方

参照: RFC 8439 , NIST SP 800-38D

安全という言葉の読み方

ここまで見ると、既知平文攻撃に耐えるかどうかは、安全性の入口にすぎないことが見えてきます。
現代暗号の説明で「KPAに耐える」と書かれていたら、それは悪い意味ではなく、そこだけを言っているならまだ粒度が粗いと読んだほうが正確です。
いま主流の言い方では、より強い概念として CPA security、そして平文の意味的な情報を漏らさないという semantic security が基準線になります。
ざっくり言えば、「いくつかの平文と暗号文の対応を知っていても崩れない」より、「攻撃者が暗号化の条件をもっと有利に選べても、暗号文から有意な情報を引き出せない」のほうが強い主張です。

この違いは、映画のクリブを思い浮かべると腑に落ちます。
古典暗号では、平文の断片が見えただけで盤面が一気に開くことがありました。
現代暗号では、その種の“見えている断片”を前提にしても、ただちに鍵回復へ進まないよう設計します。
だから「既知平文攻撃に耐える」とだけ書くと、古典暗号との対比としては正しくても、現代的な安全性評価としては一段弱い。
ここで用語を丁寧に使うかどうかで、説明の精度が変わります。

筆者は製品説明や技術紹介で「安全」という一語を見たとき、頭の中で小さく問い返す癖があります。
それは、どの攻撃モデルに対する主張ですか、という問いです。
COAなのか、KPAなのか、CPAなのか、あるいは認証や改ざん耐性まで含めた話なのか。
このひと呼吸を入れるだけで、宣伝文句と設計上の約束を切り分けやすくなります。
暗号の文章は、言葉の幅が広いぶんだけ、読み手の側で解像度を上げる必要があります。

そのときの表現も、断定より条件付きで読むのが自然です。
たとえば「現在知られる実用攻撃はない」「適切に実装された条件では、現実的な計算資源で破る方法は見つかっていない」といった書き方なら筋が通っています。
逆に「絶対安全」「完全安全」と言い切る文は、暗号の文脈では身構えたほうがよい場面が多い。
理論上の完全安全という言葉は別の厳密な意味を持ちますし、実務の製品説明でそれを軽く使うと、数学的性質と現場の運用がごちゃまぜになります。
たとえばワンタイムパッドのように、条件を満たしたときに情報理論的な完全安全を持つ方式はありますが、日常の多くのシステムがその意味で動いているわけではありません。

モデル→実装→運用の三層

安全性を読むときは、アルゴリズム名だけで判断しないほうが実態に近づきます。
筆者の中では、暗号の安全性は「モデル」「実装」「運用」の三層で見ると整理できます。
モデルは、CPA security や semantic security のように、何を攻撃者に許し、何を守れれば安全と呼ぶかという設計図です。
実装は、その設計図どおりにコードとライブラリが組まれているかという層です。
運用は、鍵の保管、配布、更新、ノンスや IV の扱い、乱数源、プロトコルのつなぎ方まで含めた現場の層です。

この三層のどこかが抜けると、アルゴリズム名だけ立派でも全体は守れません。
AESそのものは強固でも、ECBで模様が漏れれば暗号文の見え方に問題が出ます。
AES-GCMやChaCha20-Poly1305のような AEAD を選んでも、同じ鍵の下でノンスを再利用すれば話は崩れます。
ChaCha20-Poly1305は 256ビット鍵と 96ビットノンスを前提にした構成で、AES-GCMも標準的には 96ビット IV と 128ビットタグの運用が中核です。
ここで問われるのは、方式名を知っているかより、その前提条件を守れる設計になっているかです。

筆者が監査観点で文章を読むとき、頭の中で短いチェックリストが回ります。
モードは何か。
ノンスはどう作るのか。
認証は付いているか。
この三つだけでも、説明の密度がぐっと上がります。
AESですで止まっている説明より、AES-GCMなのかAES-CBCなのか、ChaCha20-Poly1305なのかまで書かれている説明のほうが、読める内容が増えます。
さらに、ノンスや IV をどう衝突させないか、鍵をどこで分けるかまで見えると、アルゴリズム名の看板ではなく、システム全体の設計が見えてきます。

暗号の安全性は、金庫の鋼材だけを見て評価する話に似ていません。
鍵を机の上に置けば、金庫の材質が優秀でも意味が薄れます。
通信でも同じで、鍵管理が緩ければ、理論的に強い暗号を使っていても守りは破綻します。
プロトコルが改ざんに弱ければ、CPA security の議論だけでは足りません。
乱数源が不安定なら、ノンスや鍵生成の前提が崩れます。
つまり「安全」はアルゴリズムのラベルではなく、鍵管理・プロトコル・実装・運用を束ねた総合評価として読むのが正しいわけです。

既知平文攻撃の話から出発すると、この読み方の感覚が身につきます。
平文の一部が知られても壊れない、というだけで安心せず、その先にある攻撃モデルの強さ、実装の前提、運用の手順まで視野に入れる。
そこで初めて、「安全」という言葉が何を保証し、何をまだ保証していないかが見えてきます。

まとめと次のアクション

要点を3行で総括

KPAは、平文と暗号文の対応を手がかりにする攻撃モデルです。
古典暗号ではこれだけで盤面が開く場面が多く、強い突破口になりました。
現代ではその先を見て、IND-CPAやAEADのように、より強い前提に耐える設計で読むのが筋です。

筆者は、用紙1枚で「攻撃モデル早見表」を自作して机に貼る方法をよく勧めます。
COA、KPA、CPA、CCAを並べて、「相手が何を持っている攻撃者か」をひと目で言える形にしておくと、「安全」という言葉を見た瞬間の解像度が上がります。
記事を閉じたら、その表を見ずに1分で四つを自分の言葉で言い分けてみてください。
そこで詰まる場所が、そのまま次の学びどころになります。

手を動かす課題

まずは、シーザー暗号の平文1文字と暗号文1文字の組を1つだけ置き、全体を最後まで復元してみてください。
「既知平文が効く」とはどういう感触かが、頭ではなく手でつかめます。
単一換字暗号では同じ勢いで全部は開かないことも、そこで自然に見えてきます。

次に、業務文書でも技術紹介でも、AESという語を見つけたら、モード、IVまたはノンス、認証の三つを必ず確認する習慣を入れてください。
AES-GCMやChaCha20-Poly1305まで書かれているか、認証が含まれているか、前提条件まで見えているかを見るだけで、読みの深さが変わります。
そこで毎回ひとつ、自分に問い返してみてください。
その「安全」は、どの攻撃モデルに対する主張か。

シェア

桐生 遼介

サイエンスライター。暗号と映画・文学・パズル文化の接点を探るコラムを得意とし、暗号を「解く楽しさ」から伝えます。

関連記事

コラム

紙にHELLOと書き、文字を3つ先へずらしてKHOORに変えると、暗号はまず手で触れる遊びとして立ち上がります。そこからブラウザの錠前アイコンを開く気持ちでTLS 1.3の流れを指でなぞると、暗号は遊びではなく、毎日の通信を支える社会基盤だと実感できます。

コラム

調達仕様書のレビューで、アルゴリズム名だけが並び、肝心の鍵長がどこにも書かれていない文書に出会ったことがあります。その場では通っても、後日AESの解釈がベンダーごとに割れ、評価軸のすり合わせがもつれた経験から、暗号は名前だけで選ぶものではないと痛感しました。

コラム

机の上にO U O S V A V Vだけが刻まれた紙を置いて意味を考えてみると、未解読暗号の難しさは一瞬で伝わります。手がかりが少なすぎると、解読はひらめきの勝負ではなく、検証そのものが立ち上がらない。

コラム

暗号の本は、歴史から入るか、仕組みを先に押さえるか、実装に触れるか、理論を掘るか、耐量子まで見据えるかで最適な一冊が変わります。本稿はおすすめ10冊を読者タイプ別に整理し、「最初の1冊」と「次に読むべき一歩」を具体的な学習順序とともに提示します。