その本の「はじめに」には、著者の「伝えたいこと」がギュッと詰め込まれています。この連載では毎日、おすすめ本の「はじめに」と「目次」をご紹介します。今日はデイビット・ウォンさんの 『現代暗号技術入門』 です。
【はじめに】
この本について、こう疑問に思った読者もいるかもしれない。なぜまた暗号の本を? あるいは、なんでこの本を読む必要があるのか、と。その疑問に答えるには、この本のきっかけにまで遡らなくてはならない。
執筆に至る年月
今では、何か知りたいと思ったら、どんなことだろうとググれば済む。ビングるのでもいいし、バイドゥるのでもいい。言いたいことはお分かりだろう。だが、こと暗号学の話になると、求めている内容によっては驚くほど資料が見つからない。というのが、だいぶ昔に私が体験したことであり、その後もずっと不満に感じていることだ。
学生時代、私はある授業で電力差分解析(第13章に登場する)を利用したセキュリティ攻撃を実装しなければならなかった。最も初期に発表されたサイドチャネル攻撃のひとつであり、当時は、暗号解析の世界でも画期的な攻撃だった。電力差分解析による攻撃では、まるで魔法のようなことが起こる。暗号化や復号を処理しているデバイスの電力消費量を測定すると、そこに隠れている秘密を抜き出すことができるのだ。そのとき私が気づいたのは、立派な論文は立派な概念を説いているけれど、分かりやすさや読みやすさには、あまり労力をつぎ込んでいないということだった。著者が何を言わんとしているのか理解しようとして、空回りの努力を続けた。そのうえ、その論文について解説してくれるネット上の資料も見つからなかった。そこでまた多少の悪あがきを繰り返して、ようやく答えにたどり着く。そのとき思ったのだ。同じように苦しむ人がほかにいたら、手を貸してあげられるのではないかと。
そんな気を起こした私は、ちょっとした図を書き、それをアニメーションに仕立てて、ひとりで動画を作ってみた。そうやって完成したのが、暗号学に関する私の最初のYouTube動画だった (https://www.youtube.com/watch?v=gbqNCgVcXsM) 。
アップロードしてから何年もたったが、今でもこの動画を見て賞賛の言葉をもらうことがある。つい昨日も、この序章を書いているとき、こんな投稿があった。「ありがとうございます。本当に分かりやすい動画で、論文を理解するよりずっと時間の節約になりました」
ありがたい言葉だ。こうして、教育という軸を挟んだ反対側にささやかな一歩を踏み出しただけでも、もっとやってみたいという気持ちになるには十分だった。さらに動画を作って公開するようになり、暗号学についてのブログも書き始めた。ブログはこちらだ: https://cryptologie.net/ 。
本書を書き始める前の時点で、この序章よりはるかに多くの概念について記事を投稿していた。その数は500本に迫っていたが、すべては準備段階にすぎなかった。心の片隅では、1冊の本にまとめようという考えができ上がりつつあった。そんなところへ、Manning Publicationsから出版のお声をかけていただいたのだ。
現実世界の暗号学者のためのカリキュラム
大学では理論数学を専攻したが、学士号を取得してから、私は次の進路を決めあぐねていた。プログラミングは以前から続けていたので、その二つを両立してみたいという気はあった。だから、数学とプログラミングの両方を生かせそうだと考えて、自然と暗号学に興味がわき、好き勝手にいろいろな本を読み始めた。唐突に、天職に出会ったわけだ。
ただ、煩わしい点もあった。なかでも、歴史から説き明かされる長いイントロに当たる部分はつらかった。興味があるのは、今も、これまでも、技術的な専門知識なのだ。だから私は心に決めた。もし何かのきっかけで、暗号学の本を書くことがあったら、ヴィジュネル暗号とか、シーザー暗号とか、過去の遺物については一行たりとも書かない、と。そうして、ボルドー大学の修士課程が終わると、いよいよ現実の世界に足を踏み入れるときがきた。このときの私は、まだ何も分かっていなかった。
学歴は十分だと思っていたが、これから接することになる現実世界のプロトコルについては知識が欠けていた。楕円曲線(第5章に登場する)の数学についてはたっぷり時間を使ったが、暗号アルゴリズムのなかでそれがどう使われるかは、何ひとつ知らなかったのだ。学んだことがあったのは、LFSRやElGamal、DES、そしてその後一度たりともお目にかかっていない暗号プリミティブばかりだった。
Matasano Security(のち、NCC Groupによって買収された)に入社した私の最初の仕事は、OpenSSLの監査だった。そう、最も普及率の高いSSL/TLS実装であり、インターネットのほぼ全体を暗号化しているといってもいい実装だ。むろんのこと、私の脳は酷使された。毎晩ひどい頭痛を抱えて帰宅する。悲惨なライブラリやプロトコルが次々と見つかる。このとき私は、まだ思ってもいなかった。何年かのちに、このプロトコルの最新バージョンであるTLS1.3の共同開発者になろうとは─。
だが、このときすでに私はこう考え始めていた。「大学時代には、こういうことを学ぶべきだったんだ。いま吸収しつつある知識こそ、現実の世界に向けて役に立つものではないか」と。あれこれありながらも、私は今やセキュリティの専門家として暗号学の現場に接する立場になっていた。現実世界のアプリケーションをレビューする。暗号学の履修が終わった直後にやっておきたかったことを今やっている。暗号アルゴリズムの実装、検証、使用を繰り返し、どのアルゴリズムを使うべきか助言する。だから私は、いま書いているこの本の最初の読者でもあるのだ。この本は、現実世界に備えさせるために、過去の私に向けて書いたらこうなる、そういう内容の本なのだ。
至るところにバグがある
コンサルタントとして仕事をするようになると、現実世界の暗号アプリケーションをいくつも監査するようになった。OpenSSL、Googleの暗号化バックアップシステム、CloudflareのTLS1.3実装、Let’s Encryptの認証局プロトコル、暗号通貨(暗号資産)Zcash(ジーキャッシュ)の真新しいプロトコル、同じく暗号通貨NuCypher(ニューサイファー)のしきいプロキシ再暗号化方式……。ほかにも、あいにく名前は出せないが、現実世界の暗号アプリケーションを何十と扱ってきた。
キャリア初期の頃、ある大手企業が自社の通信を暗号化するために作成したカスタムプロトコルの監査も担当した。ほとんど何にでも署名を使っていたが、一時鍵には使っていなかったため、そこからプロトコル全体が完全に破綻していた。誰でも簡単に一時鍵を取り替えられたからだ。セキュアトランスポートプロトコルについてそれなりに経験のある専門家が犯した初歩的な失敗だったが、自分で暗号を開発できるくらい経験があると思われていたからこそ見逃されていたのだ。調査の最後にこの脆弱性を報告したときのことを、今でも覚えている。エンジニアが集まったその一室は、たっぷり30秒間沈黙に包まれた。
こうした話は、私のキャリアでその後も何度となく繰り返されることになる。別の客先で暗号通貨を監査しているとき、私はすでに存在するトランザクションから新しいトランザクションを捏ねつ造ぞうできることを発見した。原因は、証明される対象の曖昧さにあった。また。別の客先でTLS実装を調べていたときに、RSA実装を簡単に突破できる方法を見つけたこともある。これは、RSAの考案者のひとりと共同でホワイトペーパーを執筆するという経緯になった末に、何十というオープンソースプロジェクトに向けて多数のCVE(Common Vulnerabilities and Exposures:共通脆弱性識別子)が報告されるという結果にまでつながった。困ったことに、暗号を利用しているときには、自分の管理下で崩れかねない細かい点は無数にあるのだ。この頃に私はもう、何か書かなければいけない、と考えるようになっていた。私の本に逸話がたくさん登場するのは、この頃の経験があるからだ。
業務の一環として、各種のプログラミング言語で暗号ライブラリや暗号アプリケーションをレビューすることもあった。バグを見つけ(Go言語の標準ライブラリにおけるCVE-2016-3959など)、ライブラリに欺かれてそれを誤用してしまう過程を研究し(私の論文、「How to Backdoor Diffie-Hellman(ディフィー・ヘルマンにバックドアをしかけるには)」などを参照)、使用するライブラリを推奨した。開発者は、どのライブラリを使うべきか知らなかったので、答えはいつも厄介だった。
さらには、Discoというプロトコル( https://discocrypto.com 、 https://embeddeddisco.com )を考案し、その完全機能版の暗号ライブラリをわずか1,000行未満のプログラムで記述した。Discoは、2つの暗号プリミティブしか使っていない。SHA-3による転置とCurve25519である。1,000行未満のコードで実装したこの2つだけで、開発者は認証付き鍵交換、署名、暗号化、MAC、ハッシュ、鍵導出などを実行できるのだ。この経験から、優れた暗号ライブラリはどうあるべきかについて、独自の観点をつかむこともできた。
自分で書く本には、こうした経験に根ざした現実的な知識を盛り込みたいと考えた。だから、どの章にも、定評ある暗号ライブラリを使って、さまざまなプログラミング言語で暗号をどう適用するか、その実例も盛り込んである。
新たな本の新たな需要
ある年のBlack Hat(有名なセキュリティカンファレンス)で暗号学のトレーニングセッションを開いたとき、ひとりの受講者が質問をしてきた。暗号学について、おすすめの参考書やオンラインコースは何かというのだ。忘れもしない。私は、ダン・ボウネイとヴィクター・シュープの本と、ボウネイがCourseraで開いているオンラインコース「Cryptography I(暗号学I)」の受講をすすめたのだった(この2つについては、第16章でもあらためて推薦している)。
すると、その受講者はこう答えた。「あ、それは試しました。理論的すぎたんです」─この答えが、いつまでも頭を離れなかった。最初は、そんなことないだろうと思ったが、次第に分かってきた。どの資料も決まって、数学の比重が高すぎるのだ。暗号学を扱う開発者の大半は、数学を敬遠したがる。では、かわりに何が必要なのだろうか。
当時、一定の評価を集めていた書籍としては、『暗号技術大全』と『Cryptography Engineering(未訳)』(ともに、ブルース・シュナイアー著)があった。だが、どちらも内容がだいぶ古くなりつつあった。『暗号技術大全』は、ブロック暗号について4章、暗号利用モードについてもまる1章を費やしていながら、認証付き暗号は扱っていない。
『Cryptography Engineering』のほうがもう少し新しいが、楕円曲線暗号については脚注で1回言及しているだけだ。それに対して、私の動画やブログ記事は、一部の概念に関してはだいぶ参照先として充実しつつある。特別なことを達成したという手応えを感じていた。
一方、暗号通貨(暗号資産)に興味を持ち始める受講者が増え、暗号通貨に関する質問もだいぶ多くなってきた。と同時に、私自身も暗号通貨アプリケーションの監査を請け負う機会が増えている。その後、私はFacebook(現Meta)の一部門に移り、暗号通貨リブラ(現在のディエム)のセキュリティを任されることになった。当時、暗号通貨は最新の研究分野であり、これまでほとんど、またはまったく現実の用途が見いだされていなかった注目度の高い暗号プリミティブがいくつも複合的に利用されつつあった(ゼロ知識証明、集約署名、しきい値暗号、セキュアマルチパーティ計算、コンセンサスプロトコル、暗号アキュムレーター、検証可能なランダム関数、検証可能な遅延関数……あげればきりがない)。にもかかわらず、暗号学のどの本も、暗号通貨を取り上げていない。私は、にわかに特異な立場に立つことになったのだ。
学生、開発者、コンサルタント、セキュリティエンジニア、その他に向けて、最新の応用暗号学の真髄を伝えるような本が今なら書ける─そう考えた。数式はできるだけ使わず、かわりに図解をふんだんに使った本になるだろう。歴史にはほとんど触れず、私が目撃してきた暗号学上のリアルな失敗例について最新の事例を盛り込んだ本になるだろう。古レガシーくなったアルゴリズムではなく、広く使われているのを私がこの目で見てきた暗号技術の話が詰まった本になるだろう。TLS、Noiseプロトコルフレームワーク、Singnalプロトコル、暗号通貨、HSM、しきい値暗号、そういった世界だ。理論暗号学にはほぼ立ち入らず、読者に深く関わる内容、たとえばパスワード認証鍵交換、ゼロ知識証明、耐量子暗号(ポスト量子暗号)などを重視した本になるだろう。
2018年、Manning Publicationsから連絡があって、暗号学に関する本を執筆しないかと打診されたとき、すでに私はその答えをもっていた。書きたいことは、もう分かっていたからだ。あとはただ、頭にある内容を文字にする機会と、それに時間を費やす正当な理由とを誰かが与えてくれるのを待っていただけだ。偶然にも、Manningには「real-world(現実世界)」という言葉を冠したシリーズがあるので、私の本はその延長線上に並ぶと当然のように提案した。今、皆さんの目の前にあるのは、こうして2年以上に及ぶ労力と情熱をつぎ込んだ成果である。気に入っていただければ幸いだ。
この本について
本書『現代暗号技術入門(原題:Real-World Cryptography)』の執筆を始めてから2年以上が経過した。本書はもともと、現実世界で使われている暗号について知っておきたいすべてを紹介しようと考えたのが始まりだった。だが、もちろん、そんなことができるはずはない。どんな分野だろうと、1冊の本にまとめることなど不可能だ。そこで、読者にどこまで伝えるか、その内容の細かさと、カバーする範囲とのバランスをとることが必要になった。そこにどれだけ苦労することになったかは、文面から感じ取ってもらえるかもしれない。
企業や各社の製品で実装されたり利用されたりしている暗号学について教えてくれる実用的な本を探している。あるいは、現実世界の暗号がどんなしくみで動いているのか興味はあるものの、実装方法の細部まで記したリファレンス本が必要なわけではない─そんな皆さんには、本書がぴったりだ。
本書をお薦めする理由
本書はどんな人の役に立ちそうか。タイプ別にまとめてみた(もちろん、自分を無理矢理どれかに当てはめたりはしなくていい)。
学生
コンピューターサイエンス、セキュリティ、あるいは暗号学を履修していて、現実世界で使われている暗号について学びたい学生の皆さんには、本書がちょうどいい教科書になる(将来そういう業界で働きたいと思っている方でも、学問として応用分野に進みたいと考えている方でも)。なぜって、序文にも書いたとおり、私自身もかつてそういう学生であり、自分が学生のときにこんな本があれば、という思いで本書を執筆したからだ。
現場のセキュリティ担当者
私が応用暗号学を教えていたときに受け持った学生のほとんどは、侵入(ペネトレーション)テスター、セキュリティコンサルタント、セキュリティエンジニア、セキュリティアーキテクトといった職業の人たちだった。そのため本書は、暗号の専門家ではない人たちに、暗号学上の複雑な概念を説明しようとしたときに受けたさまざまな質問を踏まえている。一方、私自身も現場でセキュリティを扱う立場なので、大手の企業に依頼されて監査した暗号や、その過程で発見したバグなども、本書を生み出す糧となった。
直接的あるいは間接的に暗号学を利用する開発者
また本書には、顧客や同僚との間で交わした数々の話し合いも生かされている。だいたいが、セキュリティの専門家でも暗号の専門家でもない人たちだった。今では、プログラミングのときに暗号をまったく扱わないというのは、いよいよ難しくなっており、扱う以上ある程度は理解が必要になる。本書では、そういうレベルで理解してもらうために、何種類かのプログラミング言語でサンプルコードも紹介している。
他分野に関心のある暗号学者
本書は応用暗号学の入門書だが、想定読者は、私自身のような人間だ。この本は、何よりもまず自分のために執筆したのだから。そのもくろみが成功しているようであれば、理論暗号学者の方に、応用暗号学がどういうものか、手みじかに分かってもらえるだろう。あるいは、対称暗号を扱っている方には、該当する章を読んでいただければ、パスワード認証鍵交換のことをざっと把握してもらえるし、プロトコルを使っている方には、量子時代の暗号を短時間で十分に理解してもらえるだろう。
詳細を理解したいとお考えの技術管理者や製品管理者
私から見てずっと製品寄りの方の疑問にも、本書は応えようとしている。こっちのアプローチにはどんなトレードオフや限界があるか。どんなリスクが予想されるか。今の方向性で、各種規制の遵守は可能か。政府を相手にするとき、あれやこれは必要か─そういった疑問点だ。
現実世界の暗号について、とりあえず現状に関心のある方
もちろん、以上の分類のどれかに当てはまらなくても、なんら問題はない。現実世界で使われている暗号に興味があれば、本書を読む動機としては十分だ。ただし、暗号の歴史には触れていないし、コンピューターサイエンスの基礎も扱っていないので、その点には注意してほしい。本書、あるいは類書に取りかかるなら、最低限、暗号のことを耳にしたことがあるくらいの下地は必要になる。
前提となる知識について、もう少し詳しく
本書を十分に活用するのに、どんな知識が必要か、もう少し詳しく述べておこう。本書は、コンピューターやインターネットの基本的なしくみを理解していて、少なくともこれまでに「暗号化」という言葉を聞いたことがある、というあたりの読者を想定している。現実世界の暗号を扱うので、コンピューターが苦手とか、暗号化について一度も聞いたことがないとなると、状況に合わせて的確に内容を理解するのは難しいかもしれない。
本書に必要な前提条件はクリアしたとして、ビットとバイトの違いまで知っていればさらに望ましいし、XORとか左シフトといったビット演算を知っていれば、あるいは実際に使ったことがあれば、間違いなくプラスになる。では、この条件を満たしていないとだめかというと、そんなことはない。ただ、その場合には、読み進めながら、あちこちで立ち止まってググってみる必要があるだろう。
実際には、どれだけ条件がそろっていようと、本書を読み始めたら、おそらく誰でもネットで詳細を調べることが必要になるかもしれない。というのは、私が言葉を定義せずに使っていることもあれば(申し訳ない)、分かっているものと誤った前提で説明していることもあるからだ。いずれにしても、それほど大きな問題にはならないと思う。新しい概念を導入するときには、できるだけ詳しく説明を試みている。
最後に、重要な点がひとつある。暗号という言葉を聞いたとたん、たちまち数学を連想する人もいるだろう。連想して、次の瞬間には、苦虫をかみつぶしたよう顔になっているかもしれない。だが、その点はあまり心配しなくていい。数学的に面倒な核心部分は、できるかぎり避けるようにしている。本書がめざすのは、暗号のしくみを直観的に把握してもらえるように、その本質をお伝えすることだからだ。
もちろん、本書に数学がいっさい登場しないといったらウソになる。数学なしで暗号を説明することはできないからだ。そこで、こういえばいいだろうか。学生時代に数学が得意だった人なら、その分は有利になるかもしれない。だが、得意でなかったとしても、本書を読む妨げにはならない。一部の章は、一定以上に高度な数学を理解していないと、とっつきにくい内容になっている。特に、量子時代の暗号と次世代の暗号を扱っている第14章と第15章は難解だと予想されるが、何事も「なせば成る」だ。意志力があれば、そして行列乗算でも何でも、知らないことをググれば、難しい章も読み切れるだろう。その辺の章は読み飛ばしてもかまわないが、最後の第16章は飛ばさないでほしい。どうしてもお伝えしたい点をまとめてあるからだ。
本書の構成:ロードマップ
本書は、2部構成になっている。第1部は、1ページ目から順番に読んでいただくことを想定しており、暗号学の基本要素をほとんど網羅している。複雑なシステムやプロトコルの構築に使う、レゴブロックの基礎パーツのようなものだ。
・第1章は現実世界の暗号に関する導入で、これからどんなことを学ぶのか、概要を把握できるようになっている。
・第2章では、ハッシュ関数を取り上げる。ハッシュ関数は、暗号学における基本的なアルゴリズムのひとつであり、バイト文字列から一意の、つまり重複のない識別情報を生成するときに用いる。
・第3章では、データに関する認証と、メッセージを何者にも改変させないしくみについて説明する。
・第4章では、暗号化の話に入る。2人の参加者が、会話を第三者から隠す方法だ。
・第5章では、共通の秘密を対話的にやり取りするしくみとして、鍵交換が登場する。
・第6章では、非対称暗号を取り上げる。複数の人が1人に宛てて送るメッセージを暗号化できるしくみだ。
・第7章では、紙とペンを使う署名を暗号学的に置き換える、デジタル署名について説明する。
・第8章では、ランダム性と、秘密の扱い方について説明する。
本書の第2部では、第1部で学んだ構成ブロックを使って組み立てられるシステムの話に入っていく。
・第9章では、暗号と認証を使って、(SSL/TLSプロトコルを介した)機械どうしの接続を保護するしくみを紹介する。
・第10章では、エンドツーエンド暗号化を取り上げる。皆さんと私のようなユーザーどうしが互いを信頼しあうしくみである。
・第11章では、機械が人を認証するしくみと、機械どうしの同期を人が支援するしくみについて説明する。
・第12章は、暗号通貨(暗号資産)という最新の分野を紹介する。
・第13章では、ハードウェア暗号にスポットライトを当てる。鍵を盗み出されないようにするための機器の話だ。
続く2つの章は、おまけといってもよい。第14章では耐量子暗号、第15章では次世代暗号をそれぞれ取り上げている。どちらも、その存在が無視できなくなってきた、あるいは現実性と効率が上がってきたために、実際の製品や企業で取り入れられ始めた分野だ。この2つの章は、飛ばしてもらっても差し支えないが、最終章となる第16章だけは、本書を棚に戻す前に読み切ってほしい。第16章では、現実世界で暗号に接する人(つまりは、本書を読み終わったあとの皆さんだ)に心にとめておいてほしい、さまざまな課題や教訓をまとめてある。『スパイダーマン』で、ピーターの伯父ベンも言っているとおり、「大いなる力には、大いなる責任が伴う」からだ。
コードについて
本書では、独立したプログラムコードの一部として、あるいは通常の文中で、サンプルとしてたびたびコードを示している。いずれの場合も、ソースコードは等幅のフォント(fixed-width font)を使って表した。同じ章で段階を追って説明する場合には、前の段階から変わった箇所を強調するために、ソースコードの一部を太字にしていることもある。前の段階のソースコードに新しい関数を追加したような場合だ。
もともとのソースコードのフォーマットを変えている場合も多い。本書に収まりやすいように、改行やインデントを追加した部分がある。ごくまれに、それでも足りない場合には、コード中に「行が続くマーカー」を使った。また、元のソースコードにコメントが入っていた場合には、本書で引用する際に削除している。そのかわりに、重要な概念を強調する目的で、コードに注釈を加えた場合も多い。
【目次】