エクストーンの金です。 愛媛県松山市で開催されたRubyKaigi2025も盛況のうちに閉幕しましたが、今回は注目セッションについて詳報します。
You Can Save Lives With End-to-end Encryption in Ruby
Ryo Kajiwara @s01 さんの発表でしたが、
「SMTPやめろ*1」
という刺激的な導入からはじまった内容は、エンドツーエンド暗号化 (E2EE) に関する最新の取り組みを解説するものでした。
このセッションは内容的に高度、かつ英語での発表でしたが、登壇者自身による日本語注釈付きスライド*2が公開されており、非常にわかりやすいものとなっていました。
発表のキーワード
E2EE
- エンドツーエンド暗号化 (End-to-End Encryption)
- 通信の始点から終点まですべての経路上で暗号化が行われていること
- これが無いと、第三者がメッセージ傍受可能になる
MLS
- メッセージングレイヤセキュリティ (Messaging Layer Security)
- E2EEで必要となる相互運用性のある鍵交換を提供
- プロトコル定義 (RFC9420)
- アーキティクチャもそろそろRFCになりそう
HPKE
- TLSの理論的背景である「公開鍵で暗号化、秘密鍵で復号」を定義したもの
- 鍵のカプセル化
- 鍵の導出関数
- 認証つき暗号
- Rubyでは hpke というgemがある
ForwardSecurity
- メッセージ交換に使っていた長期鍵が破られても過去のメッセージは影響を受けない性質
PostCompromiseSecurity
- ForwardSecurityの逆で、現時点の鍵が破られても鍵を更新すれば将来のメッセージは影響を受けない性質
登壇者のメッセージ
本格的な解説の前に、E2EEは禁止されるべきなのか?というトピックがありました。 つまり、E2EEは犯罪やテロに悪用されるのでないか?と。
昨今でも闇バイトで秘匿メッセージ交換アプリが使われている。などの話がありますよね。 実際、世界の各地で政府機関などがこういった技術を禁止しようとしている。といった話もあります。
しかしこれに対する見解は明快で、
悪いヤツはE2EEがなくても悪いことをするから、E2EEの禁止は弱い人を不利にするだけ
でした。
ここは立場や考えによって意見が分かれる部分ですが、ソフトウェア開発、とくにOSSの界隈、そしてRubyの界隈には、自他の自由を尊重し実現するために活動したい。という願いのようなものがあるように思います。
実践
暗号化技術は、
- 理論
- 規格
- 実装
といったレイヤーに分かれると思いますが、理論や規格はあっても実装はまだ。というのはよくあることです。 この発表でも、こういった理論を踏まえて実装したらどうなるか?が興味深く語られました。
多人数での鍵交換 (MLS)
E2EE自体は古くからあり*3、1対1の通信であれば相互に公開鍵を交換して相互のメッセージを暗号化すれば実現できます。 しかし、これを多人数で行うためには多対多の鍵交換が必要になり、人数が増えれば指数関数的に難しくなります。
ここでは鍵を木構造で管理するのですが、
- Rubyにはポインタがない
- MLSには可変長整数エンコーディングを扱う可変長文字列がある
といったハードルがあり、上手にクリアするために完全二分木を配列で表す、TreeKEMを用いるといった工夫が語られました。
今後
そうして生まれた実装は melos という gem ですが、もちろんまだ発展途上にあり今後の目標やビジョンが語られました。
- MLSってクライアントサイドの仕事では?
- Rubyはサーバサイドだけじゃないよ。ruby-wasm とかもあるしね
- E2EEをやろうとすると、プラットフォームごとに依存ライブラリが違う
- プラットフォームを横断できる「大統一暗号ライブラリ」を提供できないか?と考えている
- Rubyでやらなくてもいいのでは?
- Rubyがやらなければ他の言語でもいいじゃん。となるよね?
- PythonもまだMLS実装ないらしいからむしろ今がチャンス*4
願い
セッションは最後に、なぜRubyによるE2EEの実現。という取り組みをするのか?という問いにこう述べて締めくくられました。
Ruby発展のためには自由なインターネットは欠かすことができず、 自由なインターネットも発展のためにはRubyとそのコミュニティを必要とするでしょう。
すばらしい、「考え」と「実践」に触れることのできるセッションでした。 興味のある方は、ぜひ紹介したスライド、資料、ソースコードなどに触れて、E2EEの入り口に立って未来に思いを馳せていただければと思います。