ども,mitsu です.今年は幸運にもセキュリティキャンプに通ったので,闇に隠れしその実態を暴いていきたいと思います.
応募課題パート
セキュリティキャンプに参加しようと思ったのは,実は事前課題の締め切り一週間前くらいでした.
🐣「Castryck-Decru attack の実装難しいな〜……誰かに教えてほしい」
🐣「そうだ 💡」
というわけで L1 ゼミに応募し,絶対に受かりたかったので絶対に受かる強い意志で応募課題を書きました.
その結果,全ての課題の解答が hackmd に書かれる始末に……
L1 の応募課題を開いてみると全体的に難しい印象でなかなか厳しい内容でした.ただ薄っすらと「完全解答を作る必要はなく,応募課題のためにどのようなことを学び調べたか」を重要視してるように感じられたので,真の意味で正しい回答ではなくとにかく頑張るのが大事なのかなって思いました.(実際僕は Q2 の発展問題の解答がギャグみたいになっていて十分に正しく書けていない)
個人的に印象的だったのは「CSIDH と SIDH」の違いを述べさせるものでした.このときの僕はまだ CSIDH の構成を原著で読んではいたが実装をしたことはありませんでした.ということで実装しました.
🐣「CSIDH の実装を書くいい機会になったピヨ」
🐣「原著論文が実装レベルまで書かれていて助かったピヨ」
ということで気合の応募課題執筆をしました.僕がどんな解答を作ったかはぜひ僕の応募課題晒しを見てください.(恥ずかしいので精読はしてほしくありませんが……)
頑張って解答したのが功を奏し,無事セキュキャンの全国大会に参加できることに決まりました.
₍₍ (ง ˘ω˘ )ว ⁾⁾ < サーベイ論文みたいですね(意訳)
🐣 < 😀
ちなみに L1 ゼミの実態なのですが,名前の通り暗号化通信をメインにやるゼミです.とはいってもプロトコルコースとプリミティブコースがあり,プロトコルコースでは(コースが別れたのは今年からではありますが)TLS 自作っぽい話をするっぽいです(多分).一方プリミティブコースは暗号の理論よりの内容をガリガリとやるところで,暗号の解読などを数学として頑張ってやるコースです.
この辺りの内容は,セキュリティキャンプの公式サイトとプロトコルコースの講師の先生の参加記とプリミティブコースの講師のの先生の参加記が参考になるんじゃないかなあと思います.
6月頃
さっそく小さめのやらかしをします.全国大会に通った人は専用の Discord サーバーに参加しなくてはいけないのですが,僕はダラダラしていたせいで入るのが遅れました.
₍₍ (ง ˘ω˘ )ว ⁾⁾ < はよしろ(意訳)
講師の e_shiho さんからの連絡もあり無事参加できました.めでたしめでたし.
ということで最初の顔合わせ会(VC)が始まりました.プロトコルコースとプリミティブコースそれぞれ一人ずつで,計二人と意外と少い印象でした.
プロトコルコースの受講生や講師の方とも喋りながら,「キャンプで何を開発したいか」という目標を定めることをしました.
僕は当然 Castryck-Decru attack の実装ですが,急に日和ってガチャガチャ言ってた記憶があります.まあいいや.
🐣「Castryck-Decru attack できる気がしないピヨ…」
セキュキャンの事前学習期間は割とずっとこんな感じで音を上げてた気がします.ごめんなさい.
プロトコルコースの方は,ちょっと僕はどういった流れでどうなったかあまり知らないのですがきっと彼からの参加記もあがるでしょう.そちらをご参照ください.
この頃は僕は頑張って Castryck と Decru の “An efficient key recovery attack on SIDH” の四章を読んでいました.全然わからなくて e_shisho さんに助けを求めたところ,まずは論文をしっかり読むにはどうすればいいかというところから教えてもらえました.
ということで代数幾何はあまりにも広大なので,ある一定のラインまで深ぼったらそれを公理として採用しその上から論理を積み立てていこうということになり,オレオレ公理系リファレンス作成作業が始まります.
最終的にこの公理の部分は,大雑把ではありますが「主偏極アーベル曲面の分類」「種数 2 の超楕円曲線の諸性質」「Kani の定理」「Richelot Correspondence」に集約されたと思います.(今見てもおぞましい単語だ……🐣)
ただこれよりも上のレイヤ(例えば Kani の定理を認めた上での Graph Subgroup による剰余群の分類の話や,Richelot Correspondence を認めた上での Richelot Isogeny の構成アルゴリズム)はしっかりと理解に努め,丁寧に読み進めることを最初は特に意識的にやっていました.
この理解の仕方に関しては,僕も腑に落ちる部分がたくさんありました.理解とはなにかみたいなメタ的な部分に繋がる話で非常に深く難しい部分だと思います.ただとりあえず今の段階では「十分に検証された自分の中でのベースがあり,そこから自分自身の言葉で紡いできたもの」みたいな感じになっています.
🐣(言語化が難しい……)
僕は前々から学問にもレイヤーがある(さらに言えば数学という学問の中にもレイヤーがある)ような気がしていて,それとも繋がる話だったのでとても腑に落ちています.
ということで話はそれましたが,ほぼ毎週僕が論文を読んでできたところまで数学のゼミのようなものをしていました.e_shiho さんにはすごくお世話になりました.
写像の話とか数学の歴史的な話だとか面白いこともいっぱい聞けました.
ただ,長時間拘束してしまいすみませんでした…… m(_ _)m
7月中旬以降
₍₍ (ง ˘ω˘ )ว ⁾⁾ < 実装を見据えてやっていきましょうか
ということでゆっくりと進んでいた論文読みは一転,実装まで落とし込むことを見据えて今までやってきたことを活用していく方針に切り替わりました.(といってもこの辺の段階で必要なものは恐怖の Richelot Isogeny を除いてある程度自分の中に揃っていたので,6章を読むのはそれなりにサクサクといけたのもあります)
🐣「Richelot Isogeny わからん」
₍₍ (ง ˘ω˘ )ว ⁾⁾ < わからんわからんと話題の Richelot Isogeny
7月の終盤には Castryck と Decru の例の論文の6章を読みつつ疑似コードを書きながらやるという方針で,実装まで落とし込める部分とパッとは落とし込めない部分の分別をしながらコードの大枠を作っていきました.
この辺りから僕は学校の期末試験であまり稼働できなくなり,ゼミをやることができなくなってしまいました.
といってもゼミの纏まった時間が取れないだけで隙間時間に実装はできたので,例の論文の8章を読みつつ超特異楕円曲線の直積から種数 2 の超楕円曲線のヤコビアンへの (2, 2)-isogeny の実装を頑張っていました.
ここで問題が発生します!!!
SageMath では $\mathbb{F} _ {p^2}$ でグレブナー基底を計算するのに非常に時間がかかります.Magma では計算できる(Castryck と Decru はこれで実装していた)のですが,コマンドラインから呼び出すには有料版が必要であまりにも高く……
ということでグレブナー基底を使わない高速化手法が Oudompheng と Pope の “A Note on Reimplementing the Castryck-Decru Attack and Lessons Learned for SageMath” で解説されていたのでそれを実装しました.
これでなんとか実装できたので,本番は Richelot Isogeny 全振りで挑むこととなりました.
1日目
ついに始まりました.Richelot Isogeny の実装を考えながら会場へ向かい,いい感じに開会式をしたあと共通講義とグループワークが始まりました.
共通講義は検事の方が法律とコンピュータセキュリティの関わりを教えてくれてとてもためになる内容でした.色んな電車の放送の真似をしていたのが印象的です.
グループワークではみんなでセキュリティ関連の何かを作ろうという感じで進みました.僕がなんか適当なことを喋りまくってたらグループ内で大量の案が出され,いつの間にかブレインストーミングの様相でした(そのつもりはなかったが).同じ班になった受講生と喋るいいきっかけとなったので楽しかったです.
その他諸々が終わったあとはついに始まる開発の時間です.実装がうまくいくようにと願掛けの意味でこんなものを持っていきました.これによって L トラック全体が守られていたらいいなあという気持ちです.
共通講義中に Richelot Isogeny の実装の天啓が降りてきていたのでコードを書こうと思った矢先,楕円曲線の直積からヤコビアンへの (2, 2)-isogeny を構成するアルゴリズムがバグっていることが判明しました.
虫よけの効力は一体どこへ……
その日は適当にクネクネした後,元々時間が短かったこともあって開発の時間が修了してしまいました.
まあその後部屋でウロウロ歩き回りながらピヨピヨしつつ,Kunzweiler の “Efficient Computation of (2n, 2n)-Isogenies” とにらめっこしていたらなんか Richelot Isogeny が実装できていたんですが……
🐣(正しいものを正しく実装したら正しいものができた,それはそう)
それとこの日の夕食時にはスイーツバイキングがありました.といってもお肉が焼けるのが遅かったりまあ色々あったりであまり食べれませんでしたが……
名刺交換も盛んに行われていたそうですが僕はそのときたまたま名刺を部屋に置いてきてしまい,悲しい思いをしていました.(なんか知らんが,キャンプ期間中の名刺が特に必要な場面でことごとく名刺を忘れていた気がする)
またこの日の 20時ごろにマネージャーさんから「スイーツが余りすぎている」という連絡がありました.
絶好のチャンスだったので,食べれなかった分そこでたくさんスイーツを食べました.おいしかったです.
チューターのあんこさんが大量のパイナップルをお皿に山盛りにしていた光景が印象的でした.そういった色々な要素が噛み合って,チューターや講師の先生方,プロトコルコースの受講生の子など L1 ゼミ内での距離が一気に縮まったと思います.
2日目
ということで Richelot Isogeny が実装できたので,あとは大元のプログラムと繋げる作業が必要でした.
これが終わったタイミングで,プロトコル側の講師のまこさんがこんなことを言ってきます.
🐧「プリミティブコースが今までやってきたことをざっくりでいいから教えてほしいなあ〜」
僕はうまく説明できるか不安になりながらも,頑張って解説を試みました.というのも最終的に成果発表スライドを作らないといけないので,どこをどんな風に説明するかの取捨選択はある程度考えておかないと行けなかったからです.
それに人に説明するのは自分の頭を整理するのにも役立つので,そういった色んな意味も含めて言ってくれたんだと思います.
あとは事前学習期間は特に顕著だったのですが,プロトコルコースとプリミティブコースの間で特にやり取りもなかったので,講師として同じゼミがどんなことをしているのか把握する必要もあったのでしょうし,逆にそれを破ってコース間のやり取りを円滑にするというのもあったと思います.
ということで頑張って説明しようとしてみたんですが,例えば SIKE と SIDH の話だとか,Kani の定理で一意性が保証されている anti-isometry の話だとか話すべきか迷う部分がたくさんありました.僕はこの時間は説明の取捨選択をどうするかに焦点を当てていたので,例に挙げたこの2つは結局説明しませんでしたがそこを飛ばしてもある程度納得のいくように結果だけ説明するなど色々工夫してみました.
とはいえ Castryck-Decru attack の一連の流れを説明したのは初めてだったのでぎこちなくなってしまい,話の内容が前後してしまったり説明に一時間強かかってしまったりなど課題点が山盛りでした.
あとは何と間違えたのかわかりませんが,このタイミングで脳みそがバグってこんなふうになっていました.
🐣(Castryck-Decru attack は 2021 年の 9 月に公開されたものだったはず……)
⚠ これは間違っていて,正しくは 2022 年の 7 月
すみません.大嘘こきました.
🐧「なんかよくわかんなかった(意訳)」
ごめんなさい.僕の説明が下手だったからです.解説記事をいつかあげようと思っているのでもしこの文章を読んでいたらそれに期待してください……
まあこういうわけで L トラック教室の奥にある共有のホワイトボードの半面を,僕が大量の数式で埋め尽くしました.これをきっかけに L1 ゼミでは大量のホワイトボードを占有するようになり,ごめんなさいという気持ちに.
使ってなさそうなホワイトボードをもってきて使っていたのもあって,3面のホワイトボードにぎっしりと書かれた数式とネットワークのシーケンス図で取り囲まれて大学の研究室みたいな面白い雰囲気でした.
このあとは仕上げ作業として,ある程度秘密が求まったら残りはブルートフォースをするなどの仕上げのプログラムを書きます.
これらがあらかた完了した辺りで2日目は修了.とりあえず Castryck-Decru attack を実装することができたので安心しました.
3日目
ついにキャンプ期間の半分が過ぎ去ろうとしている頃です.
この日は社会科見学があったのですがとても楽しかったです!(小並感)
🐣(キャンプ期間,短いものだなあ)
そう思いながら,この日の作業はコードのリファクタリングに充ててました.ここで講師の先生から最近とある CTF で出題された問題が僕の書いたコードで解けるか試してみないかと言われました.
とりあえずこの日は攻撃コードを試しながらリファクタリングを進めていってましたが,なかなか問題がとき終わらないことに気づきました.
さらにどのくらい時間がかかるか概算したところ,とんでもなく時間がかかることが判明しました.というのもとある高速化をまだ実装しておらず,たまたまその問題のパラメータはその高速化がよく効くものだったのです.
ということでこの日はリファクタリングでクネクネしててあまり進捗が出せず,悲しい感じになりました.
🐣「キャンプ期間中って意外とコード書く時間無いですね」
₍₍ (ง ˘ω˘ )ว ⁾⁾ < わかる(意訳)
この日の夜はその高速化を実装しようと思い頑張っていましたが,論文中に詳しくは書かれておらず内容がだいぶ省かれていました.
休憩ついでにプロトコルコースの様子をちょこちょこ見に行ってましたが,なかなか開発が大変そうでした.ネットワークは色んな人の色んなものが絡み合ってるので大変ですね…….
リアル try-catch デバッグなどという悪い話も出てましたが,我々は人道と道徳を忘れませんでした.えらい.
それとこの日辺りからプロトコルコースの先生と受講生が名刺交換関連の話をコソコソと計画していて,なんというかその様子が見ていて面白かったです.🐧 🕊
またこの日はナ行の一文字をやっている方とずんだもん同盟を結び,僕たちは固い絆で結ばれました.🐈
まあなんやかんやありましたが,結局僕の方はなかなかうまくいかなくてとても困っていたまま4日目突入です.
4日目
あんこさんの扉開け技術の練度も極まってきた頃,僕は色々な値を試して検証しつつ高速化を実装まで落とし込もうとなんやかんやしていました.
しかしなかなかうまく行かず,少なくともキャンプ期間中では厳しそう(というのも3日目と4日目を過ぎたらあとは成果発表だから)だということになり,マルチスレッドに対応することで少しでも早くしようという風に切り替えました.
ここで問題が発生します.SageMath で Pari を使ってる部分はスレッドセーフに実装されていないのです!!
ということでマルチスレッドや Pool を使うのでは実装できませんでした.そのため sage プロセスをいくつか立ち上げて,プロセス間通信でいい感じにやる愚直な方法を実装しました.
これは午前中の比較的早い段階で終わり,あとは成果発表スライドを作成する作業です.
僕は Linux 環境だったので Google Slide で作っていましたが,数式関連のサポートが無いのもあってクネクネしてました.Beamer で書こうとも思ったのですが成果スライドのデザインが質素になりそうで,ちょっとなあという気持ちでした.
成果発表スライドの作成中だったと思います.なんと,L トラックに Arch Linux を安定化させるプロと,Ubuntu を一瞬で壊すプロが同時に存在していることが発覚しました!!!
僕は普段使いで Arch Linux を使っていたのですがなかなか GUI が安定せず,Arch Linux 格付けバトルで敗北を喫しました.その方から色々話を聞こうと思っていましたが結局あまり聞けませんでした…….うーむ.
Ubuntu を一瞬で壊す方も「普通に使ってるだけなのに」などと供述していましたが多分普通に使っていないので,カーネル周りを触っているとかそういった何らかしらのすごいことをしているんじゃないかと思っています.真相は闇の中……
そういうのもあって,久しぶりに悪いオタク同士の会話をすることができました.楽しかったです.(というか全体的に悪いオタクの会話が部屋中で聞こえていたので面白かった)
「Rust はいいぞ(意訳)」の鶴の一声で「素晴らしい」が講師陣の中で音叉のように共鳴しあっていました.きっと素晴らしいんだろうなと思いながら,Rust にちょっと興味が湧いたりなどもしました.
数式の画像をペタペタしながら気合でスライドを作り 8 割くらい完成した頃,L トラック内での成果発表会がありました.
まこさんに説明するのに一時間強かかっていたくらいなので当然 2 分で終わるわけもなく,本番の成果発表はタキオンでいこうと L トラックのプロデューサーさんには言われました.
今まで L トラックの他のゼミがどんなことをしていたのかほとんど知らなかったので,この機会に色々と知ることができました.
また,この日の夜はプロトコルコースの受講生が開いた名刺交換会で賑わっていました.あまりの賑わいで暑すぎて僕は退場…….涼しい Y トラックの教室の中で FPGA の話を色々聞いてました.
5日目
最終日は主に成果発表です.いい感じにグループワークの発表をしたあと,ついに本題が始まります.
最初は専門コース,ジュニア,ネクストの成果発表でした.どこもすごく面白そうなことをしていて,僕も体が百個くらい会ったら参加したい内容でした.
個人的にはジュニアの方がすごく大人で,しかも技術レベルも高く関心していました.
適当に最後のお昼を挟んだあと,ついに開発コースの発表です.
やはりというかなんというか,開発コースは全体的に各々がやりたいことをやる印象だったのでユニークな内容が多かった印象です.いい意味でニッチかつ技術に関して変態で,聞いててとても面白かったです.
僕の発表ですが,直前になって緊張しまくって講師の先生に泣き言を言っていました.すみません.
発表内容ですが,時間が短かったのもあり光を超えるスピードで終わらせて,会場にいる方々全てを置き去りにしたと思います.すみません.
ということで無事成果発表も終わり,セキュリティキャンプ修了となります.
最後の方は何枚か集合写真を撮っていただきました.また L トラック内でも写真を撮ったのですが,このときのポーズがみんなで L 字に腕を作るものでした.大量の L が並んでいたので LLL ですね!(???)
ところでなぜ L トラックは L なんでしょうか……(歴史的経緯は色々あったみたいですが)
L トラックの L の謎を引きずりつつついに解散となります.後ろ髪引かれる思いで名残惜しかったです.
感想
そんなこんなで楽しいキャンプ期間となりました.講師やチューター,受講生の方々,協議会の方々を含めその他セキュリティキャンプに関わってくださった皆様,本当にありがとうございました.
講師の方が強いのはもちろんのこと,受講生のみんなも主体的に何かに取り組んでなにかに熱中している方ばかりで,日常の技術的な雑談のどれもが刺激的でした.
またセキュリティキャンプで学べたのは技術だけでなく,僕自身が目指す先にいる講師の先生にも会えるのでそういった方々から様々なエッセンスを受け取ることができました.僕は今まで暗号が好きで暗号の勉強を続けていたのですが,やはり数学は難しく広大です.それに対してどのように向け合えばいいのか僕自身かなり悩まされていました.e_shiho さんに色々教えてもらう中で,そんな数学にどう立ち向かっていけばいいか,その解答を僕の中で導けたのが一番の成果だなと思っています.
ということで,お疲れ様でした!