ポタージュを垂れ流す。

マイペースこうしん(主に旅行)

POODLE攻撃

例によってリレーブログの時間です!前の僕の記事はこれ、前回の方のブログはこちらになります。

potaxyz.hatenablog.jp

amame.hateblo.jp

今回僕に与えられたテーマはPOODLE攻撃になります。かなりざっくりまとめます。(せっかくなら実装して検証したり...とかやろうと思っていたのですが全然時間が取れなかったのでまたいつか...!)

POODLE攻撃とは

POODLEとは、Padding Oracle On Downgraded Legacy Encryptionの略で、SSL3.0というインターネット上でデータを暗号化して送受信する仕組み(=プロトコル)を用いた中間者攻撃を実行するために悪用されうるセキュリティ上の欠陥です。

新しい暗号化方式の通信に対応しているサーバーであっても、サーバーが対応している古い暗号化方式の通信プロトコルに切り替え(=ダウングレード)、古い方式に有効なPadding Oracle攻撃を行うというものです。

Padding Oracle

暗号方式にも様々ありますが、その中でもブロック暗号方式では、特定のサイズ単位でデータを暗号化します。しかし、暗号化したい平文は必ずしも特定のサイズ単位になっているとは限りません。そこで、前回の僕の記事のように、特定のサイズ単位になるようにダミーデータを詰めてやる、ということをします。

例を出すと、64bit単位でデータを暗号化する方式だったとすると、平文が54bitであれば、残りの10bitはダミーデータで埋め(埋める=padding)、規格に合うようにします。

クライアントからサーバーに暗号文を送ると、暗号文を解析した結果をクライアントに返すときに、暗号文が正しく復号できたかどうかのみならず、パディングの一致不一致などをお知らせする場合があります(パディングのオラクル、オラクルは神託という意味)。

このPadding Oracleを攻撃者は利用して、例えば、正しいパディングを変えながら送信しまくって調べ、正しいパディングがわかれば暗号化途中の中間値が解析でき、と、これを繰り返せば最終的に暗号化前の平文を解析することができてしまうのです!

対策

対策としては、SSL3.0を無効にすること、と、いたってわかりやすいものになっています。現在ではSSLは使用が禁止されており、TLSというプロトコルが使われています。

実は、この脆弱性SSLだけでなくTLSの初期バージョン(1.0/1.1)にも存在することが報告されています。このため、2021年3月には、TLS1.0/1.1の使用禁止が求められています。なので、TLSTLSでもバージョン1.2以上のものを使うようにすればよいということになります。

参考文献

次の記事はこちらです。

qwerty11.hatenablog.com

KLab Server Side Camp(第2回)に参加しました

KLab(クラブ)さんの KLab Server Side Camp(第2回)に参加してきました。

このインターンに参加するまで失礼ながら知らなかったのですが、KLabさんは、スクフェスラブライブ)とか、最近だとラピライ(ラピスリライツ)とかのゲームを作ってる会社、というとイメージが湧きやすいのかなと思います。ICPCのスポンサーもやられているのは知らなかった...

人生初のインターンだったので、個人的にはとてもいい経験になったと思います。そんな参加記です。

告知

参加記に入る前に宣伝です。

<サマーインターン、エントリー受付中>

■「KLab Server Side Camp」(第3回)

https://klab-hr.snar.jp/jobboard/detail.aspx?id=Or4L6WIHlTI

日程:9/1(木)~7(水)※平日5日間

第1次応募締切:3/31(木)23:59まで

  • オリジナルの音ゲーを題材とした「サーバサイド」開発体験インターン

  • メンターは自社エンジニアのPythonコアコミッターが務めます

#KLabServerSideCamp

#サーバサイドキャンプ

リンク先で興味を持たれた方や、以下の参加記で興味を持たれた方は是非エントリーしてみてはどうでしょうか...

参加のきっかけ

twitter経由で第1回の参加記を読んだからです。この記事読んだんだと思います。

qiita.com

単純に面白そうだな〜ってなったのと、自分が趣味として使ってた技術(FastAPIもSQLこれで触ったことは一応あった)がどうやって実際のアプリケーションに使われているんだろうと興味があったというのが一番の理由でしょうか。pythonを使って、というのもあまり聞かない気もしたので(実際の開発でもpythonを使っているようです)。

あとは、こういうインターンに参加しないと、春休みコーディングしないだろうなあというのもありました。

ちなみに、僕がこのインターンの存在を知ったタイミングは第2次応募締め切りの直前くらいで、2次はお祈り確率が高くなっていたとのことなので、運が良かったようです。何事も早めにやるのが大事ですね。

スケジュールイメージ

3月の10,11,14,15,16日の5日間で開催されました。

ちなみに、12,13は土日でしっかり休んでね〜とのことでしたが、その土日は僕は東京に行っていました

なお、今回の製作物はこちらになっています(コードとして直すべきところはタイミングを見て直したいですね)。

github.com

1日目(3/10(木))

各参加者の自己紹介から始まり、環境構築、MySQLを触ってみる、SQLAlchemyを使ってpythonからSQLを実行してみる、音ゲーで遊んでみる、といったことをしていました(講義と実習)。

開発環境にはgithub codespacesというものを使っていて、僕自身はそれに初めて触れたので、こんな便利なものもあるんや〜と少し感動していました。

音ゲーはパソコン上で動くもので、6つのキーでやるものでした。弐寺beatmania IIDX)みたいな感じでしょうか。僕はipadでdeemoとかデレマスとかそういうタイプのキーを使わない音ゲーばかりやっていたのでなかなか苦戦していました。ちなみに、KLabさんのゲームはひとつもやったことがありませんでした...

さすがにSQLなど触った経験があるだけあって特に引っかかることもなくこなせたので、大部分の時間を音ゲーのプレイに費やしていました。

2日目(3/11(金))

1日目に最低限のSQLなどの知識を確認したので、FastAPIとかpydanticとかを触ってみようという感じになりました。まずはチュートリアル的な感じでuserのAPIを完成させてみて触り方を学習します。ここまでで以後実装に必要な知識は一応得られたことになります。

午後からは本キャンプの本題となるroom APIの実装に入ります。マルチプレイをするのにバックエンド側で必要な機能を実装していきます。具体的には、対戦部屋の作成、部屋の一覧表示、部屋への入室、開始待ち、ゲーム開始、結果の送信、結果の表示、途中退室、の機能の順です。マークダウンで書かれた仕様書があり、それを基づいてやっていきます。

2日目にはたしか、部屋への入室までは実装できていた気がします。部屋が満室だと入れないようにするとか、考慮することがいろいろあって、部屋への入室機能の実装には苦労しました。

3日目(3/14(月))

土日を挟みましたが、先週からの続きをやっていきます。以後は、実習のヒントとか、ポイントの解説的な講義はありましたが、基本はもくもくと実装です。

もくもくと実装したおかげか、一応目標としていた機能は全て実装できていたはずです。皆さんかなりもくもくと作業していたので、社員さんが寂しそうでした(笑)

4日目(3/15(火))

この日は他の参加者の方々と実際にマルチプレイをし合ってデバッグ作業でした。幸いなことに?僕の書いたプログラムは特に問題なく動いてくれました。

デバッグし合っていると、自分の実装で忘れていた点などが浮かび上がってきて、ちゃんと動いてくれてはいるけど問題があるなあといったところを修正できたり、機能の追加をすることができたりしました。

また、デバッグ作業をしていたら、マルチプレイではポーズ操作ができないはずなのにできてしまい、プレイ中にやめられない想定なのにプレイがやめられてしまうという、クライアントサイドのバグを思わぬところで見つけてしまったりもしました。

(これの何が問題かというと、退室した人がプレイ中のままと誤認されて、他の退室してないプレイヤーがプレイ終了しても、いつまでたってもリザルトの画面に辿り着けないということが起きてしまいます)

