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
署名とゼロ知識証明の初歩
Search
herumi
August 10, 2024
Technology
5.7k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
署名とゼロ知識証明の初歩
Kernel/VM探検隊@東京 No17
https://kernelvm.connpass.com/event/321962/
herumi
August 10, 2024
More Decks by herumi
See All by herumi
Constant Integer Division and Modulo Optimization Revisited (English)
herumi
0
74
定数整数除算・剰余算最適化再考
herumi
1
120
Constant integer division faster than compiler-generated code
herumi
2
1.1k
Batch Processing Algorithm for Elliptic Curve Operations and Its AVX-512 Implementation
herumi
0
270
Mathematics used in cryptography around us
herumi
2
1.1k
Xbyak Internals and Hacks
herumi
1
800
The NOPs You Don't Know
herumi
4
560
LLVM/ASMを使った有限体の高速実装
herumi
0
320
Lifted-ElGamal 暗号による,Argmax とベクトルの内積近似計算の二者間秘匿計算プロトコルとその応用
herumi
0
610
Other Decks in Technology
See All in Technology
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
0
260
LLMを「主役」にしないための 3つの原則
techtekt
PRO
0
120
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
Unlocking the Apps
pimterry
0
250
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
3k
Agentic Defenseとともにセキュリティエンジニアが輝き続けるには / How Security Engineers Can Keep Excelling with Agentic Defense
yuj1osm
0
120
OCI Oracle AI Database Services新機能アップデート(2026/03-2026/05)
oracle4engineer
PRO
0
250
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
170
AI と創る新たな世界 / A New World Created with AI
ks91
PRO
0
120
Rancherの紹介&Update情報(RancherJP Online Meetup #09)
yoshiyuki_kono
0
120
AIプラットフォームを運用し続けるための可観測性
tanimuyk
4
1.1k
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.4k
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
ラッコキーワード サービス紹介資料
rakko
1
3.6M
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
How to Talk to Developers About Accessibility
jct
2
220
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Designing for Performance
lara
611
70k
Accessibility Awareness
sabderemane
1
130
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
Six Lessons from altMBA
skipperchong
29
4.3k
HDC tutorial
michielstock
2
690
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
480
Transcript
署名とゼロ知識証明の初歩 光成滋生 2024/08/10 Kernel/VM探検隊@東京 No17 1 / 22
内容 雑多な話題いろいろ 署名 RSAの落とし戸つき一方向性関数 マイナンバーカード BBS+署名 zkSNARK EVM 2 /
22
自己紹介 @herumi サイボウズ・ラボで暗号と高速化のR&D 『暗号と認証のしくみと理論がしっかりわかる』 『Binary Hacks Rebooted』にも寄稿 Microsoft MVP C++,
Developer Seucirty受賞 (2024/7) x86/x64用JITアセンブラ Xbyak (AArch64, RISC-V版もある) Google Open Source Peer Bonus受賞 (2024/6) UXL FoundationのoneAPI/oneDNNのx64 CPUエンジン ペアリング暗号・BLS署名ライブラリ mcl/bls 2014年zkSNARK/libsnark対応, 2016年DFINITYのBLS署名, 2018年Ethereum PoS対応, etc. mcl-wasmのGitHub network dependentsは20万repo, NPM 1900万DL Ethereum Foundation Retroactive Grants 獲得(2024/8) 3 / 22
鍵⽣成する 署名する 検証する データm 署名鍵s 検証鍵S 署名σ OK or NG
署名者 検証者 署名とは データの正しさを検証する暗号技術 データの中身を本人が認めたことを保証 公開鍵と秘密鍵との組み合わせを扱う公開鍵暗号 PKC (Public Key Cryptography) の一種 暗号化 PKE (Encryption) ではない!!! 署名の流れ 1. 鍵生成:署名者が署名鍵 と検証鍵 を作る 署名鍵は秘密(実印). 検証鍵は公開してよい 2. 署名:署名者が を用いてデータmから署名 を作る 署名者がそのデータを承認したとみなす(捺印) 3. 検証:他人が( )の組の正しさを確認 ( )のどれかが1ビットでも変わったら拒絶 4 / 22
署名の種類 安全性根拠の種別による分類 RSA署名(いろんな種類がある) RSAの落とし戸つき一方向性関数の安全性(後述) DSA 有限体上の離散対数問題の難しさ ECDSA, BLS署名など 楕円曲線上の離散対数問題の難しさ(点 の
倍 を求めるのは簡単だが逆は困難) 機能面の分類 普通の署名 選択的開示可能な署名 集約署名, グループ署名, 匿名署名 etc. 5 / 22
RSAの落とし戸つき一方向性関数 Pythonのpow関数 は を, は を で割った余りを返す は の逆数( となる
)を返す RSA関数の準備と性質 , を大きな素数で とし , とする 一方向性 : から を求められない 落とし戸 : を知っていれば を計算できる m c=m e % n mからcは簡単 cからmは困難 × dを知っていれば cからmも簡単 m=c d % n 6 / 22
RSA関数を素朴に使う を使った素のRSA暗号(安全ではない) を公開鍵 による の暗号化 を秘密鍵 による の復号 を使った素のRSA署名(安全とはいえない) として
を署名 ならば受理 よくない署名の説明 この素のRSA署名をもって一般の署名を 「ハッシュ値を秘密鍵で暗号化」「署名を公開鍵で復号してハッシュ値と比較」と説明するが 7 / 22
署名方式はいろいろある いくつかの署名方式と特徴 署名方式 特徴 素のRSA署名 安全とはいえない / 使われていない FDH-RSA署名 理論上安全だがSHA-2048(?)などが必要
/ 使われてない RSASSA-PKCS1-v1_5 をエンコードして利用 / 一般に使われてる RSASSA-PSS 安全性証明あり / を非可逆的に変換して利用 / 利用推奨 ECDSA/EdDSA 楕円曲線を利用 / ハッシュ値の比較はしない / 使われてる BLS署名 楕円曲線を利用 / ハッシュ値の比較はしない / Ethereum PoSなど 素のRSA署名の比喩で、一般の署名を説明するのはいろんな意味で不適切 RSA署名を正しく理解する 8 / 22
IPAの試験問題の問題 令和5年度秋期応用情報技術者試験午後 素のRSA署名の説明の回答を要求(a=送信者の秘密鍵, b=送信者の公開鍵) 令和6年度春期ネットワークスペシャリスト試験 同様の問題が出題され不備との判断で不成立 署名対象の不備も S/MIMEではメール本文 ではなく、 などを含む情報に対して署名する
IPA試験問題不備(令和6年春期ネットワークスペシャリスト午後2) by @angel_p_57 9 / 22
ところで検証鍵の正しさはどうやって確認するのか? 先程の署名者が検証鍵を渡すところ 鍵⽣成する 署名鍵s 検証鍵S 署名者 検証者 このSは本当に 署名者のもの? 検証鍵S
署名者の情報X CAの検証鍵 SはXに紐付いて ることを確認! CA CAによる署名 安⼼ 不安 署名用電子証明書 署名者の情報 とその人の検証鍵 のペアに対して、認証局(CA)が署名したもの CAの検証鍵で と の紐付けを確認 マイナンバーカードの中に入ってる 認証局の情報は署名用認証局の運営に関する情報で公開されている 認証局の検証鍵もダウンロードできる 10 / 22
検証鍵S + 基本4情報 CAによる署名 確定申告データ 利⽤者による署名σ P 検証鍵S + 基本4情報
CAによる署名 P 署名⽤電⼦証明書 e-Taxで送る情報 国税電子申告のときの流れ 署名者の情報 =基本4情報 名前・住所・生年月日・性別 署名して署名用電子証明書と一緒に送る 1. データから署名 を作り 署名用電子証明書 と一緒に送る 2. 税務署は でデータの正しさを検証する 3. CAの検証鍵で の正しさを検証する が無効化されていないかも確認する 11 / 22
マイナンバーカードの暗証番号 4種類 住民基本台帳用 住所や氏名を変更するとき 券面事項入力補助用 マイナンバーや基本4情報を読み取るとき 利用者証明用電子証明書 公的個人認証サービスなどを利用するときに本人であることを証明する 住民票の写しの交付など 基本4情報は含まない
ただし証明書有効期間の満了日≒誕生日, 認証局から都道府県市+区ぐらいは分かる 署名用電子証明書 署名用の電子証明書を使うときに使う(実印相当) 基本4情報を含む 12 / 22
署名用電子証明書を眺める 中を見るためのソフトウェア 公的個人認証サービスで提供されるソフトを使う Windows, Mac, Android, iPhone用がある LinuxはOpenSCのpkcs15-tool --read-certificate等 基本4情報(氏名・住所・生年月日・性別)の表示
画像はダミー ファイル保存できる(sign.cerと保存した) 13 / 22
電子証明書の中身 cerファイル(X.509証明書を保存するファイル形式 : ASN.1データ構造) der : binaryフォーマット pem : base64エンコードされたderファイル
OpenSSLで触ってみる openssl x509 -inform DER -in sign.cer -text -noout Certificate: Data: RSA Public-Key: (2048 bit) Modulus: 00:aa:bb:cc:... Exponent: 65537 (0x10001) (...) X509v3 Subject Alternative Name: othername:<unsupported>, othername:<unsupported> ... 基本4情報はAlternative Nameに入ってるがこのままでは見えない 14 / 22
基本4情報を表示する データの場所の位置の特定 openssl asn1parse -inform DER -in sign.cer 628:d=5 hl=2
l= 3 prim: OBJECT :X509v3 Subject Alternative Name 633:d=5 hl=3 l= 217 prim: OCTET STRING [HEX DUMP]:30... 633バイト目から入ってる openssl asn1parse -inform DER -in sign.cer -strparse 633 0:d=0 hl=3 l= 214 cons: SEQUENCE 3:d=1 hl=2 l= 31 cons: cont [ 0 ] 5:d=2 hl=2 l= 10 prim: OBJECT :1.2.392.200149.8.5.5.1 17:d=2 hl=2 l= 17 cons: cont [ 0 ] 19:d=3 hl=2 l= 15 prim: UTF8STRING :光成 滋生 検証(ファイルをpem形式にしてからverify) > openssl x509 -in JPKI-CA.cer -inform DER -out JPKI-CA.pem -outform PEM > openssl verify -CAfile JPKI-CA.pem sign.pem 15 / 22
デジタル認証サービス マイナンバーカードで本人の確認を簡単に マイナンバーカードを使った認証や署名を安全・簡単にするためのアプリ(2024/6/24) デジタル庁が提供するデジタル認証アプリサービスAPIを利用する 主な利用シーン(上記サイトより引用) ECサイトやネットバンキングログイン時の本人確認 公共施設やシェアリングサービスなどのオンライン予約時 ライブ会場等での酒類購入時の年齢確認 地域アプリ登録時のオンライン本人確認 予約システムを用いた面談や施設予約時のオンライン本人確認
など いろんなところで気軽に使ってほしいように見えるが 16 / 22
情報見えすぎ問題 署名用電子証明書の制約 常に基本4情報(氏名・住所・生年月日・性別)がセットになってる 署名の正しさを確認してもらうには基本4情報を開示する必要がある 署名鍵のみや利用者証明用電子証明書では暗号学的に基本4情報の正しさは保証されない デジタル認証アプリサーバーが全てを握る 一部しか見せたくない 「東京都品川区」在住であることだけ伝えたい 誕生日ではなく年齢のみ伝えたい 名前だけ伝えたい
etc. 普通の署名では対応できない → プライバシーを考慮した署名技術の必要性 17 / 22
BBS+署名 選択的開示可能な署名の一種 署名したデータのリストの一部だけを開示して「証明」を作り、他人は証明の検証ができる 名前 サイボウズ 住所 東京都 中央区 123番地 花⼦
誕⽣⽇ 1990 10 12 性別 ⼥ 検証鍵S + 基本4情報 名前 *** 住所 東京都 中央区 *** *** 誕⽣⽇ *** *** *** 性別 *** 住所の⼀部のみ開⽰ 証明 CAによるBBS+署名 名前 *** 住所 *** *** *** *** 誕⽣⽇ YYYY *** *** 性別 *** 18歳以上であることのみ開⽰ 2024-YYYY≧18 証明 名前のみ開⽰ 証明 ペアリングライブラリmclを使うと比較的容易に実装できる ゼロ知識証明ZKP (Zero Knowledge Proof) と組み合わせて、より細かい制御も可能 18 / 22
命題C(回路) 証明⽣成 検証する Setup of zkSNARK 検証鍵vk(公開) w(秘密) π(証明) 署名鍵pk(公開)
x(公開) ゼロ知識証明の一種 zkSNARK 概要 証明したい命題を回路の形 で表してsetupする 証明者は署名鍵と秘密情報 から証明 を生成 検証者は証明 と公開情報のみで を知らずに 「証明者が回路を満たす を知っていること」 を納得する 命題(回路)の例 「誕生日を教えず私は18歳以上」 所持金がX円で、Y円買い物をして残りはZ円を 「X, Y, Zを教えずX-Y=Z & Y≧0 & Z≧0」 「mを教えずにH(m)=h」 19 / 22
× + × x 1 x 2 x 3 f(x
1 ,x 2 ,x 3 ) =x 1 x 2 (x 1 +x 3 ) L i R i O i zkSNARKの回路 算術回路 Boolean回路の変数が整数になったもの Boolean回路は変数 が0か1を表す . . . こういった多項式の組み合わせ QAP (Quadratic Arithmetic Program) 多項式が2次式になるように変数を増やして式を分解する 各ノード上で多項式が を満たす cf. ブロックチェーン系プロジェクトで着目される暗号技術 20 / 22
Circom Rustで書かれたzkSNARK用回路コンパイラ 証明したい関数の組(回路)を入力すると、C++/Wasm用の検証用コードが生成される 証明者はそれを使ってzkSNARKの証明を作成し、検証者はそれを使って検証する Ethereum Virtual Machine (EVM) でも検証できる DSL
算術回路を記述するための専用言語でcircomlibにSHA-256用などのサンプルがある pragma circom 2.0.0; template Multiplier2() { // a*b = cの例 signal input a; signal input b; signal output c; c <== a*b; } 21 / 22
EVM 特徴 Ethereumのブロックチェーン上で動作する仮想マシン(仕様) Node.jsやブラウザ上で動くEthereumJS VMはmcl-wasmも利用してる スタックベースで算術演算・論理演算・メモリ操作など普通の命令は一通りある 256ビット整数演算・ハッシュ関数 楕円曲線の演算とペアリングの専用命令がある! ecAdd, ecMul
(EIP-196), ecPairing (EIP-197) ecAddとecMulで楕円曲線の点の多項式の評価ができる ecPairingは「楕円曲線の点の乗算」相当する性質を持つ演算 これらを用いてzkSNARKの検証部分の処理を実行できる 22 / 22