Slide 1

Slide 1 text

署名とゼロ知識証明の初歩 光成滋生 2024/08/10 Kernel/VM探検隊@東京 No17 1 / 22

Slide 2

Slide 2 text

内容 雑多な話題いろいろ 署名 RSAの落とし戸つき一方向性関数 マイナンバーカード BBS+署名 zkSNARK EVM 2 / 22

Slide 3

Slide 3 text

自己紹介 @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

Slide 4

Slide 4 text

鍵⽣成する 署名する 検証する データm 署名鍵s 検証鍵S 署名σ OK or NG 署名者 検証者 署名とは データの正しさを検証する暗号技術 データの中身を本人が認めたことを保証 公開鍵と秘密鍵との組み合わせを扱う公開鍵暗号 PKC (Public Key Cryptography) の一種 暗号化 PKE (Encryption) ではない!!! 署名の流れ 1. 鍵生成:署名者が署名鍵 と検証鍵 を作る 署名鍵は秘密(実印). 検証鍵は公開してよい 2. 署名:署名者が を用いてデータmから署名 を作る 署名者がそのデータを承認したとみなす(捺印) 3. 検証:他人が( )の組の正しさを確認 ( )のどれかが1ビットでも変わったら拒絶 4 / 22

Slide 5

Slide 5 text

署名の種類 安全性根拠の種別による分類 RSA署名(いろんな種類がある) RSAの落とし戸つき一方向性関数の安全性(後述) DSA 有限体上の離散対数問題の難しさ ECDSA, BLS署名など 楕円曲線上の離散対数問題の難しさ(点 の 倍 を求めるのは簡単だが逆は困難) 機能面の分類 普通の署名 選択的開示可能な署名 集約署名, グループ署名, 匿名署名 etc. 5 / 22

Slide 6

Slide 6 text

RSAの落とし戸つき一方向性関数 Pythonのpow関数 は を, は を で割った余りを返す は の逆数( となる )を返す RSA関数の準備と性質 , を大きな素数で とし , とする 一方向性 : から を求められない 落とし戸 : を知っていれば を計算できる m c=m e % n mからcは簡単 cからmは困難 × dを知っていれば cからmも簡単 m=c d % n 6 / 22

Slide 7

Slide 7 text

RSA関数を素朴に使う を使った素のRSA暗号(安全ではない) を公開鍵 による の暗号化 を秘密鍵 による の復号 を使った素のRSA署名(安全とはいえない) として を署名 ならば受理 よくない署名の説明 この素のRSA署名をもって一般の署名を 「ハッシュ値を秘密鍵で暗号化」「署名を公開鍵で復号してハッシュ値と比較」と説明するが 7 / 22

Slide 8

Slide 8 text

署名方式はいろいろある いくつかの署名方式と特徴 署名方式 特徴 素のRSA署名 安全とはいえない / 使われていない FDH-RSA署名 理論上安全だがSHA-2048(?)などが必要 / 使われてない RSASSA-PKCS1-v1_5 をエンコードして利用 / 一般に使われてる RSASSA-PSS 安全性証明あり / を非可逆的に変換して利用 / 利用推奨 ECDSA/EdDSA 楕円曲線を利用 / ハッシュ値の比較はしない / 使われてる BLS署名 楕円曲線を利用 / ハッシュ値の比較はしない / Ethereum PoSなど 素のRSA署名の比喩で、一般の署名を説明するのはいろんな意味で不適切 RSA署名を正しく理解する 8 / 22

Slide 9

Slide 9 text

IPAの試験問題の問題 令和5年度秋期応用情報技術者試験午後 素のRSA署名の説明の回答を要求(a=送信者の秘密鍵, b=送信者の公開鍵) 令和6年度春期ネットワークスペシャリスト試験 同様の問題が出題され不備との判断で不成立 署名対象の不備も S/MIMEではメール本文 ではなく、 などを含む情報に対して署名する IPA試験問題不備(令和6年春期ネットワークスペシャリスト午後2) by @angel_p_57 9 / 22

Slide 10

Slide 10 text

ところで検証鍵の正しさはどうやって確認するのか? 先程の署名者が検証鍵を渡すところ 鍵⽣成する 署名鍵s 検証鍵S 署名者 検証者 このSは本当に 署名者のもの? 検証鍵S 署名者の情報X CAの検証鍵 SはXに紐付いて ることを確認! CA CAによる署名 安⼼ 不安 署名用電子証明書 署名者の情報 とその人の検証鍵 のペアに対して、認証局(CA)が署名したもの CAの検証鍵で と の紐付けを確認 マイナンバーカードの中に入ってる 認証局の情報は署名用認証局の運営に関する情報で公開されている 認証局の検証鍵もダウンロードできる 10 / 22

Slide 11

Slide 11 text