また、途中でエンジニアさんの座談会の時間が設けられていました。技術ってどうやって仕入れてますとか、リモートワークこんな感じですとか、色々話していただきました。

5日目(3/16(水))

この日は最終日ということで、成果発表資料の作成と簡単なコードの修正と、それから昨日見つけてしまったクライアントサイドのバグをサーバーサイド側でなんとかしてみるか〜ということで機能を追加していました(その機能の実装はできましたが、個人的にあまり納得いくコードの書き方ではありませんでした、成果発表会の時にこの点についてコメントをいただけることができたのでよかった)。

自分の成果発表会の後には、メンターさんからコメントがいただけて、全部実装できてていいですねとか、この作りだとデッドロックが起きてしまうかもしれないだとか、こういう実装はしなくて普段はこうしてるかなとか、関数の分け方がいいだとか、色々言っていただけで、学びもありました。

もちろん、他の方の成果発表からも得られるものがありました。UML図やER図書いてる方だとか、セキュリティ意識高くSHA256をかましていたりとか、データベースの正規形意識してる方だとかがいて、すげーとなっていました。

成果発表会後は懇親会ということで、昨日の座談会の続き(?)という面もありましたが、それよりはゆるい感じで、就活の話からそうでない話まで、こちらも色々と楽しい話が聞けました。深夜ラジオみたいな感じでした。

感想

技術面

メンターの方々のhelpがかなり手厚いと感じました。質問対応が早くてなおかつ親切です。自分はあまり質問することはありませんでしたが、他人の質問を見て勉強になるなあと感じたこともありました。ちなみに、メインメンターの方はpythonのコアコミッターの方ですごいと思う。

最終日に自分の書いたコードに対してコメントをいただけたのは本当にためになったと感じます。

課題は普通に難しいんだと思います。サブメンターのエンジニアさんがそうおっしゃっていました。僕は特につまずくことなく実装できてしまいましたが、それでも悩んだ部分はあります。参加者全員が最後まで実装できたわけではないです。仕様書があるとはいえ、逐一説明されているわけではなく、データベースのテーブルの設計から始めるため、なかなか自由度が高い課題になっているかなと思います。

他の参加者の方々について

みんながみんな情報系というわけではなく、例えば化学系の方もいました。また、情報系の中でも低レイヤーが専門という方や、普段はpythonじゃなくてgo書いてますとか様々でした。

サーバーサイドの経験があってバリバリやな〜って方もいれば、ない方もいました。僕は一応あるっぽいです(そういうことを意識せずに開発していました)。

志望理由もさまざまで、僕は(真剣な方にちょっと申し訳ないなと思いつつ)気になる〜って軽いノリで参加していて、似たような志望動機の方もいましたが、就活の一環で成長したいからという方もいらっしゃいました。

参加者11名中、バ美肉している参加者が2人もいらっしゃいました。

参加者の方々を見ていると、pythonが書けて(数値計算などでも可)、gitが使えれば参加のチャンスはあるのかなと思います。

雰囲気について

雰囲気はとても良く、エンジニアさんとも、他の参加者の方とも、ワイワイやることができました。本筋に関係ない雑談もできました。エンジニアを大切にしてくれる社風なんだなと感じました。会社の雰囲気を知れたというのは大きな収穫の1つだと思います。

ゲームについて

なんとこのインターンのためだけに作っていただいたようなのですが、普通にクオリティが高く驚きです。暇な時に遊ぼうと思います。ゲームのクライアントサイド自体はunityで作られているようです。

開発用(?)というだけあって、普通にプレイもできるのですが、オートプレイモードや、一瞬でリザルトに移行するモード等も用意されています。

f:id:potaxyz:20220318185250p:plain
楽曲・難易度選択画面

f:id:potaxyz:20220318185010p:plain
プレイ画面 キャラクターがかわいい

f:id:potaxyz:20220318185530p:plain
ゲーム開始画面 通常・オート・一瞬モードとシングル・マルチプレイの切替が可能

楽曲の例:

ノベルティなど

参加証をいただきました。ちなみに、twitterでもこのアイコン使ってますが、どっかからパクってきてるわけではなくて、自分で描いたものです。ホワイトボードに描いたやつを写真撮ってます。

f:id:potaxyz:20220318185917j:plain
参加証

5日間のお供にということで、段ボール1箱分のお菓子と、自己研鑽用の本などをいただきました。

f:id:potaxyz:20220318190028j:plain
お菓子や本や扇子など

また、懇親会用にということで、お酒やおつまみ類もいただきました。成城石井のいいおつまみでした。

f:id:potaxyz:20220318190108j:plain
お酒とおつまみ

最後には修了証もいただきました。

たくさんのノベルティ等本当にありがとうございます。まだたくさん残ってるのでゆっくりいただきます。

さいごに

自分自身、あまり企業のことや就職のことに興味を持てずにいたので、このような経験ができたのはとてもよかったと感じています。

KLabさん、5日間ありがとうございました。とても楽しかったです。

続 セキュリティ・キャンプフォーラム2022に登壇しました

前回の記事の続きです。が、フォーラムは関係なくただの旅行記です。

potaxyz.hatenablog.jp


久しぶりの東京ということで今回の旅行はかなり楽しみにしていました。

フォーラムの前日の夜から移動を開始。まずは東京とは逆方面の大阪に向かいます。

わざわざ大阪に出向いたのは...そうです、サンライズに乗りたかったからです!

6年前程にも一度出雲市→東京で乗車したことはありましたが、今回は途中大阪からの利用です。寝台特急って憧れますよね〜

前回はおそらくシングルだったと思うんですが、今回は席が空いていなかったというのもあって、B寝台の1人用個室としては一番高いシングルツインを利用。2人で使うこともできるので、2人用の準備がしてあります。

1階部分はイスと机に組み替えることもできます。

1人で使うには広いので贅沢に空間を使うことができました。起きたら発表の本番なので早く寝ます。


おはようございます。

肌寒くてなかなか布団から出られませんでした。気づいたら函南トンネルを抜けて熱海にいました。この辺で起き上がったと思う。

歯磨きなどを済ませて部屋に戻ります。

横浜駅停車中

PCR検査をしました。ちゃんと陰性でした。実際にはPCR検査に失敗していて、というのもあるはずのパーツが足りませんでした。フォーラム会場で雑談でこの話したらパーツ持ってる人がいたのでそこでやっと判定ができました。

歯磨き後とか食事後30分は検査ちゃんとできないかもって書かれてたから結局パンはここでは食べれず東京駅の外で食べることに...

パーツなくてPCR検査できなくね?ってなって困惑していたら東京駅に到着してしまいました。別のパーツに本体を押し込むみたいに書いてあったので、なんとかならないかと一生懸命外の石畳に検査キットを打ち付けていましたが、検査結果は出てくれませんでした。

suicaがメインのエリアではなかったので入れていなかったのですがここで入れてみました。都区内パスを買っていますが結局ほとんど使っておらず金をドブに捨てる結果に...

フォーラムまで時間を潰します。

スタバの都道府県埋めも兼ねて会場のビルの1階に入ってたスタバに入ります。スターバックスリザーブとかいうのやっててかなりいい店舗らしいですね。

会場 丸の内オアゾ でかい

パソコンを開いて発表スライドの確認(喋ることを決める)、別件でtexでせこせこと数式を書いてpdfを作ってメールを投げたりしていました。

そんなこんなしてたら昼ご飯を食べた方がいい時間になってきました。google mapで自分が目つけたご飯屋として打鋲してたのが一箇所しかなかったのでそこに行くため秋葉原へ。30分後には会場にいないといけないみたいでちょっとシビアだな、と思いつつ行ってみたら普通に並んでたので諦めてそのまま戻ってきました。仕方ないのでnewdaysでおにぎり2つ買って会場で食べました。

