Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
高速な楕円曲線の実装
Search
ykm11
March 30, 2020
Technology
2.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
高速な楕円曲線の実装
ラボユース第9期
ykm11
March 30, 2020
More Decks by ykm11
See All by ykm11
ChipWhispererを使ってマイコンの消費電力を測定してみる
ykm11
0
180
Other Decks in Technology
See All in Technology
大型犬好きによるPugの紹介
yamanoku
1
150
事業活動を AI Ready にする攻めと守りのデータエンジニアリング / data-engineering-for-ai-ready-business
pei0804
7
2.7k
不可逆な意思決定を避けながら10億超の顧客データを AI Ready にするデータ基盤設計
baseballyama
1
310
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
150
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
1
330
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
260
使いこなすために知っておきたい Azure SRE Agent アンチパターン
torumakabe
2
500
Cognition AI Japan - ウェビナー2_テストQA_運用監視
cogakira
0
140
Deep Data Security 機能解説
oracle4engineer
PRO
2
800
[JAWS-UG彩の国埼玉#12]そろそろ準備する?re:Invent2026をやさしく解説 / reinvent2026-sainokuni
sh_fk2
1
210
UniFi(ユニファイ)AIカメラの現場活用
ludicmind
1
430
Featured
See All Featured
A designer walks into a library…
pauljervisheath
211
25k
For a Future-Friendly Web
brad_frost
184
10k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Abbi's Birthday
coloredviolet
4
10k
Believing is Seeing
oripsolob
1
240
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
330
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
560
Color Theory Basics | Prateek | Gurzu
gurzu
1
490
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
360
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
590
Faster Mobile Websites
deanohume
310
32k
Transcript
ߴͳପԁۂઢͷ࣮ ฏా ྒྷ 2020.03.30 αΠϘζɾϥϘϢʔεୈ 9 ظ Ռใࠂձ 1
ࣗݾհ • ฏా ྒྷ • ϥϘϢʔεୈ 9 ظੜ • ిؾ௨৴େֶ
3 • GitHub: ykm11 • Twitter: @ykm kn • झຯιϩπʔϦϯά 2
αΠϘζɾϥϘϢʔε ୈ 9 ظ • ༰ • ։ൃςʔϚ: C/C++ʹΑΔιϑτΣΞ։ൃ •
ϝϯλʔ: ޫ࣎ੜ͞Μ • ߴͳପԁۂઢΛ࣮ʢ& C++ͷษڧʣ • ಛఆͷପԁۂઢʹݶΒΕΔ͕͔ͳΓͷΛୡ • ҙਫ਼ʹରԠʢগ͠མͪΔʣ Ռ - https://github.com/ykm11/lab-youth/tree/master/ellipticCurve 3
࣍ • ପԁۂઢͱ • ߴԽ࣮ͷಓ • ΞϑΟϯ࠲ඪ͔ΒࣹӨ࠲ඪ • Πϯελϯεੜ, ԋࢉճͷݮ
• ಈతϝϞϦ֬อͷఫഇ • εΧϥʔഒࢉΞϧΰϦζϜ • ͞ΒͳΔߴԽ • ͲΕ͚ͩ͘ͳ͔ͬͨ 4
ପԁۂઢͱ ମ K ্Ͱఆٛ͞ΕΔପԁۂઢ E/K , E/K := {(x, y)
∈ K2 | y2 = x3 + ax + b} ∪ {O} a, b ∈ K P, Q ∈ E/K ʹ͠ࢉ + Λఆٛ͢Δͱ (E/K, +) Ճ๏܈ʹͳΔ P = (x1, y1), Q = (x2, y2) ∈ E/K ͷ͠ࢉ P + Q (x1, y1) + (x2, y2) =: (x3, y3) x3 = m2 − x1 − x2 y3 = m(x1 − x3) − y1 m = y2−y1 x2−x1 (P ̸= Q) 3x2 1 +a 2y1 (P = Q) ҉߸Ͱɺఆٛମ K ඪ͕ 2,3 Ͱͳ͍༗ݶମ͕Α͘ΘΕΔ 5
ߴԽ࣮ͷಓ Πϯτϩ ඪ • P ͷεΧϥʔഒ [k]P = P
+ P + .. + P Λ͍ͨ͘͠ • Α͍ΞϧΰϦζϜΛ͏ • ͠ࢉ, 2 ഒࢉΛ͘͢Δ • ֤छΞϧΰϦζϜ͠ࢉ, 2 ഒࢉͷΈ߹ΘͤͳͷͰɺ ͪ͜ΒΛ͘͢ΕεΧϥʔഒ͘ͳΔ 6
ߴԽ࣮ͷಓ ΞϑΟϯ࠲ඪ͔ΒࣹӨ࠲ඪ ΞϑΟϯ࠲ඪͰ࣮͢Δͱ͖ʹࠔΔ͜ͱ • ୯Ґݩʢແݶԕʣͷѻ͍ Ϋϥεͷϝϯόมʹ bool isInf ΛͨͤΔʁ •
͖ΛٻΊΔͱ͖ʹআࢉ͕ൃੜ • ֦ுϢʔΫϦουͷΞϧΰϦζϜΛ͏͔ɺ • p-2 ͢Δ͜ͱʹΑͬͯٯݩΛಘΔʢFermat ͷখఆཧΑΓ ܭࢉͷίετʁ ࣹӨ࠲ඪͰ࣮͢Δ͜ͱʹΑΓɺ্ͷΛղܾ 7
ߴԽ࣮ͷಓ ΞϑΟϯ࠲ඪ͔ΒࣹӨ࠲ඪ ࣹӨ࠲ඪͷݫີͳఆٛͳͲޫ͞Μͷஶॻ 1 K2 ϕ −→ P ∈
∈ (x, y) −→ (x : y : 1) (X/Z, Y /Z) ϕ−1 −→ (X : Y : Z) • ఆٛํఔࣜ y2 = x3 + ax + b ͔Β Y 2Z = X3 + aXZ2 + bZ3 ʹ • ୯Ґݩ (0 : 1 : 0) 1https://herumi.github.io/ango/ 8
ߴԽ࣮ͷಓ ΞϑΟϯ࠲ඪ͔ΒࣹӨ࠲ඪ (X1 : Y1 : Z1) + (X2 :
Y2 : Z2) =: (X3 : Y3 : Z3) ͷެࣜ ಋग़লུ͠·͢ • (X1 : Y1 : Z1) ̸= (X2 : Y2 : Z2) u := Y2Z1 − Y1Z2, v := X2Z1 − X1Z2, w := u2Z1Z2 − v3 − 2v2X1Z2, X3 := vw, Y3 := u(v2X1Z2 − w) − v3Y1Z2, Z3 := v3Z1Z2 • (X : Y : Z) ͷ̎ഒެࣜ u := 3X2 + aZ2, v := YZ, w := u2 − 8XYv, X3 := 2vw, Y3 := u(4XYv − w) − 8(Yv)2, Z3 := 8v3 9
ߴԽ࣮ͷಓ ΞϑΟϯ࠲ඪ͔ΒࣹӨ࠲ඪ ࣹӨ࠲ඪͷ࠾༻ʹΑΓ • Z ͷͰ୯Ґݩ͔Ͳ͏͔ΛผͰ͖Δ • আࢉ͕ແ͘ͳͬͨ • ࢉ͕૿͑Δ͕ɺআࢉʹൺΔͱ͔ͳΓ҆Ձ
Table 1: ίετൺֱ Ճࢉ P + Q 2 ഒࢉ (2P) ΞϑΟϯ࠲ඪ 3M + I 4M + I ࣹӨ࠲ඪ 14M 12M M ༗ݶମͷࢉ, I ٯݩͷܭࢉ 10
Πϯελϯεੜ, ԋࢉճͷݮ • ՃࢉͰ 14 ճͷ༗ݶମͷࢉ u := Y2Z1 −
Y1Z2, v := X2Z1 − X1Z2, w := u2Z1Z2 − v3 − 2v2X1Z2, X3 := vw, Y3 := u(v2X1Z2 − w) − v3Y1Z2, Z3 := v3Z1Z2 • ͬͱ͋Γͦ͏ʢʹݟ͑Δʣ • ಉ͡ܭࢉΛ͠ͳ͍ • ͔ͭɺ༗ݶମΠϯελϯεͷੜΛ࠷খݶʹ 11
Πϯελϯεੜ, ԋࢉճͷݮ • ՃࢉͰ 14 ճͷ༗ݶମͷࢉ u := Y2Z1 −
Y1Z2, v := X2Z1 − X1Z2, w := u2Z1Z2 − v3 − 2v2X1Z2, X3 := vw, Y3 := u(v2X1Z2 − w) − v3Y1Z2, Z3 := v3Z1Z2 • ͬͱ͋Γͦ͏ʢʹݟ͑Δʣ • ಉ͡ܭࢉΛ͠ͳ͍ • ͔ͭɺ༗ݶମΠϯελϯεͷੜΛ࠷খݶʹ 12
Πϯελϯεੜ, ԋࢉճͷݮ • Ұ࣌มΛੜ͠ͳ͍ʢมͯ͢ Fp ͷΠϯελϯεʣ x = y *
z - v * w; • վྑ mul(x, y, z); // x = y * z; mul(t, v, w); // t = v * w; sub(x, x, t); // x = x - t; • “% modulus” Λଟ༻͠ͳ͍ • Fp ͷݩͷՃࢉͷ࠷େ 2p − 2 • ݮࢉͷ࠷খ −p + 1 • Ճݮࢉͷ߹ɺԋࢉ݁Ռʹରͯ͠దٓ modulus Λ ͔͢Ҿ͔͘ͰΑ͍ 13
ಈతϝϞϦ֬อͷఫഇ • GMP mpz class malloc ͰಈతʹϝϞϦΛ֬อ͢Δ -
ಈతϝϞϦ֬อ͕ϘτϧωοΫ ରࡦ • ಈతϝϞϦ֬อΛ͠ͳ͍ - ϝϞϦཧΛࣗͰߦ͏ - mpz class Λྻʹஔ͖͍͑ͯ͘ - mpn ͕ؔ͋ΔͷͰଟഒͷ࢛ଇԋࢉΘΓͱ͔Μͨ Μʹॻ͚Δ 14
ߴԽ࣮ͷಓ Πϯτϩʢ࠶ܝʣ ඪ • P ͷεΧϥʔഒ [k]P = P
+ P + .. + P Λ͍ͨ͘͠ • Α͍ΞϧΰϦζϜΛ͏ • ͠ࢉ, 2 ഒࢉΛ͘͢Δ • ֤छΞϧΰϦζϜ͠ࢉ, 2 ഒࢉͷΈ߹ΘͤͳͷͰɺ ͪ͜ΒΛ͘͢ΕεΧϥʔഒ͘ͳΔ 15
εΧϥʔഒࢉΞϧΰϦζϜ ࣮ͨ͠ͷ • ӈ͖, ࠨ͖όΠφϦ๏ • sliding window method •
window NAF method ͋ΔପԁۂઢʹͷΈదԠͰ͖ΔΞϧΰϦζϜ͋Δ • GLV for secp256k1 ௨ৗͷεΧϥʔഒࢉΑΓ͓͓Αͦ 1.5 ഒఔߴ 16
͞ΒͳΔߴԽ • ϠίϏ࠲ඪΛར༻ • ࣹӨ࠲ඪΑΓ 2 ഒࢉͷίετ͕খ͍͞ • 2 ഒࢉΛΑ͘͏ͱ͖ʹ༗ޮ
• ߴͳଟഒԋࢉΛ࣮͢Δ • GMP mpn ͱ͍ͯ • ΞηϯϒϦϨϕϧͰ࠷దԽΛؤுΔ 17
ͲΕ͚ͩ͘ͳ͔ͬͨ • Golang ͷପԁۂઢ࣮ 2, sage-8.83 ͱΛൺֱ • ࣮ߦڥ OS:
Ubuntu 18.04 (on Mac) CPU: i7-8850H 2.60GHz compiler: gcc-9.2.1 -O3 (for C++) 2https://github.com/ykm11/goCurve 3Python Ͱ࣮ߦͰ͖ΔΦʔϓϯιʔεͳֶιϑτΣΞ 18
ͲΕ͚ͩ͘ͳ͔ͬͨ secp256k1 ͷύϥϝʔλΛͬͯܭଌ Table 2: ൺֱʢ୯Ґ usecʣ add dbl sage
19.88 24.68 GolangʢΞϑΟϯ࠲ඪʣ 5.670 6.374 C++ʢࣹӨ࠲ඪʣ 1.432 1.421 C++ʢϠίϏ࠲ඪʣ 1.440 1.002 19
ͲΕ͚ͩ͘ͳ͔ͬͨ εΧϥʔഒʹ͍ͭͯܭଌͯ͠ΈΔ ύϥϝʔλ secp256k1 Table 3: ΞϧΰϦζϜͷൺֱʢ୯Ґ usecʣ ࣹӨ࠲ඪ ϠίϏ࠲ඪ
ࠨ͖όΠφϦ๏ 527.17 421.00 ӈ͖όΠφϦ๏ 519.92 409.11 Sliding Window Method (size 2) 498.19 403.97 NAF (size 4) 484.88 360.63 GLV (NAF) 320.94 N/A 20
·ͱΊ • ߴʹಈ࡞͢ΔପԁۂઢΛ C++Ͱ࣮ͨ͠ • ͷ͠ࢉΛ͘͢ΔͱεΧϥʔഒ͕͘ͳΔ • ༗ݶମͷ࢛ଇԋࢉΛ͘͢Δͱͷ͠ࢉ͕͘ͳΔ • ར༻ՄೳͳପԁۂઢΛ૿͠ɺҙਫ਼Ͱ͕ग़ΔΑ͏
ʹ͍ͨ͠ 21