SlideShare a Scribd company logo
1 of 20
Download to read offline
汎用性と高速性を目指した
ペアリング暗号ライブラリ mcl
SCIS 2017
サイボウズ・ラボ株式会社
光成滋生
• ペアリング
• ベンチマーク
• mclの設計
• ベンチマーク詳細
• まとめ
概要
2 / 20
• 巡回群𝐺1, 𝐺2, 𝐺 𝑇に対する双線形写像𝑒: 𝐺1 × 𝐺2 → 𝐺 𝑇
• 𝑒 𝑎𝑃, 𝑏𝑄 = 𝑒 𝑃, 𝑄 𝑎𝑏 for 𝑎, 𝑏 ∈ ℤ
• それぞれの群の離散対数問題が困難
• IDベース暗号、属性ベース暗号、内積暗号などの応用
• ブロックチェーン関係でも注目されている
• Zcash ; 完全匿名可能な分散型暗号通貨
• ゼロ知識証明プロトコルzk-SNARKを利用
• DFINITY ; decentralized world compute cloud
• 検証可能な秘密分散機能を持つBLS署名を利用
ペアリング
3 / 20
• 𝐹𝑝上の楕円曲線 𝐸 ∶ 𝑦2 = 𝑥3 + 𝑏
• 𝑝 = 36𝑧4 + 36𝑧3 + 24𝑧2 + 6𝑧 + 1, 𝑛 = 𝑝 + 1 − (6𝑧2 + 1)
• 𝐺1 = 𝐸 𝐹𝑝 𝑛
• 𝐺2 = 𝜓−1(𝐸 𝑛 ∩ Ker 𝜋 𝑝 − 𝑝 ) where 𝜓: 𝐸′ → 𝐸 ; twist
• 𝐺 𝑇 ; 𝐹 𝑝12の1の𝑛乗根の部分群
• 𝑒: 𝐺2 × 𝐺1 → 𝐺 𝑇
• 特徴
• 𝑝が256bit程度なら100bitのセキュリティ
• さまざまな高速アルゴリズム、実装が提案されている
BN曲線上のoptimal Ateペアリング
4 / 20
• ベンチマーク(単位 : msec)
• x64/x86 ; Inte Core i7-6700 3.4GHz(Skylake)
• ARM ; 900MHz quad-core ARM Cortex-A7 on Raspberry Pi2
• ARM64 ; 1.2GHz ARM Cortex-A53 on HiKey
• 問題点
• 高速なものは特定のCPU専用
• 汎用的なものは速くない
既存実装
software x64 x86 ARM ARM64
ate-pairing 0.21 - - -
NEON - - 16 -
RELIC 0.30 3.5 36 -
TEPLA 1.76 3.7 37 17.9
5 / 20
• 汎用性と高速性を目指したペアリングライブラリ
• https://github.com/herumi/mcl/
• x86/x64, ARM, ARM64 Linux, Windows, macOS対応
• LLVMがサポートするアーキテクチャで動作(するはず)
• ベンチマーク(単位 : msec)
• 詳細はhttps://github.com/herumi/mcl/#benchmark
mcl
software x64 x86 ARM ARM64
ate-pairing 0.21 - - -
NEON - - 16 -
RELIC 0.30 3.5 36 -
TEPLA 1.76 3.7 37 17.9
mcl 0.31 1.6 22.6 4.0
6 / 20
• メモリの動的確保をしない
• C++ templateによる使いやすいクラス
• Montogomery乗算などをLLVM bitcodeを用いて記述
• bitcodeは独自DSL on C++から自動生成
mclの設計
7 / 20
• 素体クラスFpの元(インスタンス)のメモリ配置
• ヒープ方式(GMPのmpz_class, TEPLAなど)
• インスタンスごとにメモリを確保し不要になったら解放する
• データサイズを自由に変更可能
• メモリ操作のオーバーヘッド
• 内包方式
• インスタンスにデータを保持する
• メモリ操作が不要
• データサイズは固定
• mclは内包方式を採用
メモリの動的確保をしない
256bit
データ
ポインタ サイズ
メモリ確保
インスタンス
インスタンス
256bit
データ
8 / 20
• 演算子オーバーロード
• Fpの元x, yに対してx + y, x *= yなどの表記を使いたい
• 問題点
• ‘x + y’にはpが明示されないが計算にはpの値が必要
• なんらかの方法でpを参照しなければならない
使いやすく高速な素体クラスFp
9 / 20
• 各元がpへのポインタを保持する(TEPLA)
• ポインタの分だけインスタンスサイズが増える
• クラス固定にする(mcl)
• コンパイル時に確定
• 各インスタンスはpへのポインタを保持しない
pの参照方法(1/2)
p
ポインタ
z
ポインタ
y
ポインタ
x
zyx
p
10 / 20
• ペアリング演算には複数の素体が登場する
• 楕円曲線の定義体𝐹𝑝, 巡回群の位数を扱う𝐹𝑟など
• 問題点
• pの参照方法をクラス固定すると決定すると
素体は一つしか扱えない?
• 解決方法
• 素体をC++のtemplate classとしタグによる区別を行う
• インスタンスサイズをふやさずに複数の素体を共存可能
複数の素体の共存
zyx
p r
Fpの元 Frの元
11 / 20
• pへの参照はコンパイル時に解決
• 実行時の参照オーバーヘッドが少ない
• 複数の素体同士の計算はコンパイル時にエラー
• TEPLAでは素体は全て同じElementクラス
• 異なる素体の元を間違えて演算しても分からない
タグディスパッチによる実装の利点
struct FpTag; // 空定義でよい
struct FrTag;
typedef FpT<fpTag> Fp;
typedef FpT<frTag> Fr; // 好きなだけ定義できる
Fp x, y;
Fr z;
x += y;
z *= z;
x += z; // コンパイルエラー
12 / 20
• 素体クラスの演算性能はペアリングの演算性能に直結
• 高速なものが望ましい
• 標準C/C++では高速なコードは記述できない
• アセンブリ言語を使用する
• 特定のCPU・OSに依存しやすくなる
• LLVM
• プログラム言語開発に使われるコンパイラやツールチェイン
の開発基盤
• 独自の仮想機械とその表現(bitcode)を持つ
• 多様なCPUの専用命令への変換機能を持つ
• x86/x64/ARM/ARM64/MIPS/MIPS64/PowerPC/, ...
• LLVMのbitcodeを用いて素体クラスの演算を実装
LLVMを用いた素体クラスの演算実装
13 / 20
• LLVM bitcodeによる実装
• llcを用いて各CPU専用のアセンブリコードを得る
• この程度の簡単な関数はほぼ最速のコードが生成される
(例)192bit加算関数
define void @add(i192* %pz,i192* %px,i192* %py)
{
%x = load i192, i192* %px
%y = load i192, i192* %py
%z = add i192 %x, %y
store i192 %z, i192* %pz
ret void
}
関数定義 関数名 192bitレジスタへのポインタ引数
192bitレジスタへの
読み込み
192bit整数加算
192bit整数の書き込み
14 / 20
• 素体クラス演算の実装方針
• 標数のサイズごとに専用演算関数を実装
• 固定長サイズになり高速化しやすい
• Montgomery乗算は32bitと64bitとそれぞれに必要
• 問題点
• よく似た関数のLLVM bitcodeを多数実装しなければならない
• その他のLLVMのテクニカルな問題
• LLVMは静的単一代入(SSA)なので多数の変数が必要
• 全ての変数名に型が必要なため記述が煩雑
素体クラス演算のLLVM bitcode実装
15 / 20
• 素体クラス演算のDSL / C++からLLVM bitcodeを生成
• 一つのDSLを記述するだけでよいので開発効率が向上
LLVM bitcodeを出力するDSLの開発
DSLで
Fp:mulを記述
64bit CPU用mul256
64bit CPU用mul320
32bit CPU用mul256
...
mul256-x64
mul256-ARM64
mul256-ARM
mul256-x86
for (uint32_t i = 1; i < N; i++) {
y = loadN(py, 1, i);
xy = call(mulPvM[bit], px, y);
t = add(t, xy);
if (i < N - 1) {
storeN(trunc(t, unit), pz, i);
...
16 / 20
• x64環境(Skylake)
• GMP ; メモリ確保を伴わないmpn_系関数を用いた
• Xbyak ; ate-pairingの最速実装で使われているサブルーチン
• 単位 : clock cycle
• mul ; 256bit Montgomery乗算
• mulPre ; 256bit x 256bit → 512bit乗算
• red ; 512bit → 256bit Montgomery reduction
• LLVM版mulはGMPの3倍程度, Xbyak版の90%程度の性能
LLVMの性能評価(1/3)
演算 add sub mul mulPre red
GMP 22.3 18.8 190.2 44.2 108.6
LLVM 8.6 7.7 63.1(x3.0) 27.6 48.2
Xbyak 9.4 9.4 56.6(x3.4) 24.8 41.9
17 / 20
• x86/ARM/ARM64環境の違い
• ARM64環境はmulがGMPの2倍程度
• x86環境は1.3倍程度, ARM環境はほとんど変わらない
• 32bit環境で256bit乗算は固定長演算の利点が相対的に低い
• LLVMはレジスタあふれの扱いが弱い
LLVMの性能評価(2/3)
CPU 演算 add sub mul mulPre red
ARM64 GMP 74.0 71.5 597.2 269.5 353.9
LLVM 42.6 44.9 300.6(x1.99) 172.2 185.2
x86 GMP 54.0 29.7 744.8 153.7 415.8
LLVM 29.0 23.8 553.4(x1.35) 229.1 316.7
ARM GMP 157 89 2054 749 1260
LLVM 143 105 2103(x0.98) 747 1244
18 / 20
• x64環境におけるビット長の違い
LLVMの性能評価(3/3)
ビット長 関数 mulPre red mul
256 GMP 42.75 114.76 191.65
LLVM 27.59 47.00 64.36(x2.98)
320 GMP 61.55 150.85 265.69
LLVM 45.18 69.93 88.97(x2.98)
384 GMP 78.59 192.57 355.33
LLVM 62.06 91.17 128.57(x2.76)
448 GMP 104.89 237.21 453.02
LLVM 82.63 130.96 179.41(x2.52)
512 GMP 130.33 286.51 554.50
LLVM 149.13 202.89 313.51(x1.77)
19 / 20
• 汎用性と高速性を目指した
ペアリングライブラリmclを開発した
• x86/x64/ARM/ARM64, Linux, Windows, macOS対応
• 64bit環境でTEPLAの4~5倍、32bit環境で1.4~1.6倍の性能
• x64, ARM版の既存最速実装の67~70%の性能を達成
• 今後の課題
• 実アプリケーションに向けた使いやすいAPI, ドキュメント
• よりセキュリティビットの高いペアリングの実装
まとめと今後の課題
20 / 20

More Related Content

What's hot

ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)
ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)
ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)MITSUNARI Shigeo
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015CODE BLUE
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みMasahiro Sakai
 