スカイツリーがよく見える

発表した話は前の記事の通りです。

焼肉会も解散し、ホテルへ向かいます。

夜の東京駅

皇居周辺を歩きましたが、大都会の夜景を久しぶりに見たなあという気持ちに。

twitterで見かけて泊まってみたいなあと思ったところです。説明はツイートの通りです。

チェックインして部屋にあったチラシ?読んだらチェックイン時刻とされている21時は普通に過ぎててちょっと申し訳なくなりました。一応門限(ホテルなのに門限って何だ)とされている24時より前に来たからセーフなのかな。

おやすみ


朝食を食べます。

洋朝食

和食も選べましたが洋食の方がそれっぽいと思ってそうしてみました。卵料理もスクランブルエッグと目玉焼きとオムレツで選べますが、一番それっぽいオムレツにしました。他の宿泊客の方もオムレツばかり選んでいたようで、料理してる方とか案内してくださった方からの今日はオムレツしか出ませんね、という会話が聞こえてきました。

飲み物が2つ並んでいるが、飲み物もいくつか提示されて、そこから好きなだけ選べるようになっていました。リッチだね。

朝食の後は館内を軽く探検しました。3階ではウエディングフェアやってたりとか、4階には読書室があったりしました。学士会会員専用の囲碁将棋部屋とかもあったし、旧帝大の七大学紹介コーナーとかもあった。さすがだと思う。更衣室ってどう使うんだろう。

チェックアウトをして、いくつかやりたいと思っていたタスクを遂行していきます。

麹町にあるセブンイレブンに来ました。本社が近いためか、かなり設備も充実してたし、商品がバカみたいに品揃えよくて驚きました。

クリック感なくてアレかなあとか思ってたんですが、意外と違和感なかった気がしました。普及するんでしょうかねえ...

ネットミームの巡礼

こんなの売ってるんですね

お茶の水でクラシックCDを漁りました。思い立った時にたまにやっています。今回はショパンエチュード集とシューマン子供の情景クライスレリアーナが入ってるやつを買ってみました。サブスクでも聞けるけど。

秋葉原で麺を食べました。おいしかったです。

チームラボボーダレスに行こうとしていたのですが、思った時間に予約を取るのに失敗してかなり時間を無駄にします。

仕方ないので東京駅に戻って先んじてお土産を集めておきます。が、丸の内側と八重洲側を間違えたりしてここでもかなり時間を無駄にして、乗る電車ギリギリとなっていました。京葉線ホーム遠すぎやねん。

ちなみに買ったお土産は東京カンパネラのバウムバーと、東京ひよこの紅茶ひよこ3個入りです。個人的に好きなので東京行くといつも東京カンパネラと東京ひよこの商品を買ってしまいます。

無事時間内に到着できました。

写真をバシャバシャ撮りまくっていました。デジタル感ある空間に没入できるのは楽しいですね。光とか鏡とかがこれでもかというほど配置されています。

個人的には最後の2枚の空間が好きです。

京都でチームラボがなんかやってるといつもこのタマゴが置いてあるイメージがあります。

1階は見て没入して楽しむ感じでしたが、2階は子供たちが遊んだりとか、カップルとか友人複数人向きな感じだったかなと思います。

技術好き人間としては裏でどうやって制御してるのかとか、プロジェクターの使い方とかが気になったりしました。物体動かしてそこにマッピングしてる光移動させたりとかしてるのに何使ってんだろう。

なんだかんだ2時間いかないくらいはうろうろしていたと思います。満喫したので京都にこれで帰ってもいいですが、今期は北海道に行くことができずフラストレーションが溜まっているので、ここで北海道を作ろうと思います。

新宿に向かいました。ウェルシアではセイコーマート商品をいくらか扱ってくれているのですが、関東ではその扱っている商品数が多く、パスタやヨーグルト等を扱ってくれているので、新宿大ガード近くのところでそれらを購入しました。

ついでに駅弁の深川めしを買っておきました。

池袋にどさんこプラザがあるので、そこでジュース等を購入します。

ここの導線はかなり反省しているのですが、実はわざわざ新宿と池袋に寄る必要はなく、東京駅に戻ればよかったです。東京駅付近でもセコマパスタを扱っているウェルシアはあるし、どさんこプラザは有楽町にもあります。ここでもかなりの時間をロスしました。

なんだか名残惜しいので山手線を時計回りに半周して時間をかけて東京駅に戻ります。

タスクリスト

途中で思いついたことやったりとかもしましたが、ある程度タスクは遂行できたかな?とはいえ、定休日だったりとか、友人が体調崩してしまっていたりとかでどうしようもないものもありましたが...

羽田空港は単純に遠いので次回に持ち越しです。

また行きます。

おいしかったです。東京で買ってみたい駅弁はいくつかあるのですが、今度はチキン弁当を買ってみようと思います。

新幹線に乗る機会も少ないだろうと思ったので、シンカンセンスゴイカタイアイスを買ってみました。スプーン全く刺さりませんね。

あっという間に京都に帰ってきてしまいました。

楽しい週末でした。

ちなみにですが、この土日の前後は別件で体験型インターンをしています。その記事も近いうちに書こうと思います。

セキュリティ・キャンプフォーラム2022に登壇しました

セキュリティ・キャンプフォーラム2022に登壇してきました。

www.ipa.go.jp

本名と顔を開示 下ネタも呟くtwitterアカウントとも結びついてオワリです

ちなみに親にはバズったツイートのせいで既にバレてるのでそこは問題ないです

話したこと

セキュリティキャンプフォーラムは、一番上のリンクにある通りですが、修了生の立場でいえば今どんなことしてますとか交流したりするような場です。初めはそんなのもあるんだ〜くらいでしたが、主にリレーブログをするのに連絡し合ったりとか活動しているdiscordチャンネル上に、セキュリティキャンプの運営側の方から発表してみませんか?というお誘いの投稿がされ、現地で登壇したい発表者は交通費を出してくれるようだったので、せっかくなら東京に行きたい!ということで、現地で発表することにしました。旅行オタクは旅費が出るというのならば手段は選びません。なお、フォーラム自体はオンラインで、発表者は現地に行くことも可能という形式でした。

内容なんですが、僕のブログを読んでくれている方なら度々見ているかもしれない『例によってリレーブログの時間です!』で始めてる一連のリレーブログについての話をしてきました。ちなみに、僕の前の記事はこれになります。記事のメインの内容の下につけたこれまでの記事一覧のところに飛ぶようになっていると思います。

セキュリティキャンプのグループワークってどういう企画?ってところから始めて、リレーブログをするに至った経緯、リレーブログしていてよかったことと、簡単に記事の紹介をしました。

リレーブログって気づいたら更新が止まってしまうことがよくありがちなイメージなんですが、我々のグループはなんだかんだもう半年近くも続いており、記事の数も2022/3/14現在で24個もあります。正直自分もここまで続くことになるとは思っていませんでした...。

しかも、セキュリティキャンプでのグループワークの中で継続しているチームが我々だけっぽい(もちろん、グループワークをきっかけに個々としては活動を継続しているような方もいるとは思いますが)。

なんでこんなに続けられているのか、って考えられる要因としては、「前の人に次の人のテーマを指定して、それに従った内容の記事を書く」という縛りがちょうどいい感じの縛りになってるのかなあとは思います。皆さんそれなりに知識欲的なものもあるので、何かしら調べて記事を書き上げてくださいますし、僕もそうしています。知らないテーマが振られがちではありますが、高度なことを書くのをコンセプトにしてるわけでもないし、自分が元から興味があるような分野でないと高度な記事を書くのが難しいので、そこそこ気楽に書けるっていうのもあるのかもしれないです。