検証鍵S + 基本4情報 CAによる署名 確定申告データ 利⽤者による署名σ P 検証鍵S + 基本4情報 CAによる署名 P 署名⽤電⼦証明書 e-Taxで送る情報 国税電子申告のときの流れ 署名者の情報 =基本4情報 名前・住所・生年月日・性別 署名して署名用電子証明書と一緒に送る 1. データから署名 を作り 署名用電子証明書 と一緒に送る 2. 税務署は でデータの正しさを検証する 3. CAの検証鍵で の正しさを検証する が無効化されていないかも確認する 11 / 22

Slide 12

Slide 12 text

マイナンバーカードの暗証番号 4種類 住民基本台帳用 住所や氏名を変更するとき 券面事項入力補助用 マイナンバーや基本4情報を読み取るとき 利用者証明用電子証明書 公的個人認証サービスなどを利用するときに本人であることを証明する 住民票の写しの交付など 基本4情報は含まない ただし証明書有効期間の満了日≒誕生日, 認証局から都道府県市+区ぐらいは分かる 署名用電子証明書 署名用の電子証明書を使うときに使う(実印相当) 基本4情報を含む 12 / 22

Slide 13

Slide 13 text

署名用電子証明書を眺める 中を見るためのソフトウェア 公的個人認証サービスで提供されるソフトを使う Windows, Mac, Android, iPhone用がある LinuxはOpenSCのpkcs15-tool --read-certificate等 基本4情報(氏名・住所・生年月日・性別)の表示 画像はダミー ファイル保存できる(sign.cerと保存した) 13 / 22

Slide 14

Slide 14 text

電子証明書の中身 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:, othername: ... 基本4情報はAlternative Nameに入ってるがこのままでは見えない 14 / 22

Slide 15

Slide 15 text

基本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

Slide 16

Slide 16 text

デジタル認証サービス マイナンバーカードで本人の確認を簡単に マイナンバーカードを使った認証や署名を安全・簡単にするためのアプリ(2024/6/24) デジタル庁が提供するデジタル認証アプリサービスAPIを利用する 主な利用シーン(上記サイトより引用) ECサイトやネットバンキングログイン時の本人確認​ 公共施設やシェアリングサービスなどのオンライン予約時 ライブ会場等での酒類購入時の年齢確認​ 地域アプリ登録時のオンライン本人確認​ 予約システムを用いた面談や施設予約時のオンライン本人確認​ など いろんなところで気軽に使ってほしいように見えるが 16 / 22

Slide 17

Slide 17 text

情報見えすぎ問題 署名用電子証明書の制約 常に基本4情報(氏名・住所・生年月日・性別)がセットになってる 署名の正しさを確認してもらうには基本4情報を開示する必要がある 署名鍵のみや利用者証明用電子証明書では暗号学的に基本4情報の正しさは保証されない デジタル認証アプリサーバーが全てを握る 一部しか見せたくない 「東京都品川区」在住であることだけ伝えたい 誕生日ではなく年齢のみ伝えたい 名前だけ伝えたい etc. 普通の署名では対応できない → プライバシーを考慮した署名技術の必要性 17 / 22

Slide 18

Slide 18 text

BBS+署名 選択的開示可能な署名の一種 署名したデータのリストの一部だけを開示して「証明」を作り、他人は証明の検証ができる 名前 サイボウズ 住所 東京都 中央区 123番地 花⼦ 誕⽣⽇ 1990 10 12 性別 ⼥ 検証鍵S + 基本4情報 名前 *** 住所 東京都 中央区 *** *** 誕⽣⽇ *** *** *** 性別 *** 住所の⼀部のみ開⽰ 証明 CAによるBBS+署名 名前 *** 住所 *** *** *** *** 誕⽣⽇ YYYY *** *** 性別 *** 18歳以上であることのみ開⽰ 2024-YYYY≧18 証明 名前のみ開⽰ 証明 ペアリングライブラリmclを使うと比較的容易に実装できる ゼロ知識証明ZKP (Zero Knowledge Proof) と組み合わせて、より細かい制御も可能 18 / 22

Slide 19

Slide 19 text

命題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

Slide 20

Slide 20 text

× + × 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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

EVM 特徴 Ethereumのブロックチェーン上で動作する仮想マシン(仕様) Node.jsやブラウザ上で動くEthereumJS VMはmcl-wasmも利用してる スタックベースで算術演算・論理演算・メモリ操作など普通の命令は一通りある 256ビット整数演算・ハッシュ関数 楕円曲線の演算とペアリングの専用命令がある! ecAdd, ecMul (EIP-196), ecPairing (EIP-197) ecAddとecMulで楕円曲線の点の多項式の評価ができる ecPairingは「楕円曲線の点の乗算」相当する性質を持つ演算 これらを用いてzkSNARKの検証部分の処理を実行できる 22 / 22