範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコルMITSUNARI Shigeo
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装MITSUNARI Shigeo
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿MITSUNARI Shigeo
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門Toru Matsuoka
 
Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)Shohei Taniguchi
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Yusuke Fujimoto
 

What's hot (20)

暗認本読書会4
暗認本読書会4暗認本読書会4
暗認本読書会4
 
ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)
ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)
ペアリングベースの効率的なレベル2準同型暗号(SCIS2018)
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
暗認本読書会12
暗認本読書会12暗認本読書会12
暗認本読書会12
 
範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル
 
WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装WebAssembly向け多倍長演算の実装
WebAssembly向け多倍長演算の実装
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
π計算
π計算π計算
π計算
 
CuPy解説
CuPy解説CuPy解説
CuPy解説
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門
 
Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)Control as Inference (強化学習とベイズ統計)
Control as Inference (強化学習とベイズ統計)
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
集約署名
集約署名集約署名
集約署名
 
Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化Tensor コアを使った PyTorch の高速化
Tensor コアを使った PyTorch の高速化
 
暗認本読書会6
暗認本読書会6暗認本読書会6
暗認本読書会6
 

Viewers also liked

GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなしMITSUNARI Shigeo
 
Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方MITSUNARI Shigeo
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 
『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2MITSUNARI Shigeo
 