正直なところ、内容がないようってやつだったので、こんなもので発表して大丈夫だったかな、と思っていたのですが、雰囲気的に大丈夫そうでした。安心安心。

パネルディスカッション

修了生講演以外にも、パネルディスカッションの企画があって、それがなかなか面白かったです。

『プログラミングの教育者になるとしたら、何から教えるか』というテーマでした。パネリストの方々はさまざまなバックグラウンドをお持ち(競プロやってる人、エンジニアリングできる法律家、実際に高校で情報教えたりしてる院生、など)だったので、そういう考え方もあるんだ、とか、話聞いてて思いついたことをtwitterハッシュタグつけて呟いてたら拾っていただいたりとかして(会場にいるけどパソコン開いてツイートするスタイルだった)楽しかったですね。

ちなみに僕はプログラミングはものづくりのための道具だと思ってるので、初めの言語は簡単なもので、調べれば作りたいものが大抵作れるようなpythonがいいかなーと思っています。

と書いたこの一文にも色々突っ込みどころはあって、ググったり調べる方法を初めに教えるべきでは、とかpythonよりjavascriptとかperlの方がいいんじゃない、とか、バイナリエディタ初めに触らせようぜ、とか。小中高校生全員に教育することを考えると、ものづくりをしようと思わない人にプログラミングを教える意味とは何か?とか。こんな感じのことを議論していました。

交流

会場にいたセキュリティキャンプ修了生は十数名程度。久しぶりのオフラインでの交流ということもあってか、技術的な話から世間話まで色々と話ができました。僕は他の方に比べると技術的な知識(セキュリティキャンプは低レイヤーが強い人が多いが、僕は正直さっぱりわからん)がないので、そんなのもあるんだーとなっており面白かったです。

フォーラムの後に、別企画として交流会が完全オンライン開催でありました。LT大会の中で気になった話はdolphin attack(超音波領域の音でボイスコマンドを入力して実行させる)の話です。僕もdolphin attack使って家のAlexaで遊びたい。ちなみにその発表してたの一緒にリレーブログやってるとぅくしさんなんですが。現地会場に来てた人たちも交流会のLT大会はパソコンに向かって話を聞いていましたが、そっちで討論やってる時間は現地組は現地組で雑談していました。とぅくしさんはオンラインの方で忙しく、現地組の雑談に混ざる暇がなくて寂しかったようですが...

父親が気合い入れてオシャレな名刺を作ってくれたので配りました。QRコードのリンク先に飛ぶと、名刺にかざすとARでtwitterとかのリンクとかに飛べるような感じにはしてるので貰った方は遊んでみてください。といっても即席で作ったのでリンクが並んで浮いてるだけで面白くないと思いますが...

焼肉おいしかったです。大人数でやるのはアレなので、4人ずつぐらいに分けられて配慮はなされていました。

あと、twitterで9年前からつながってる人がお互い知ることなく(相手は最近は別垢でよく活動していたため)ここでエンカすることになって、これが一番の衝撃でした。


機会があればまた登壇してみたいし、こういう交流の機会があればまた行きたいなあと感じられる週末でした。

続きます。

potaxyz.hatenablog.jp

3回生後期の振り返り

書き忘れていたので今更だが、雛形だけ作成しておく。

これに基づいてそのうち書きたい。

セミナーとか特に、かなりしんどかったし...。

新潟・山形・宮城(6泊7日)

新潟できんモザ展をやるということだったので新潟スタートで仙台方面に抜ける感じで旅行しようと立案。全然東北は攻めれていなかったのでとても良い体験ができた。特に山形はいいところだと思った。(なお、今回も非常に長い記事となっており、画像とかのせいで重くなっていると思います)

3/1(火)

いつものようにギリギリに自宅を出発。関西空港駅に向かう。

経験上飛行機出発予定時刻の45分前に駅に到着できれば飛行機に搭乗することが可能だが、乗った電車がまさにそのちょうどギリギリの電車。

10:14に関西空港駅に到着。第二ターミナル連絡バスに乗る。前までこの時間帯は7分間隔で連絡バスが出てたはずなのだが、知らぬ間に10分間隔になっていた。時刻表を見る感じ9時台は55分発が最後で、それ以降が何分間隔、って書き方になっていて、9:55を基準に10分間隔でバスが出ているってことなんだと思う。

チェックイン期限3分前にターミナルに到着、チェックインを済ませる。

保安検査を通過し、飛行機に搭乗。いざ新潟へ。

新潟が近づくと上空からは雪化粧をした市街(長岡など)が見られた。

f:id:potaxyz:20220310174733j:plain
上空より

新潟空港に到着。

f:id:potaxyz:20220310174452j:plain
新潟空港

写真奥に見えている、新潟駅までの連絡バスに乗ってとりあえず新潟駅の方まで出る。

時刻は13時ごろ。お昼ご飯を食べたいところ。何も思いつかなかったので、とりあえず万代バスセンターのカレーを食べる

何も考えずに大盛りにしたらかなり量があって苦しんだ...

本当はホテルのチェックインをしたいがまだ時間があったので、近くにあったスタバで明日以降の旅程を立てることに。

別にスタバ入らなくてもいいんだけど、都道府県スタンプラリーがついてることを知ってしまったので、スタンプラリーを埋めなくてはならない!

f:id:potaxyz:20220310194751j:plain
スタバスタンプ埋め

15時ごろになったので、ホテルにチェックイン。アパなんだけど、できたばかりらしく安く宿泊できた。

荷物を置いて、今回の目的であったきんいろモザイクThank you!!展へ。新潟市マンガ・アニメ情報館自体は前回に引き続き2度目の訪問(前回→新潟に行った - ポタージュを垂れ流す。)。

京都から新潟は遠いが、きんいろモザイクと青春を共に生きてきたので見る以外の選択肢はなかったのです。

f:id:potaxyz:20220310175524j:plain
きんいろモザイクThank you!!展

制作の裏側の資料を見ることができて大満足な展覧会だった。

受注生産品を購入してしまい金が飛んだ。

出ると時刻は17時過ぎ。夕食にはまだ若干早いかな〜っていうのとお店を決めかねていたので古町商店街を散策。以前も来たことあるけど中心街は歩いていなかったんだなあとなった。思ったよりでかい。小雨が降っていたけれどアーケードだったので少し助かった。

新潟市マンガの家に寄って原悠衣先生のサインを見に行った。ついでにマンガコーナーで、そこでオススメされていたマンガを一冊読んだ。

f:id:potaxyz:20220310175747j:plain
サイン

時刻は19時ごろ。ここまで歩いた道でよさげなお店はあまりなかったので、調べて目星をつけたお店に行ってみたが臨時休業になっていた...仕方なく、無難だが前から目をつけていた回転寿司のお店へ。

佐渡産のエビが美味かった(何故それの写真を撮っていない?)。

明日は異常に早いので、適当に朝食を買い入れ、絶起したら困るので切符も購入しておく。新潟から坂町までの片道切符と、きらきら日本海パスを購入しておく。

f:id:potaxyz:20220310201737j:plain
新潟駅前にあるBE KOBEの亜種

ホテルに戻る。大浴場がついているらしいので入る。

ホテルについている大浴場としては良かったが、露天風呂といいつつ外気に触れられるだけで特に景色が見渡せるわけではなかったり、サウナが付属していなかった点はいただけなかった。

ちなみに、プールがついていたり、フィットネスルームがついていたりする。ホテル&リゾーツって言ってるだけあって設備はかなり良い。1階にはホテルにくっついて良い感じの飲食店とかコンビニも入っている。

さっさと寝ましょう、といいつつ日付をまたいでから就寝。

3/2(水)

4時起床。重い体を起こして準備をする。

4時45分ごろ?にホテルを出発。かなりギリギリ。駅へ走る。新潟駅万代口の下に着いたのが列車が出る3分前。ホームまで遠いのを完全に忘れていた。

