ブラウザで動く準同型暗号
2017/10/18
emscripten night#5
光成滋生(@herumi)
• サイボウズ・ラボで暗号とセキュリティ関係のR&D
• バックアップシステムWalB(https://github.com/walb-linux)
• @IT クラウド時代の暗号化技術論連載2015
• Microsoft MVP Developer Security 2015~
• 『パターン認識と機械学習の学習普及版』暗黒通信団
• よく使う言語はC++/x64アセンブラ
• https://github.com/herumi/
• JavaScriptは素人…
自己紹介
2 / 13
• そもそも暗号化とは
• 秘密の情報を他人に読めないようにすること
• 暗号文はホワイトノイズと区別できない
準同型暗号の前に
秘密の文章
3 / 13
• サーバから見るとディスクを食うだけのゴミデータ
• クラウドのCPUパワーを使えない
• 安全性と利便性のジレンマ
• クラウドに暗号化したまま処理させたい!
クラウドに暗号文をアップロードすると
4 / 13
• 暗号化したまま足し算や掛け算ができる暗号
• クラウドはカプセルの中を見ずに(復号せずに)計算
• 今回は内積(𝑥1 𝑦1 + ⋯ + 𝑥 𝑛 𝑦𝑛)を計算できる暗号
準同型暗号(Homomorphic Encryption)
+×1 3 42 × 14=
5 / 13
• 『クラウドを支えるこれからの暗号技術』を見てね
そんなことできるの?と思ったら
6 / 13
• 統計データの計算
• データの平均、分散、相関
• 個人情報を隠したまま喫煙者と肺癌患者の関係
• ビールを買う人とおつまみを買う人の相関
• 最小二乗法
• ベクトルのコサイン類似度
• ニューラルネットの畳み込み etc.
内積を計算できたら何がうれしい?
名前 煙草 ビール あられ 肺癌
?さん ? ? ? ?
?さん ? ? ? ?
?さん ? ? ? ?
?さん ? ? ? ? 喫煙 禁煙 合計
肺癌になる 72 42 114
ならない 28 58 86
合計 100 100 200
個人情報を
秘匿しつつ集計
7 / 13
暗号化したまま内積を求めるデモ
https://herumi.github.io/mcl/demo/she2.html
(https://herumi.github.io/mcl/demo/she-ja.html 日本語版)
• https://github.com/herumi/mcl
• 高速で汎用的なペアリング演算
• Windows/Linux/OS X
• x86/x64/ARM/ARM64対応
準同型暗号ライブラリmcl
ペアリング
楕円曲線
準同型暗号
有限体
多倍長演算
Xbyak ; x64
LLVM;ARM64 etc.
GMP
Vint ; WASM
WASMのために今回追加
mclの階層構造
9 / 13
• 多倍長演算にどのバックエンドを使う?
• Xbyak(https://github.com/herumi/xbyak)
• C++用x86/x64専用JITアセンブラ
• Intelの機械学習・深層学習ライブラリのJIT部分で利用される
• 最速だが(もちろん)今回は使えない
• GMP(https://gmplib.org/)
• GNUの広く使われている多倍長ライブラリ
• アセンブリコード部分は使えない
• Cのみでbuildしたが動かなかった(詳細未調査)
mclをWASMに対応させるまで
10 / 13
• mclはLLVM IR(LLVMのアセンブリ言語)で
記述された多倍長演算ルーチンを持っている
• (高速)Xbyak > LLVM > GMP > Vint(低速)
• -march=wasm32で楽勝と思って始めた数カ月前
• llcのWASM出力は64 bitを越えるレジスタに対応してなかった
• (注意)一昨日、最新版で試したら対応したっぽい?
• 仕方がない、WASMを手書きか?
LLVM
Unsupported: %z = mul i128 %x, %y
LLVM ERROR: Binary operator type
not yet supported for integer types larger than 64 bits
11 / 13
• キャリー演算が無い
• キャリー : 整数x, yを足したときに繰り上がりを示すフラグ
• 無いと多倍長演算が辛い
• 64bit x 64bit → 128bit整数演算命令が無い
• 64bit x 64bit → (下位)64bitはあるが
乗算にかかるコストが全然違う
• それなら手書きWASMでがんばらず、
C++で書いても速度はあまり変わらないのでは
• Vint(簡易多倍長整数ライブラリ)を作成
WASMの不満点
12 / 13
• ペアリング演算(回数/sec)on Core i7-6700 3.4GHz
• WASMはnative(0.3msec)の10倍程度の遅さ
• それでも3msecなので実用できるかも
• それよりメモリがネックか
ベンチマーク
WASM
Vint wo/mul
Vint w/mul
Xbyak
Xbyak
Vint w/mul ; 64x64→128 mul
Vint wo/mul ; 64x64→64 mul
WASM ; Vint on Firefox
fast
13 / 13

ブラウザで動く準同型暗号