『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会MITSUNARI Shigeo
 
バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案MITSUNARI Shigeo
 
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みDeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みToshiharu Sugiyama
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながりMITSUNARI Shigeo
 
スマートフォンゲームのチート事情
スマートフォンゲームのチート事情スマートフォンゲームのチート事情
スマートフォンゲームのチート事情直生 亀山
 
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化MITSUNARI Shigeo
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptotrmr
 
一般的なチートの手法と対策について
一般的なチートの手法と対策について一般的なチートの手法と対策について
一般的なチートの手法と対策について優介 黒河
 

Viewers also liked (20)

GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
 
Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2
 
From IA-32 to avx-512
From IA-32 to avx-512From IA-32 to avx-512
From IA-32 to avx-512
 
『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会
 
バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案
 
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組みDeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
DeNA_Techcon2017_DeNAでのチート・脆弱性診断への取り組み
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
 
Slide dist
Slide distSlide dist
Slide dist
 
スマートフォンゲームのチート事情
スマートフォンゲームのチート事情スマートフォンゲームのチート事情
スマートフォンゲームのチート事情
 
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
katagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Cryptokatagaitai CTF勉強会 #5 Crypto
katagaitai CTF勉強会 #5 Crypto
 
llvm入門
llvm入門llvm入門
llvm入門
 
optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
 
一般的なチートの手法と対策について
一般的なチートの手法と対策について一般的なチートの手法と対策について
一般的なチートの手法と対策について
 

Similar to 汎用性と高速性を目指したペアリング暗号ライブラリ mcl

scheme処理系の実装
scheme処理系の実装scheme処理系の実装
scheme処理系の実装bobuhiro11
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用MITSUNARI Shigeo
 
mxnetで頑張る深層学習
mxnetで頑張る深層学習mxnetで頑張る深層学習
mxnetで頑張る深層学習Takashi Kitano
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)RCCSRENKEI
 
Web時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメWeb時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメHideyuki Takeuchi
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたことMITSUNARI Shigeo
 
SCUGJ第18回勉強会:よろしい、ならばVMMだ
SCUGJ第18回勉強会:よろしい、ならばVMMだSCUGJ第18回勉強会:よろしい、ならばVMMだ
SCUGJ第18回勉強会:よろしい、ならばVMMだwind06106
 
Verilog-HDL Tutorial (14)
Verilog-HDL Tutorial (14)Verilog-HDL Tutorial (14)
Verilog-HDL Tutorial (14)Hiroki Nakahara
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Yoshinori Matsunobu
 
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepMinoru Nakamura
 
1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)Masahiro Nagano
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能MITSUNARI Shigeo
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介Hiroki Nakahara
 

Similar to 汎用性と高速性を目指したペアリング暗号ライブラリ mcl (20)

scheme処理系の実装
scheme処理系の実装scheme処理系の実装
scheme処理系の実装
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
mxnetで頑張る深層学習
mxnetで頑張る深層学習mxnetで頑張る深層学習
mxnetで頑張る深層学習
 
第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)第11回 配信講義 計算科学技術特論B(2022)
第11回 配信講義 計算科学技術特論B(2022)
 
Web時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメWeb時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメ
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
 
SCUGJ第18回勉強会:よろしい、ならばVMMだ
SCUGJ第18回勉強会:よろしい、ならばVMMだSCUGJ第18回勉強会:よろしい、ならばVMMだ
SCUGJ第18回勉強会:よろしい、ならばVMMだ
 
Verilog-HDL Tutorial (14)
Verilog-HDL Tutorial (14)Verilog-HDL Tutorial (14)
Verilog-HDL Tutorial (14)
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
Math works gdlc2019
Math works gdlc2019Math works gdlc2019
Math works gdlc2019
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 
JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
 
1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)
 
MySQL at Yahoo! JAPAN #dbts2018
MySQL at Yahoo! JAPAN #dbts2018MySQL at Yahoo! JAPAN #dbts2018
MySQL at Yahoo! JAPAN #dbts2018
 
Kansai mrb gr_sakura
Kansai mrb gr_sakuraKansai mrb gr_sakura
Kansai mrb gr_sakura
 
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
準同型暗号の実装とMontgomery, Karatsuba, FFT の性能
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
 
研究を加速するChainerファミリー
研究を加速するChainerファミリー研究を加速するChainerファミリー
研究を加速するChainerファミリー
 

More from MITSUNARI Shigeo

暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advancedMITSUNARI Shigeo
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法MITSUNARI Shigeo
 
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介MITSUNARI Shigeo
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用MITSUNARI Shigeo
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がりMITSUNARI Shigeo
 
自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介MITSUNARI Shigeo
 