発車20秒前くらいでギリギリ滑り込む。なんとか今日の旅程を遂行できそうだ。

新潟市街を過ぎるとあまり除雪されていないのかそこそこ雪景色を見ることになる。とはいえ日の出前真っ暗でほとんど何も見えないが。

途中村上駅で乗り換える。

新潟市周辺はかなり良い感じ?の電車だが、ここからは田舎にありがちなワンマンカーとなる(ただし最近新造されたやつで古い感じはない)。

鶴岡まで乗車。新潟から山形の海岸を望みながら北上。景色が良い。笹川流れとか鼠ヶ関とかいつかちゃんと行ってみたい。7時台になり鶴岡が近づいてくると地元の高校生も列車に乗ってくる。

鶴岡駅でバスに乗り換え、加茂水族館へ。開館より前に到着してしまうので、時間を潰す。近くに灯台があったのでそこでしばらく待機。と言っても、海からの風が強く、かなり寒い。

開館時刻になったのでいざ水族館へ。開館凸するやつなんていないだろう、と思っていたが、意外と家族連れか何かだと思われるものが2組程度おり、クラゲ水族館としての人気を窺わせる。

f:id:potaxyz:20220310180426j:plain
加茂水族館 右奥には荒埼灯台も見える

館内はあまり広くないので、なにかショーとかイベント的なものを見るわけではないなら1時間もあれば十分だろう。疫病や改修工事のおかげで、イベントは行われていないようだったが。一応クラゲの解説会?みたいなのが10時から〜みたいな感じになっていたが、時間もないので断念。

半分くらいは普通の水族館(?)のような感じだが、半分くらいはクラゲが展示されている。色々なクラゲを見ることができ、かなり面白い。

f:id:potaxyz:20220310180218j:plain
シロクラゲ

発光していた。

f:id:potaxyz:20220310180248j:plain
オワンクラゲ

どうでもいいが、放射線測定器の名前がアカクラゲだったな、と思った(居たけど写真なし)。

バスの本数も多くないので、10:15に出るバスに乗って鶴岡駅周辺まで戻ることにする。鶴岡市役所前で下車。

バスを降りる時に足を引き摺るような感覚に襲われたので、なんだと思ったら靴底が剥がれていた。このタイミングでなるのはかなり困った...

どうやらコンビニで瞬間接着剤が買える場合もあるらしいということで、雪残る道を足を引き摺りつつ一番近かったコンビニへ(10分近く歩行することになった)。

f:id:potaxyz:20220310195051j:plain
剥がれる靴底

完全に足攣った人の歩き方をして入店し、アロンアルファを購入。外で一生懸命くっつける。お陰様で左手はベタベタである。

www.amazon.co.jp

なんとかくっついたようなので、近くの鶴岡公園を歩いてみる。雪が多く歩きづらいが、ちゃんと接着されているようだ。

コンビニにアロンアルファが売っていて、それで靴底剥がれてもなんとかできるという知見はけっこうデカいと思う。

f:id:potaxyz:20220310180918j:plain
公園内にある荘内神社

神主さん?に春が来ましたねえ〜と挨拶された。

市街のどこか施設に行ってもいいが、あまり気も進まず、適当に街を散策していた。

f:id:potaxyz:20220310181208j:plain
大寶館
こんな感じの洋風の建築が点在している。

お昼も終わろうとしており、良さそうなお店も見つからなかったので、アロンアルファを購入したコンビニでおにぎりを購入。目的のバス停の前で昼食を済ませる。それにしても人気の少ないシャッター街である(車は通るとはいえ...)。

バスに乗り羽黒山方面へ。雪山道を路線バスが登って行き、終点の羽黒山頂に到着。降りたのは僕1人だった。

鳥居がすぐ見えるだろうと思っていたが、雪が積もりすぎていたせいか見えなかった。歩くべき方向がわからなかったがおそらくこっちだろうという方向に向かうと、出羽三山神社の鳥居が見えた。

f:id:potaxyz:20220310181324j:plain
出羽三山神社 鳥居

冬季は雪に閉ざされるため外から参拝することはできず、建物内からの参拝となる。祈祷受付所とか看板がついてて(祈祷するわけじゃないけど...)となるので若干躊躇するが、入ればよさそう。

f:id:potaxyz:20220310181440j:plain
雪がすごい

建物入って右に行くと廃仏毀釈で捨てられてしまっていた仏像などをがんばって集めたコレクションのある部屋などが見れる。メインの三神合祭殿は左。建物内にもかかわらず手水舎がありちょっと面白い。一番奥に出羽三山の神が祀ってあり、ここで参拝すれば三山すべてに参ったことになるという(それでいいのか...)。これまで色々見てきた中でもかなりイイ感じだった。

バスで行く場合、効率よく同じバスで戻ろうとすると見れる時間が22分か32分だが、22分だと少し短そう。今回は32分で散策をした。

f:id:potaxyz:20220310181550j:plain
路線バス

先ほど登ってきた、今度は始発となったバスに再び乗り、羽黒随神門で下車。羽黒山五重塔を見に行く。無料貸出してるから長靴とスノーストック借りて行きなさいみたいな看板が立ってて少しビビり、あっち側から歩いてきたおばちゃんに、雪靴だけで行けそうですか?と聞いたが、若い男ならなんとかなるっしょと言われたのでそのまま歩いて行くことに。

随神門をくぐったすぐのところに、階段があったはずだが完全に雪に埋もれてしまっている下り坂がある。ここさえ越えればなんとかなった。当然滑る。

五重塔が見えた。時間帯も良かったのか、良い感じに日が当たり、かなり神々しい感じに。すごく美しかった。マジで何十分でも見ていられる。

f:id:potaxyz:20220310181744j:plain
羽黒山五重塔

来た道を戻る。途中で入り口の激坂で滑りまくって諦めるか迷っていたJD(?)2人組がいたので、坂ここだけだから頑張って〜と声をかける不審者となっていた。実際そこまでしても見て欲しいくらい素晴らしかった。

帰りのバスが来るまで、いでは文化記念館でパンフレットを読んだりして待っていた。五重塔でゆっくりしすぎて展示物を見れる時間は終了していた。

バスに乗車し、鶴岡駅に戻ってきた。本日の最終目的地である山形に到達するにあたって、別に急ぐ必要はなかったが、ここで特急課金して余目駅に移動しておく。

余目駅に到着。わざわざ特急に課金したのは温泉に入りたかったからである。

f:id:potaxyz:20220310182144j:plain
庄内町ギャラリー温泉 町湯

デザインのいい温泉。サウナもできた。黙浴との張り紙がされつつも喋ってる2人組がいたが、その2人から山形弁の会話を聞くことができた。

サッパリした〜、あっ、柚子酢ドリンクだ〜飲んじゃお〜、いま何時かな〜と時間を見ると、次の列車まで10分。どうやら温泉でのんびりしすぎたようだ。

走って余目駅に戻る。

ここから陸羽西線で新庄まで抜ける。

太陽も沈み切ってしまっており残念ながら景色は見れなかったが、これからトンネル工事かなにかでしばらく陸羽西線は運休になるので、この機会に乗れたのはよかったと思う。田舎特有のワンマンカー。

新庄駅で山形行きに乗り換える。きらきら日本海パスは陸羽西線の途中駅である古口までしか有効ではないので、車内で車掌さんに古口から山形までの乗車券を発行してもらう。

なお、今回きらきら日本海パスを使用したが、JRに加えてバスも利用でき、鶴岡でのバス利用だけで元が取れているので非常にお得な切符だった。

www.jreast.co.jp

山形駅に到着。そのままホテルに向かってもいいが、駅から直結している霞城セントラルに展望室があるようなので行ってみた。山形市街が一望できた。てか、もしかして山形市ってけっこうデカい?

