Upgrade to Pro — share decks privately, control downloads, hide ads and more …

署名とゼロ知識証明の初歩

herumi
August 10, 2024

 署名とゼロ知識証明の初歩

Kernel/VM探検隊@東京 No17
https://kernelvm.connpass.com/event/321962/

herumi

August 10, 2024
Tweet

More Decks by herumi

Other Decks in Technology

Transcript

  1. 自己紹介 @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
  2. 鍵⽣成する 署名する 検証する データm 署名鍵s 検証鍵S 署名σ OK or NG

    署名者 検証者 署名とは データの正しさを検証する暗号技術 データの中身を本人が認めたことを保証 公開鍵と秘密鍵との組み合わせを扱う公開鍵暗号 PKC (Public Key Cryptography) の一種 暗号化 PKE (Encryption) ではない!!! 署名の流れ 1. 鍵生成:署名者が署名鍵 と検証鍵 を作る 署名鍵は秘密(実印). 検証鍵は公開してよい 2. 署名:署名者が を用いてデータmから署名 を作る 署名者がそのデータを承認したとみなす(捺印) 3. 検証:他人が( )の組の正しさを確認 ( )のどれかが1ビットでも変わったら拒絶 4 / 22
  3. RSAの落とし戸つき一方向性関数 Pythonのpow関数 は を, は を で割った余りを返す は の逆数( となる

    )を返す RSA関数の準備と性質 , を大きな素数で とし , とする 一方向性 : から を求められない 落とし戸 : を知っていれば を計算できる m c=m e % n mからcは簡単 cからmは困難 × dを知っていれば cからmも簡単 m=c d % n 6 / 22
  4. RSA関数を素朴に使う を使った素のRSA暗号(安全ではない) を公開鍵 による の暗号化 を秘密鍵 による の復号 を使った素のRSA署名(安全とはいえない) として

    を署名 ならば受理 よくない署名の説明 この素のRSA署名をもって一般の署名を 「ハッシュ値を秘密鍵で暗号化」「署名を公開鍵で復号してハッシュ値と比較」と説明するが 7 / 22
  5. 署名方式はいろいろある いくつかの署名方式と特徴 署名方式 特徴 素のRSA署名 安全とはいえない / 使われていない FDH-RSA署名 理論上安全だがSHA-2048(?)などが必要

    / 使われてない RSASSA-PKCS1-v1_5 をエンコードして利用 / 一般に使われてる RSASSA-PSS 安全性証明あり / を非可逆的に変換して利用 / 利用推奨 ECDSA/EdDSA 楕円曲線を利用 / ハッシュ値の比較はしない / 使われてる BLS署名 楕円曲線を利用 / ハッシュ値の比較はしない / Ethereum PoSなど 素のRSA署名の比喩で、一般の署名を説明するのはいろんな意味で不適切 RSA署名を正しく理解する 8 / 22
  6. ところで検証鍵の正しさはどうやって確認するのか? 先程の署名者が検証鍵を渡すところ 鍵⽣成する 署名鍵s 検証鍵S 署名者 検証者 このSは本当に 署名者のもの? 検証鍵S

    署名者の情報X CAの検証鍵 SはXに紐付いて ることを確認! CA CAによる署名 安⼼ 不安 署名用電子証明書 署名者の情報 とその人の検証鍵 のペアに対して、認証局(CA)が署名したもの CAの検証鍵で と の紐付けを確認 マイナンバーカードの中に入ってる 認証局の情報は署名用認証局の運営に関する情報で公開されている 認証局の検証鍵もダウンロードできる 10 / 22
  7. 検証鍵S + 基本4情報 CAによる署名 確定申告データ 利⽤者による署名σ P 検証鍵S + 基本4情報

    CAによる署名 P 署名⽤電⼦証明書 e-Taxで送る情報 国税電子申告のときの流れ 署名者の情報 =基本4情報 名前・住所・生年月日・性別 署名して署名用電子証明書と一緒に送る 1. データから署名 を作り 署名用電子証明書 と一緒に送る 2. 税務署は でデータの正しさを検証する 3. CAの検証鍵で の正しさを検証する が無効化されていないかも確認する 11 / 22
  8. 電子証明書の中身 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
  9. 基本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
  10. BBS+署名 選択的開示可能な署名の一種 署名したデータのリストの一部だけを開示して「証明」を作り、他人は証明の検証ができる 名前 サイボウズ 住所 東京都 中央区 123番地 花⼦

    誕⽣⽇ 1990 10 12 性別 ⼥ 検証鍵S + 基本4情報 名前 *** 住所 東京都 中央区 *** *** 誕⽣⽇ *** *** *** 性別 *** 住所の⼀部のみ開⽰ 証明 CAによるBBS+署名 名前 *** 住所 *** *** *** *** 誕⽣⽇ YYYY *** *** 性別 *** 18歳以上であることのみ開⽰ 2024-YYYY≧18 証明 名前のみ開⽰ 証明 ペアリングライブラリmclを使うと比較的容易に実装できる ゼロ知識証明ZKP (Zero Knowledge Proof) と組み合わせて、より細かい制御も可能 18 / 22
  11. 命題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
  12. × + × 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
  13. 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