A compact zero knowledge proof to restrict message space in homomorphic encry...
A compact zero knowledge proof to restrict message space in homomorphic encry...A compact zero knowledge proof to restrict message space in homomorphic encry...
A compact zero knowledge proof to restrict message space in homomorphic encry...MITSUNARI Shigeo
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生MITSUNARI Shigeo
 
Practical Two-level Homomorphic Encryption in Prime-order Bilinear Groups
Practical Two-level Homomorphic Encryption in Prime-order Bilinear GroupsPractical Two-level Homomorphic Encryption in Prime-order Bilinear Groups
Practical Two-level Homomorphic Encryption in Prime-order Bilinear GroupsMITSUNARI Shigeo
 

More from MITSUNARI Shigeo (19)

暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advanced
 
暗認本読書会10
暗認本読書会10暗認本読書会10
暗認本読書会10
 
暗認本読書会9
暗認本読書会9暗認本読書会9
暗認本読書会9
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
暗認本読書会8
暗認本読書会8暗認本読書会8
暗認本読書会8
 
暗認本読書会5
暗認本読書会5暗認本読書会5
暗認本読書会5
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
 
楕円曲線と暗号
楕円曲線と暗号楕円曲線と暗号
楕円曲線と暗号
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
ゆるバグ
ゆるバグゆるバグ
ゆるバグ
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり
 
自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介自作ペアリング/BLS署名ライブラリの紹介
自作ペアリング/BLS署名ライブラリの紹介
 
A compact zero knowledge proof to restrict message space in homomorphic encry...
A compact zero knowledge proof to restrict message space in homomorphic encry...A compact zero knowledge proof to restrict message space in homomorphic encry...
A compact zero knowledge proof to restrict message space in homomorphic encry...
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
 
Practical Two-level Homomorphic Encryption in Prime-order Bilinear Groups
Practical Two-level Homomorphic Encryption in Prime-order Bilinear GroupsPractical Two-level Homomorphic Encryption in Prime-order Bilinear Groups
Practical Two-level Homomorphic Encryption in Prime-order Bilinear Groups
 