f:id:potaxyz:20220310182415j:plain
夜景 室内が映り込んでいる

展望室には今日卒業式だったのかもしれない高校生らしきグループが3組と、そして僕という感じでアウェー感があった。

ホテルにチェックイン。1日中動き回って疲れたのでそのへんのコンビニでカップ麺を購入。それだけ食べて22時ごろには就寝。

3/3(木)

おはようございます。泥のように眠っていたが9時起床。

とりあえずチェックアウト。市内どう動くか決めていなかったが、スタバのスタンプを埋めないといけないので駅のスタバに入って旅程を立てる。

目処が立ったので動く。

どうやら山形は辛味噌ラーメンが有名らしい。よく名前が出る?ところは車とか借りないとキツそう?ということで、街中のお店で食べることに。

美味しかった。

博物館にきた。なんと入館料70円で激安だったので中に入る。学校教育の変遷が細かく解説されている。かなり面白かった。学ランとか昔と全く変わっていないなあ〜とか思った。

時間的に中を見る時間はなかったが、文翔館へ。卒業式シーズンだからか、花束を持って卒業生を待ち構える在校生?みたいな人がたくさんいた。横の湯殿山神社も訪問した。

f:id:potaxyz:20220310182918j:plain
文翔館(山形県旧県庁舎及び県会議事堂)を外から

f:id:potaxyz:20220310183121j:plain
湯殿山神社

最後に山形城跡もとい霞城公園へ。発掘調査と復原工事中で、しかも本丸のところは冬季閉鎖中という...

f:id:potaxyz:20220310183221j:plain
霞城公園 橋とその先には入れない...

山形駅に戻り、いざ蔵王温泉へ。バスで1000円。

山を登っていき、蔵王温泉バスターミナルに到着。

旅館にチェックイン。そこの女将さんの話で蔵王樹氷の存在を知った。明日の予定に樹氷ウォッチングが追加された。

ちなみに、gotoキャンペーンがない間は現金特価で4000円!みたいなキャンペーンで泊まったが、普通に泊まろうとするとそこそこするお宿である。

とりあえず旅館についてる温泉に入ってちょっとのんびり。

チェックインのときに隣にバルがあるよ〜って教えてもらったところがオシャレだったので行ってみることに。ジュースだけ飲むつもりだったがご飯も食べちゃうかということで夕食の時間に。

ごちそうさま。共同浴場巡りへ。

上湯、下湯、河原湯共同浴場の順に巡った。上湯は4人くらいいてなんだか混んでいた。が、下湯、河原湯は誰も人がおらず、独り占めできた。

強酸性pH1.7程度のお湯。舐めると酸っぱい。入った後、体から湯気が出てる気がしたけど気のせいだろうか?でもかなり体の芯から温まった。

個人的には河原湯が好きかな〜 他の場所と違って下がすのこみたいになってて、そこからお湯が抜けていくような感じになっていた。

最後に酢川温泉神社に行ってみよう、と思ったが参道にあまりに雪が積もりすぎていて断念。またいつか行きましょう。

旅館に戻る。お部屋の中でゆっくり...とはいかずスライドを作りつつ、明日の予定を立てる。

ネットがめっちゃ速かった。ワーケーションロングステイするのはありかもね。

おやすみなさい。

3/4(金)

9時に起床。本当はもう少し早く起きてどこか温泉に入るつもりだったが...

チェックアウトを済ませ、樹氷を見に行くことに。

ロープウェイで蔵王山頂まで。往復3000円はけっこう高いがそんなものか...。

頂上に到着。何も見えない...風もめちゃくちゃ強いし寒い...(-10℃程度らしい)

とりあえず玉こんにゃく食べてのんびりするか...

帰る前にもう一回展望台に行ってみるとちょうど晴れてくれた。樹氷スゲー

f:id:potaxyz:20220310184230j:plain
樹氷高原

ロープウェイで戻る。ロープウェイからも綺麗な樹氷をみることができた。

時間を気にしていなかったが、降りてきたらけっこうギリギリな時間になっていた。稲花餅を買い込み、バスに乗る。

昼食の時間が取れなかったので、蔵王温泉に唯一存在するコンビニ(ローソン)で、朝食のつもりで買っておいていたあんパンを口に入れる。

山形駅に戻ってきた。山頂はかなり寒かったが、降りてくると暖かい。

お土産を選びつつ、スマホから情報処理学会のzoomに接続して友人の発表を見た。僕も準同型暗号アプリケーション作りたい。

改札に入り、仙山線に乗って仙台方面へ。

山寺駅で下車。

これの手前に日枝神社の参道の石段があるが、そっちを登っても結局登山道?と合流することになる。

f:id:potaxyz:20220310185543j:plain
山寺日枝神社

寺なのに神社なんですね

立石寺へ。

後の下山のツイートの画像にあるとこが入山の受付になっており、そこで制限時間を伝えられた。

ひたすら石段を登る。

五大堂に到着。水墨画の世界とか言われているようだが、実際そんな感じで、非常に綺麗だった。

f:id:potaxyz:20220310184724j:plain
五大堂からの眺望

奥之院に到達。雪に埋まっていた。

f:id:potaxyz:20220310184828j:plain
奥之院

少し横道にそれて三重小塔をみる。洞穴の中に塔があるというのは不思議な感じだ。

f:id:potaxyz:20220310184958j:plain
三重小塔

もう一度五大堂行ってもよかったけど、まあ降りるか、ということで下山。

猿ゥ!

f:id:potaxyz:20220310185349j:plain

駅から往復所要時間130分とか書いてあったけど一般人向けなのだろう。異常旅行者であれば90分程度で完了でき、そこまでかからないと思う。が、どうせ電車は1時間に1本しか来ないので急ぐ必要もない。

雪靴はちゃんと履きましょう。

山寺駅みどりの窓口仙台まるごとパスを購入。今日明日はこれだけでJRも地下鉄も、そして一部バスも使えて動き回れる。

電車に乗り仙台駅に到着。

ホテルにチェックインを済ませ、荷物を置いて牛タンの店へ。

めちゃウマで幸せになった。また来たいし、他の牛タンのお店とも比べてみたいと思った。ちなみに、サカナクションの山口一郎のサインが置いてあったりとかして、芸能人にも人気のようだった。

地下鉄南北線東西線(東側)の乗り潰しを敢行。

ホテルに戻る。寝る前に蔵王で買っていた稲花餅を食べておこう。

おやすみなさい。

3/5(土)

おはようございます。10時にチェックアウト。

次の電車まで時間があったので、地下鉄東西線の残り西側の乗り潰しをした。ら、逆に時間がなくなってしまった。

ずんだシェイクを購入。実は大阪梅田でも購入できる。

あおば通駅から松島海岸へ。

導線を全く考えていなかったので駅でパンフレットかなんかもらう気だったが、置いてなかった(僕が見つけられなかっただけ?事前情報としては、島がいくつかあって、遊覧船があって、お寺があって、カキが美味しい)。

駅を出ると遊覧船のチケット売り場があるが、ネット予約をすると安くなった気がしたのでスルーし、とりあえず瑞巌寺へ。

中の金箔の屏風絵が良かった。一応宝物館にも入ったが、歴史に詳しくなさすぎて流し見で終わってしまった。

お隣の円通院へ。こういう庭園が楽しいところは好きです。ここも小堀遠州作庭なのか...

こうやって散策している間にスマホで遊覧船乗船券を予約。遊覧船乗船券売り場へ。ネット予約のおかげで1000円のところ900円で購入できた(仁王丸就航記念でそもそも1500円が1000円になってるのにさらに割引されるとは...)。

お昼ご飯に焼き牡蠣を食べる。当然美味しい。

遊覧船に乗る。いっぱい島があるんだなあ。

