Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rustで楕円曲線暗号の署名アルゴリズムをフルスクラッチ実装してみた話
Search
Yuto Takamune
December 28, 2022
2.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rustで楕円曲線暗号の署名アルゴリズムをフルスクラッチ実装してみた話
Yuto Takamune
December 28, 2022
More Decks by Yuto Takamune
See All by Yuto Takamune
GPT-3.5 Turbo をファインチューニングして自分のクローンを作った話
shinbunbun_
1
380
RustのLINEBot SDKを自作した話
shinbunbun_
0
2.4k
セキュリティキャンプ2023 Y3分散合意ゼミ 最終発表
shinbunbun_
0
4.9k
NixOSでもご自宅k8sがしたい!
shinbunbun_
2
4.9k
カーネルレベルでTwitterを禁止しよう
shinbunbun_
0
310
CRDTで始めるコンフリクトしないデータ同期
shinbunbun_
0
670
Haskell初心者がHaskellの楽しさについて語る
shinbunbun_
0
230
IEEE802.1X認証を導入してみた
shinbunbun_
0
330
UBICの食材管理APIを作った話
shinbunbun_
0
260
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
67k
The agentic SEO stack - context over prompts
schlessera
0
820
Automating Front-end Workflow
addyosmani
1370
210k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
240
Claude Code のすすめ
schroneko
67
230k
Paper Plane (Part 1)
katiecoart
PRO
0
9.2k
New Earth Scene 8
popppiees
3
2.4k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Transcript
Rustで楕円曲線暗号の署名アルゴ リズムをフルスクラッチ実装してみた 話 しんぶんぶん
しんぶんぶんです
@shinbunbun_
https://shinbunbun.info
しんぶんぶん基本情報 • 会津大学学部二年 • 普段はフロントエンドとかバックエンドとかインフラまわりとか認証 とかiOSアプリとかAndroidアプリを開発してる
インターン歴 • 2022/09~2022/11 株式会社アンドパッド インターンシップ • 2022/03~2022/06 ピクシブ株式会社 長期インターンシップ(インフラ部SAチーム) •
2022/02~2022/03 株式会社ゆめみ インターンシップ(Rustを使ったWebアプリケーション開発) • 2021/08 ヤフー株式会社 インターンシップ(認証・アクセス制御に関するプロダクト開発) • 2021/07~2022/03 株式会社 dott 福島県新型コロナウイルス対策サイト保守業務 • 2021/01~2021/05 LasTrust株式会社 インターンシップ(R&D) • 2018/12~2019/12 株式会社 Nature Innovation Group(アイカサ) バックエンド開発
ハッカソン!!!! • 2021/11/07 わたしたちのウェルビーイングのためのハッカソン 2021 富士通 つながる 豊かさ賞 • 2021/10/09
Civictech Challenge Cup[U-22] 2021 Code for Japan賞 • 2021/02/28 Epson Hack Trek 2021 優勝 • 2020/05/24 レッドハッカソン オンライン 2020 奨励賞 • 2018/09/02 LINE BOOT AWARDS×サイボウズ ビジネス/ワーク部門賞狙いのハッカ ソン LINE賞・サイボウズ賞
HONDAI
みなさん、普段楕円曲線暗号使ってますよね??
やはり普段使っているものの仕組みは知っ ておくべき
今回実装したもの • secp256k1という楕円曲線とECDSAという署名アルゴリズムを使った 電子署名CLIアプリケーション • それに必要な有限体と楕円曲線ライブラリ • リポジトリ: shinbunbun/secp256k1-rust •
参考: プログラミング・ビットコイン - O'Reilly Japan
楕円曲線暗号とは • 有限体上の楕円曲線を用いた暗号 • スカラー倍算の逆が困難であることが安全性の根拠になっている ◦ Y=xG(Gは生成点)のxを計算すること ◦ 楕円曲線上の離散対数問題(ECDLP)
有限体とは • 別名: ガロア体 • 以下の定義を満たす有限集合 • モジュロ演算を使うことで比較的簡単に作れる
実装してみよう!
まずは有限体ライブラリ
有限体の定義 • num: 値 • prime: 位数(集合の大きさ)
四則演算を実装 • 任意の多倍長整数ライブ ラリなどに対応できるよ う、全てジェネリクスで実 装 • Traitを使って演算子オー バーロード •
トレイト境界無限型パズ ル😇
冪乗を実装 • 繰り返し二乗法を使って高速化 &オーバーフローを防止 • トレイト境界が大変なことになっ てる...
こんな感じで使えます • ジェネリクスのおかげでi32でも多倍長整数でも使える
外部crateを極力使わない • stdとnum_traits以外未使用 • これならフルスクラッチを謳っても怒られないはずw
次は楕円曲線ライブラリ
Point • 楕円曲線上の点の座 標と(x, y)、曲線のパラ メータ(a, b)をフィール ドに持っている • ジェネリクスで実装す
るためPhantomData を使用
点の加算 • 以下の場合分けをして計算 ◦ 加法単位元との加算 ◦ 加法逆元との加算 ◦ 異なる点同士の加算 ◦
同じ点同士の加算 • もちろん違う曲線の点同士は計 算不可
スカラー倍算 • 点の加算が定義され、 点の加算に結合性があ ることからスカラー倍算 が可能 • スカラー倍算を繰り返す と無限遠点に至る(有限 巡回群)
• 2進展開を用いて O(log_2n)で実装できる
こんな感じで使える • Pointはジェネリクスで 実装しているので、 FieldElement(有限体 上の値)をフィールド に持てる
スカラー倍算 • スカラー倍算もジェネリクスなので多倍長整数が使える
SignatureのTrait
ECDSAのTrait
外部クレートを極力使わない こちらもstdとnum_traits以外未使用
いよいよsecp256k1の実装
Secp256k1 • フィールドはprivate_keyとpublic_key • 多倍長整数ライブラリに依存する実装が多いのでジェネリクスは未使 用 • public_keyは多倍長整数を型パラメータに受け取ったFieldElement で、private_keyは多倍長整数
鍵生成 • 意外と単純で、秘密鍵はsecretとなる文字列をsha256でhashとって多 倍長整数に変換するだけ • 公開鍵は秘密鍵に楕円曲線の生成点をスカラー倍算したものになる
None
None
ECDSAのDeterministicな使用 • RFC6979で定義されている • デジタル署名生成の際に使用するnonceを、乱数ではなく署名と鍵か ら一意に生成される値にする • HMAC(メッセージ認証コード)の生成を何回も繰り返す感じ • 詳しくはRFC読んでください!!
None
こんな感じで使える
完成形を動かしてみよう!!
感想 • トレイト境界が無限型パズル編だった • 楕円曲線暗号の仕組みがちょっとだけ理解できたので、やっぱりフルス クラッチは正義
今後の展望 • 今回は署名だけだったので、 楕円曲線ElGamal暗号を実装して暗号 化にも対応させたい • ライフタイム怖くて無限に.clone()してしまったので、ちゃんと参照で渡し てパフォーマンス上げていきたい