汎用性と高速性を目指したペアリング暗号ライブラリ mcl

  • 2. • ペアリング • ベンチマーク • mclの設計 • ベンチマーク詳細 • まとめ 概要 2 / 20
  • 3. • 巡回群𝐺1, 𝐺2, 𝐺 𝑇に対する双線形写像𝑒: 𝐺1 × 𝐺2 → 𝐺 𝑇 • 𝑒 𝑎𝑃, 𝑏𝑄 = 𝑒 𝑃, 𝑄 𝑎𝑏 for 𝑎, 𝑏 ∈ ℤ • それぞれの群の離散対数問題が困難 • IDベース暗号、属性ベース暗号、内積暗号などの応用 • ブロックチェーン関係でも注目されている • Zcash ; 完全匿名可能な分散型暗号通貨 • ゼロ知識証明プロトコルzk-SNARKを利用 • DFINITY ; decentralized world compute cloud • 検証可能な秘密分散機能を持つBLS署名を利用 ペアリング 3 / 20
  • 4. • 𝐹𝑝上の楕円曲線 𝐸 ∶ 𝑦2 = 𝑥3 + 𝑏 • 𝑝 = 36𝑧4 + 36𝑧3 + 24𝑧2 + 6𝑧 + 1, 𝑛 = 𝑝 + 1 − (6𝑧2 + 1) • 𝐺1 = 𝐸 𝐹𝑝 𝑛 • 𝐺2 = 𝜓−1(𝐸 𝑛 ∩ Ker 𝜋 𝑝 − 𝑝 ) where 𝜓: 𝐸′ → 𝐸 ; twist • 𝐺 𝑇 ; 𝐹 𝑝12の1の𝑛乗根の部分群 • 𝑒: 𝐺2 × 𝐺1 → 𝐺 𝑇 • 特徴 • 𝑝が256bit程度なら100bitのセキュリティ • さまざまな高速アルゴリズム、実装が提案されている BN曲線上のoptimal Ateペアリング 4 / 20
  • 5. • ベンチマーク(単位 : msec) • x64/x86 ; Inte Core i7-6700 3.4GHz(Skylake) • ARM ; 900MHz quad-core ARM Cortex-A7 on Raspberry Pi2 • ARM64 ; 1.2GHz ARM Cortex-A53 on HiKey • 問題点 • 高速なものは特定のCPU専用 • 汎用的なものは速くない 既存実装 software x64 x86 ARM ARM64 ate-pairing 0.21 - - - NEON - - 16 - RELIC 0.30 3.5 36 - TEPLA 1.76 3.7 37 17.9 5 / 20
  • 6. • 汎用性と高速性を目指したペアリングライブラリ • https://github.com/herumi/mcl/ • x86/x64, ARM, ARM64 Linux, Windows, macOS対応 • LLVMがサポートするアーキテクチャで動作(するはず) • ベンチマーク(単位 : msec) • 詳細はhttps://github.com/herumi/mcl/#benchmark mcl software x64 x86 ARM ARM64 ate-pairing 0.21 - - - NEON - - 16 - RELIC 0.30 3.5 36 - TEPLA 1.76 3.7 37 17.9 mcl 0.31 1.6 22.6 4.0 6 / 20
  • 7. • メモリの動的確保をしない • C++ templateによる使いやすいクラス • Montogomery乗算などをLLVM bitcodeを用いて記述 • bitcodeは独自DSL on C++から自動生成 mclの設計 7 / 20
  • 8. • 素体クラスFpの元(インスタンス)のメモリ配置 • ヒープ方式(GMPのmpz_class, TEPLAなど) • インスタンスごとにメモリを確保し不要になったら解放する • データサイズを自由に変更可能 • メモリ操作のオーバーヘッド • 内包方式 • インスタンスにデータを保持する • メモリ操作が不要 • データサイズは固定 • mclは内包方式を採用 メモリの動的確保をしない 256bit データ ポインタ サイズ メモリ確保 インスタンス インスタンス 256bit データ 8 / 20
  • 9. • 演算子オーバーロード • Fpの元x, yに対してx + y, x *= yなどの表記を使いたい • 問題点 • ‘x + y’にはpが明示されないが計算にはpの値が必要 • なんらかの方法でpを参照しなければならない 使いやすく高速な素体クラスFp 9 / 20
  • 10. • 各元がpへのポインタを保持する(TEPLA) • ポインタの分だけインスタンスサイズが増える • クラス固定にする(mcl) • コンパイル時に確定 • 各インスタンスはpへのポインタを保持しない pの参照方法(1/2) p ポインタ z ポインタ y ポインタ x zyx p 10 / 20
  • 11. • ペアリング演算には複数の素体が登場する • 楕円曲線の定義体𝐹𝑝, 巡回群の位数を扱う𝐹𝑟など • 問題点 • pの参照方法をクラス固定すると決定すると 素体は一つしか扱えない? • 解決方法 • 素体をC++のtemplate classとしタグによる区別を行う • インスタンスサイズをふやさずに複数の素体を共存可能 複数の素体の共存 zyx p r Fpの元 Frの元 11 / 20
  • 12. • pへの参照はコンパイル時に解決 • 実行時の参照オーバーヘッドが少ない • 複数の素体同士の計算はコンパイル時にエラー • TEPLAでは素体は全て同じElementクラス • 異なる素体の元を間違えて演算しても分からない タグディスパッチによる実装の利点 struct FpTag; // 空定義でよい struct FrTag; typedef FpT<fpTag> Fp; typedef FpT<frTag> Fr; // 好きなだけ定義できる Fp x, y; Fr z; x += y; z *= z; x += z; // コンパイルエラー 12 / 20
  • 13. • 素体クラスの演算性能はペアリングの演算性能に直結 • 高速なものが望ましい • 標準C/C++では高速なコードは記述できない • アセンブリ言語を使用する • 特定のCPU・OSに依存しやすくなる • LLVM • プログラム言語開発に使われるコンパイラやツールチェイン の開発基盤 • 独自の仮想機械とその表現(bitcode)を持つ • 多様なCPUの専用命令への変換機能を持つ • x86/x64/ARM/ARM64/MIPS/MIPS64/PowerPC/, ... • LLVMのbitcodeを用いて素体クラスの演算を実装 LLVMを用いた素体クラスの演算実装 13 / 20
  • 14. • LLVM bitcodeによる実装 • llcを用いて各CPU専用のアセンブリコードを得る • この程度の簡単な関数はほぼ最速のコードが生成される (例)192bit加算関数 define void @add(i192* %pz,i192* %px,i192* %py) { %x = load i192, i192* %px %y = load i192, i192* %py %z = add i192 %x, %y store i192 %z, i192* %pz ret void } 関数定義 関数名 192bitレジスタへのポインタ引数 192bitレジスタへの 読み込み 192bit整数加算 192bit整数の書き込み 14 / 20
  • 15. • 素体クラス演算の実装方針 • 標数のサイズごとに専用演算関数を実装 • 固定長サイズになり高速化しやすい • Montgomery乗算は32bitと64bitとそれぞれに必要 • 問題点 • よく似た関数のLLVM bitcodeを多数実装しなければならない • その他のLLVMのテクニカルな問題 • LLVMは静的単一代入(SSA)なので多数の変数が必要 • 全ての変数名に型が必要なため記述が煩雑 素体クラス演算のLLVM bitcode実装 15 / 20
  • 16. • 素体クラス演算のDSL / C++からLLVM bitcodeを生成 • 一つのDSLを記述するだけでよいので開発効率が向上 LLVM bitcodeを出力するDSLの開発 DSLで Fp:mulを記述 64bit CPU用mul256 64bit CPU用mul320 32bit CPU用mul256 ... mul256-x64 mul256-ARM64 mul256-ARM mul256-x86 for (uint32_t i = 1; i < N; i++) { y = loadN(py, 1, i); xy = call(mulPvM[bit], px, y); t = add(t, xy); if (i < N - 1) { storeN(trunc(t, unit), pz, i); ... 16 / 20
  • 17. • x64環境(Skylake) • GMP ; メモリ確保を伴わないmpn_系関数を用いた • Xbyak ; ate-pairingの最速実装で使われているサブルーチン • 単位 : clock cycle • mul ; 256bit Montgomery乗算 • mulPre ; 256bit x 256bit → 512bit乗算 • red ; 512bit → 256bit Montgomery reduction • LLVM版mulはGMPの3倍程度, Xbyak版の90%程度の性能 LLVMの性能評価(1/3) 演算 add sub mul mulPre red GMP 22.3 18.8 190.2 44.2 108.6 LLVM 8.6 7.7 63.1(x3.0) 27.6 48.2 Xbyak 9.4 9.4 56.6(x3.4) 24.8 41.9 17 / 20
  • 18. • x86/ARM/ARM64環境の違い • ARM64環境はmulがGMPの2倍程度 • x86環境は1.3倍程度, ARM環境はほとんど変わらない • 32bit環境で256bit乗算は固定長演算の利点が相対的に低い • LLVMはレジスタあふれの扱いが弱い LLVMの性能評価(2/3) CPU 演算 add sub mul mulPre red ARM64 GMP 74.0 71.5 597.2 269.5 353.9 LLVM 42.6 44.9 300.6(x1.99) 172.2 185.2 x86 GMP 54.0 29.7 744.8 153.7 415.8 LLVM 29.0 23.8 553.4(x1.35) 229.1 316.7 ARM GMP 157 89 2054 749 1260 LLVM 143 105 2103(x0.98) 747 1244 18 / 20
  • 19. • x64環境におけるビット長の違い LLVMの性能評価(3/3) ビット長 関数 mulPre red mul 256 GMP 42.75 114.76 191.65 LLVM 27.59 47.00 64.36(x2.98) 320 GMP 61.55 150.85 265.69 LLVM 45.18 69.93 88.97(x2.98) 384 GMP 78.59 192.57 355.33 LLVM 62.06 91.17 128.57(x2.76) 448 GMP 104.89 237.21 453.02 LLVM 82.63 130.96 179.41(x2.52) 512 GMP 130.33 286.51 554.50 LLVM 149.13 202.89 313.51(x1.77) 19 / 20
  • 20. • 汎用性と高速性を目指した ペアリングライブラリmclを開発した • x86/x64/ARM/ARM64, Linux, Windows, macOS対応 • 64bit環境でTEPLAの4~5倍、32bit環境で1.4~1.6倍の性能 • x64, ARM版の既存最速実装の67~70%の性能を達成 • 今後の課題 • 実アプリケーションに向けた使いやすいAPI, ドキュメント • よりセキュリティビットの高いペアリングの実装 まとめと今後の課題 20 / 20