f:id:potaxyz:20220310191649j:plain
しまのひとつ

戻ってきた。

松島博物館に立ち寄った。この日は松島海岸駅のバリアフリー化記念で入場無料になっていた。

展示物を見てそうなんだ〜と薄い感想を抱きつつ、目的の雄島を散策。

f:id:potaxyz:20220310191922j:plain
雄島

道の途中で東日本大震災津波がこの高さまで来ましたみたいなステッカーを見たりとか、津波を意識したような看板が多く見かけられたのも、この地方ならではだなと思ったりした。

福浦島へ。こちらも松島海岸駅のバリアフリー化記念で橋の通行料が無料になっていた。

島内を散策。

松島海岸駅へ戻り、仙台方面に帰る。

時間調整も兼ねて東北大学の見学と、ついでに仙台第二高等学校(大学の友人の出身校)も見学。

仙台駅に戻る。この日は東北大の友人に泊めてもらうことになっており、夕食も一緒に食べようとのことで、待ち合わせ。久しぶりに会ったが変わっていなかった。

せり鍋が仙台名物らしい、ということで、何件か回るがどこも満席...しょうがないので(?)キャッチに頼る。あんまりキャッチにいいイメージがないが、悪くない値段のお店を教えてもらった。その友人によると、仙台のキャッチは優しい人が多いらしく、あの人もお世話になったし、その人もよく見る、とか言っていた。

鴨肉、せり根が美味しい。めっちゃ歓迎していただいて、毎回友人がよそってくれた。

量としては足りない(酒を入れているわけではない)ので、ラーメンを食べることに。友人オススメのお店へ。

しゃれおつ。ビールも提供しているらしい。

友人の車で仙台城址へ。友人曰く、昼行ってもなんもないから、夜来た方がいいとのこと。

友人宅へ。山形土産をあげたり、シャワー浴びたり、喋ったりして就寝。

3/6(日)

7時ごろ起床。友人はヨット部で、今日も朝から部活とのこと(昨日は海でヨットの調整をしていたらしい、今日は8時からオンラインでなんかやるとか)。準備を済ませ、お礼をして外出。お世話になりました。

大崎八幡宮へ。仙台は至る所で伊達政宗の名前を見かけるので、その影響を垣間見ることができるなあと感じた。

歩いていたら二郎系の店があって、並んでるなあって横目にみつつ、三居沢発電所へ。日本最初の水力発電所。隣に記念館みたいなのがあったが、時間の都合上みることはできなかった。

めっちゃ風強くて寒かったので退散。

朝昼兼用で何か食べるか、ってことでさっきの並んでた二郎の店に行くことにした。どうやら一昨日開店らしい。

立席スタイルの店は初めてだった。ごちそうさまでした。

店を後にし、フェリーまでのバスの時間を調べたらかなりギリギリだった。

大崎八幡宮前からバスに乗り、あおば通駅前へ。

ここで宮城県のスタバスタンプラリーを押せていなかったので、バスの中でスマホで注文しておいたコーヒーを受け取りに行く。乗り換え時間は5分もなかったが、なんとかなった。

フェリーターミナル行きのバスに乗る。バス停の名前は仙台駅前だが、JRのあおば通駅前からが出ている。そもそも地下鉄の仙台駅はJRのあおば通駅の方が近いのだが。

フェリーターミナルに到着。

チケットを受け取る。

いざ乗船、出航。

福島第一原発を視認

昼寝をしていたら、夕食バイキングの時間に。

あるやつ全部載せようとするから汚くなってしまったが...ごちそうさま。お風呂に入る。

TENET見れて良かった。

シアタールーム的なところを出ると23:30になっていた。おやすみ。

3/7(月)

おはよう。9時くらいまで寝てたから日の出は見られなかった。朝食もバイキングにしてもよかったが、少し節約しようと思い、レストランではない売店でモーニングセットを注文。

下船の準備で荷物をまとめる。

名古屋港が近づいてきた。名港トリトンをくぐる。

名古屋フェリーターミナルに到着。帰ってきちゃったなあ。

特に理由もなく平針ミスドに寄る。

京都に帰りましょう。帰りの途中でニット帽なくして凹んだ。

おしまい。

行程表(だいたい)

3/1(火)

3/2(水)

3/3(木)

3/4(金)

3/5(土)

  • JR仙石線 普通 石巻行き あおば通 11:20 - 12:00 松島海岸
  • 松島観光
    • 瑞巌寺 12:20頃
    • 円通院 12:50頃
    • 昼食 13:20頃
    • 五大堂 13:45頃
    • 松島観光遊覧船仁王丸 14:00 - 14:50
    • 観瀾亭・松島博物館 15:00頃
    • 雄島 15:30頃
    • 福浦島 16:00頃から約50分
  • JR仙石線 普通 あおば通行き 松島海岸 17:12 - 17:53 あおば通
  • 地下鉄で仙台第二高等学校、東北大学川内キャンパスの訪問
  • 仙台駅 19:00頃
  • せり鍋、ラーメン(だし廊-Nibo-)
  • 仙台城址 22:10頃

3/6(日)

3/7(月)

ハッシュ関数について(後編? + SHA-256を実装してみる)

中身に入る前に...

グループワークとしてリレーブログを続けていたら、セキュリティキャンプフォーラム2022で発表させていただけることになりました

www.ipa.go.jp

他の内容もおもしろそう2

こんな機会はなかなかないので、楽しんできたいと思います〜


例によってリレーブログの時間です*1!前の僕の記事はこれ、前回の方のブログはこちらになります。

potaxyz.hatenablog.jp

bigdrea6.hatenablog.com

今回のテーマはハッシュ、ということでハッシュ関数の1つであるSHA256を実装してみようかなと思います。

※色々あって記事の内容が前の方と被ってしまいましたが、書いてしまったのでせっかくなので投稿します

ハッシュ関数の概要

ハッシュ関数とは

ハッシュ関数とは、任意の長さの入力データ(メッセージ)を一定の手順で計算し、あらかじめ決められた固定長の出力(ハッシュ値)を得る関数です。

とくに、セキュリティのために使われるのは一方向ハッシュ関数とか、暗号学的ハッシュ関数とか言われて、(条件がゆるいものから厳しいものの順に)次の3つの暗号学的性質を持ちます。

  • 衝突困難性(衝突発見困難性):同じ出力値を生成するような2つの入力値を発見することが困難であること。すなわち、H(m1)=H(m2)となるような異なるメッセージm1とm2を探すことが困難であること。
  • 第2原像計算困難性:ある入力値と同じハッシュ値となるような別の入力を求めることが困難であること。すなわち、m1があたえられたときH(m1)=H(m2)となるようなm2(ただしm1とは異なる)を探すのが困難であること。
  • 原像計算困難性(一方向性):出力値から入力値を発見することが困難であること。すなわち、あるハッシュ値hが与えられた時、h=H(m)をみたす任意のメッセージmを探すことが困難であること。

ちなみに、ハッシュってのは、ハッシュドポテトとかのハッシュで、切り刻んでごちゃごちゃにして混ぜるみたいな意味です。

利用例

ハッシュ関数は、

  • パスワード認証
    • 平文パスワードではなく、平文のハッシュ値をシステムに保存しておき、ログインするときには入力されるたびにハッシュ値を計算してシステム内のハッシュ値と比較する)
  • ワンタイムパスワードの生成
    • S/Key方式
  • 改竄検知
  • デジタル署名
    • 送信者から送るデータDとする。受信者は、データDを受け取り、ハッシュ値[X]を計算する。また、送信者から「署名」として、暗号化されたDのハッシュ値が送られてくる。これを受信者側で復号する[Y]。XとYが等しければ署名の検証に成功したことになる

などに利用されています。

