「大学入試共通テスト実践問題集 情報Ⅰ」(駿台文庫)をパラパラと眺めていたところ、暗号についての問題がありました。
設問の流れ自体は、共通鍵暗号方式と公開鍵暗号方式の比較というありがちなテーマですが、選択肢を見た瞬間に3つとも違和感が出るのがこの問題の面白いところです。
その違和感は、単に「言い回しが微妙」という程度ではなく、前提・用語・概念のどこかがズレていることから生まれています。
この記事では、その違和感の正体を言語化してみます。
共通鍵暗号方式の「問題点」?
(前略)この共通鍵暗号方式の問題点は [コ]である。
選択肢
⓪ 暗号化の際にデータが大きく破損するリスクがあること
① 共通鍵が送受信の際に第三者に複製される可能性があること
② 暗号文を送受信する際に時間がかかること
③ 共通鍵が送受信の際に消えてしまう可能性があること
正解は①なのでしょう。それ以外は選びようがないですから。
しかし、なんとも言えない違和感があり、味わい深い問題です。
その違和感の正体は、大きく3つあります。
そもそも前提が変:盗聴される通信で鍵を送るのか?
共通鍵暗号方式の要点は 「鍵をどう共有するか(鍵配送問題)」 です。
鍵を共有する方法は、対面・物理媒体・既存の安全なチャネル・(後述する)公開鍵暗号による交換など、いろいろ考えます。
それなのにこの選択肢は
- 共通鍵を 盗聴される可能性がある通信手段で送受信している
という状況をほぼ前提にしてしまっています。ここで既に、“話がズレている” 感じが出ます。
出題者は、いわゆるPPAP1のような運用を念頭に置いているのでしょうか。
そもそも、復号のための鍵が盗まれたら困るのは 共通鍵暗号方式も公開鍵暗号方式も同じ です。共通鍵暗号方式の特徴は「盗まれたら終わり」ではなく、共通鍵を安全に共有する必要がある という点にあります。
「複製」という語が変:コピー?
鍵が攻撃者に知られてしまうことを言いたいなら、普通は「盗聴」「漏洩」「奪取」です。
「複製」と言われると、こっそり忍び込んでUSBフラッシュメモリにコピーするような情景すら浮かびます。
暗号の文脈としては、語の選び方が不自然です。
「問題点」という語が変:方式の欠陥っぽくなる
共通鍵暗号方式は、方式として欠陥があるというより 鍵配送をどう扱うかが課題 です。
鍵配送さえ成立すれば、共通鍵暗号そのもの(例:AES)は非常に強力です。
鍵の共有という運用上の課題 を「問題点」と表現し、方式の欠陥のように述べるのは不適切です。
公開鍵から秘密鍵は得られない?
(前略)公開鍵で暗号化された暗号文を復号する際には,秘密鍵が必要で,[サ]。
選択肢
⓪ 公開鍵から秘密鍵を特定することができる
① 秘密鍵は送信する際に受信側から送信側に提供される
② 秘密鍵は公開鍵からは分からないようになっている
③ 公開鍵でも復号できるようにもなっている
正解は②なのでしょう。……が、ここもやはり違和感が残ります。
これについては、違和感どころか、危険ですらあります。
「不可能」と「計算困難」の混同が起きている
公開鍵暗号で言うべきなのは、
- 秘密鍵を公開鍵から求めるのは、現実的な計算資源では困難(計算量的に非現実的)
という点です。
「無限の時間と計算資源」があるなら、導出は可能です。少なくとも“絶対にできない”と教えるのは危険です。
鍵長が短ければ「公開鍵→秘密鍵」は現代でも実際に起きる
それは哲学的な話ではなく、実際に現存する脅威です。
例えば広く用いられている公開鍵暗号方式の1つであるRSAでは、公開鍵(典型的には $(n,e)$)に含まれる $n$ が素因数分解できてしまうと、秘密鍵に相当する情報(復号に必要な $d$)は計算で復元できます。
具体的には、$n=pq$ と素因数分解できた場合、$de\equiv 1\pmod{LCM(p-1, q-1)}$ となる $d$ を拡張ユークリッド互除法で求めれば、それが復号のための鍵です。
そして実際に、短いRSAは破られてきました。
512-bit(RSA-155)は1999年に素因数分解されています。2
768-bit(RSA-768)も2009年に素因数分解されています。3
つまり「公開鍵から秘密鍵は分からない」という断定は、鍵長や計算資源という前提を落とすと成り立ちません(短い鍵は実際に破られてきました)。
さらに将来:量子計算が「計算困難」を崩す可能性がある
現状主流のRSA・DH・ECC(いわゆるPQCでない公開鍵暗号)は、大規模な量子計算機が実用化された場合に危うくなる、という前提で議論されています。
だからこそ「分からないようになっている」という断定は、“永遠に安全”のニュアンスを勝手に混ぜてしまい、教育的に危険です。
公開鍵暗号方式は共通鍵暗号方式より安全性が高い?
一方,「公開鍵暗号方式」では,(中略)一般的に,この方式は共通鍵暗号方式に比べると,暗号化と復号に時間を要するが、[シ]。
選択肢
⓪ データの損失のリスクが低い
① データの送信速度が速い
② 秘密鍵を複製される可能性が高い
③ 安全性が高い
他の選択肢がめちゃくちゃなので③しか選びようがないのですが、違和感どころか、かぐわしい香りがします。
公開鍵から秘密鍵が得られてしまう可能性(=「不可能」ではなく「計算困難」)
これは上で述べたとおりです。鍵長が短ければ公開鍵暗号はむしろ危険ですし、大規模な量子計算機が実用化されれば、現状主流のRSA/ECCなどは安全性を失う可能性があります。
最近は、OSや主要ベンダが「RSA 1024-bit を切り捨てる」方向を明確にしています。
これもつまり 「短いRSAは危険だ」 という現実を反映した動きです。6
暗号強度の観点では、むしろ共通鍵暗号が“強い”ことが多い
たとえば共通鍵暗号方式の1つであるAESは、規格として AES-128/192/256 が定義されています。7
一方、公開鍵暗号(RSAなど)は、同じ“安全度”を得るために鍵長がかなり大きくなります。
NISTの整理では、RSA-2048 が提供できる安全強度は最大 112-bit 相当、といった比較が明示されています。8
大雑把に表現すると、
- AES-128 は 128-bit 相当
- RSA-2048 は 112-bit 相当
のように、鍵長あたりの暗号強度を比較するならば、共通鍵暗号方式のほうが堅牢である と言えます。
そしてTLS 1.3では「公開鍵で暗号化→秘密鍵で復号」をやっていない
ここが最大のポイントです。
「公開鍵で暗号化して、秘密鍵で復号する」という教科書的な公開鍵暗号方式は、TLS 1.3の世界からは降りています(S/MIME等で残ってはいますが)。
PFS(Perfect Forward Secrecy:前方秘匿性)
RSAのような公開鍵暗号方式、とくに古いTLSのRSA鍵交換のことを念頭に置きますが、この方式の最大の弱点は、
- もし将来秘密鍵が漏れたら
- 過去の通信(保存されていた暗号文)を
- まとめて復号できる可能性がある
という点です。
これを避ける性質が Perfect Forward Secrecy(前方秘匿性) です。
Forward Secrecy を実現する典型は (EC)DHE です。毎回セッションごとに一時鍵(ephemeral)で鍵合意し、長期秘密鍵(証明書の秘密鍵)が漏れても「過去の共有秘密」は復元しにくい構造にします。
そしてTLS 1.3 では、static RSA / static DH が禁止されています。9
つまり現代TLSは、
- 公開鍵で暗号化 → 秘密鍵で復号
という方式を、プロトコル設計として卒業しています。
“復号オラクル”が構造的に事故が起きやすい
ここの話は専門的になるので軽く触れる程度にします。
サーバーが秘密鍵で復号を行うときの処理が
- エラーの出し方
- 応答時間
- 失敗時の挙動
などで差が出ると、「復号できたかどうか」の情報が漏れることがあります。
これが、いわゆる Bleichenbacher攻撃(1998)や、その再来である ROBOT(Return Of Bleichenbacher's Oracle Threat)で問題になった系列です。1011
もちろん「実装が悪い」という要素が大きい(典型的にはRSA鍵交換における PKCS#1 v1.5系の扱いが絡む事故です)のですが、構造として
- 秘密鍵で復号する
- その結果に意味のある構造(premaster)がある
- 失敗の情報が漏れると致命的
という事故の起きやすさを抱えています。
Perfect Forward Secrecy と合わせて考えると、「公開鍵で暗号化→秘密鍵で復号」という方式自体の安全性に疑いが生じ、現代では避けられていった――という方が自然です。
まとめ:公開鍵暗号は2つある
結局ここに混乱の原因があります。
1つ目は、RSA暗号等の「公開鍵で暗号化→秘密鍵で復号」という、(狭義の)公開鍵暗号(Public Key Encryption:PKE) です。
もう1つは、公開鍵と秘密鍵のペアを用いる技術全般を表す 公開鍵暗号技術(Public Key Cryptography:PKC) であり、以下の技術の総称です。
- (狭義の)公開鍵暗号(PKE)
- デジタル署名
- 鍵共有
そして、(狭義の)公開鍵暗号(PKE)自体は現代では退潮傾向にありますが、デジタル署名と鍵共有は、現代のセキュリティ技術を支える根幹 となっています。RSA暗号も、(狭義の)公開鍵暗号(PKE)としては退潮傾向にありますが、デジタル署名においては今日でも広く用いられています。
教科書が(狭義の)公開鍵暗号(PKE)の説明を中心に置き、デジタル署名や鍵共有を脇に置いているのが、現代におけるセキュリティ事情と乖離しており、そこが違和感のあるような出題を生んでしまう根本原因です。
とはいえ、共通テスト情報Ⅰの対策問題をこんなにたくさん作成する駿台さんには敬意を表します。
私を監修として雇ってくれれば、無敵になるのではないでしょうか☺︎
-
PPAP:パスワード付きZIPを添付で送り、別便でパスワードを送る運用を指す呼称。大泰司章さん(当時JIPDEC所属、現PPAP総研)による命名で、「Password付きZIPを送ります/Passwordを送ります/Angouka(暗号化)/Protocol」の頭文字である。 http://id.nii.ac.jp/1001/00204803/ ↩
-
https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-131Ar2.pdf ↩
-
https://learn.microsoft.com/en-us/windows/whats-new/deprecated-features ↩
-
https://nvlpubs.nist.gov/nistpubs/specialpublications/nist.sp.800-57pt1r5.pdf ↩
-
https://www.usenix.org/conference/usenixsecurity18/presentation/bock ↩