上で述べた性質から、めっっちゃ長いデータでもハッシュ関数を通してハッシュ値を得れば、短いデータにしてやることができます。大きな本体のデータそのものを扱って確認するよりも、小さい値を確認するだけで正真性(改竄などがされていないこと)を確かめることができます。

種類

ハッシュ関数にはMD5SHA-1、SHA-256など、色々な種類があります。MD5SHA-1はすでに衝突困難性が破られているため、使用は非推奨とされていますが、セキュリティが必要とされていないところでは今でも使うとかなんとかどこかで見たことがある気がします(うろ覚え)。

SHA-256

ハッシュ関数について簡単にまとめたところで、今回はSHA-256をピックアップして実装してみようと思います。

ちなみに、ここで実装するのは自分の理解を深めるという目的あってのことです。セキュリティ的にはここにあるコードを利用することはせず、SHA-256の機能を提供してくれるライブラリ等を使う方がいいです。

なお、SHA-256の簡単なしくみの概要は前回のブログを参照してください。

あと、アニメーションでわかりやすくSHA-256の仕組みを説明してくれるものもあるので、興味があれば見てみるのもいいかも。

github.com

実装

実装にはNISTの論文を参考に、他の実装されている方のものも参考にしつつ、という感じで実装しました。

使用する定数の定義

の、小数点以下32bitが格納されています。

なんでこんな定数が使われているのかはどこにも書いていないので謎です。が、私見と調べてみた感じとして、2つ理由を考えてみました。私は専門家でもなんでもないので、1つの考えとして受け取ってください!真に受けないこと!

  1. 恣意的な数を選んでバックドアを作ったりはしていないということ。
    素数平方根や立方根を用いているというのは、あまり恣意的な感じがしない。他の疑似的にランダムな数字を定数に使用してもよさそうな気がするが、それが確実にランダムであるという保証はどこにもない。他人からはすぐにはわからないが、実際には仕様を定めた人にしかわからないような脆弱性がある定数かもしれない。

  2. 素数平方根や立方根が正規数であることが(未解決だが)予想されているため。
    正規数とは、無限小数表示において数字が一様に分布しており、数字の列が現れる頻度に偏りがないという性質を持つ実数のこと(wikipedia)。素数平方根は正規数であることが予想されており、小数点以下の数字の並びが一様に分布しているとエントロピーが最大になってくれるのでうれしいのかもしれない。

羅列したところであまり意味はないと思うので、雰囲気だけコードを載せます

K = (
    0x428A2F98,
    0x71374491,
    ...,
    0xC67178F2,
) # 実際には64個の数字が格納されている
H = (
    0x6A09E667,
    0xBB67AE85,
    ...,
    0x5BE0CD19,
) # 実際には8個の数字が格納されている

使用する関数の定義

以下に使用する8つの演算を定義しておきます。なお、計算は全て$\bmod\,2^{32}$上で考えるので、それを超えてしまうことのある演算には& 0xFFFFFFFFとして、$\bmod\,2^{32}$をとるのに該当する操作をおこなっています。

def ROTR(x, n):
    return ((x >> n) | (x << (32 - n))) & 0xFFFFFFFF


def SHR(x, n):
    return x >> n


def Ch(x, y, z):
    return (x & y) ^ (~x & z)


def Maj(x, y, z):
    return (x & y) ^ (x & z) ^ (y & z)


def SIGMA0(x):
    return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)


def SIGMA1(x):
    return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)


def sigma0(x):
    return ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)


def sigma1(x):
    return ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)

padding処理

以下のようなフォーマットの512bitsの倍数の下図の赤枠にあたるデータを成形します。lbitsの長さのメッセージMとします。

f:id:potaxyz:20220228234036j:plain

仕様書にはbit単位で書いてありますが、実装にはbyte単位で考えることに注意します。つまり、下のようになります。

f:id:potaxyz:20220228234128j:plain

まず、ハッシュ関数にかけたいメッセージmessageutf-8エンコードしておきます(メッセージのbyte数を正確にはかりたいため)。

メッセージの長さをmessage_lenとしてbyte数で取得しておきます。

$56\leq (l'\,\bmod\, 64)\leq 63$ byteをみたす数 $l'$ になるとハッシュ関数に入れるデータの形に合わなくなってしまう(一番後ろに入れる元のメッセージの長さのbit数を格納できない)ので、その分1ブロック増やします。

一番後ろに元のメッセージ長のbit数を表現する8byteを入れるのですが、message_lenとして得られているのはbyte数なので、3つシフトさせてbit数表現に直しておきます。

最終的に成形して得られるデータは「元のメッセージ+区切りの0x80+0埋め0x00+元のメッセージ長のbit数を表現する8byte」となります(これをあらためてmessageとしてやります)。

今回はこのメッセージのハッシュ値を計算してみましょう。

message = "シャーっと実装するSHA256🐱"
message = message.encode("utf8")

message_len = len(message)
padding_len = 64 - 8 - 1 - message_len % 64
if message_len % 64 > 64 - 8 - 1:
    padding_len += 64
message = (
    message + b"\x80" + b"\x00" * padding_len + struct.pack("!Q", message_len << 3)
)
message_len += 1 + padding_len + 8

本処理

padding処理を行なったデータを64byteずつに分け、先頭からその64byteごとのブロックをハッシュ計算にかけていきます。上で設定していたHというのが初期ハッシュ値というやつで、それと64byteごとのブロックを順次演算させてやります。

while len(message) >= 64:
    message_block = struct.unpack("!16L", message[:64])
    H = sha256_hash_computation(message_block)
    message = message[64:]

本処理は以下のような形になっています。こうやってみると意外と単純?

def sha256_hash_computation(message_block):
    W = [0] * 64

    # 1. Prepare the message schedule, W[t]:
    W[0:16] = message_block
    for t in range(16, 64):
        W[t] = (
            sigma1(W[t - 2]) + W[t - 7] + sigma0(W[t - 15]) + W[t - 16]
        ) & 0xFFFFFFFF  # +はmod 2^32上の演算であることに注意

    # 2. Initialize the eight working variables, a-h with the (i-1)st hash value:
    a, b, c, d, e, f, g, h = H

    # 3.
    for t in range(64):
        T1 = h + SIGMA1(e) + Ch(e, f, g) + K[t] + W[t]
        T2 = SIGMA0(a) + Maj(a, b, c)
        h = g
        g = f
        f = e
        e = (d + T1) & 0xFFFFFFFF
        d = c
        c = b
        b = a
        a = (T1 + T2) & 0xFFFFFFFF

    # 4. Compute the ith intermediate hash value Hi
    return [(x + y) & 0xFFFFFFFF for x, y in zip(H, [a, b, c, d, e, f, g, h])]

結合

最後に、8つの数が入っている配列Hを結合します。

message_digest = b"".join([struct.pack("!L", i) for i in H])

これでbit表示が得られていますが、ハッシュ値の表示として16進数に直しておきます。

message_digest = message_digest.hex()

これでハッシュ値を表示してみると

print(message_digest)
43b682dc606a6321cd51a05268c60f93fe2694473d34650bfb1c093ee560f795

が得られました。他のSHA256を計算してくれるものを使うと同じ値が得られるので、正しい実装ができていそうです。

動かしてみる

google colaboratoryで作ってみました。興味がある人は中のmessageのところとか書き換えて遊んでみよう〜

おわりに

ハッシュ関数、特にSHA-256には詳しくなれた気がします!

次回はこちらです。

参考文献

[1] NISTの論文

[2] Software Design 2022年3月号|技術評論社

[3] 『暗号技術入門 第3版 秘密の国のアリス』

[4] マスタリングTCP/IP 情報セキュリティ編 | Ohmsha

これまでのリレーブログ記事まとめ

ここにリレーブログ記事の履歴を載せておきます

*1:seccampのグループワークから生まれた企画。リレーブログのルール:前の人がが次の人のテーマを決める