JP ZK Learning Club
  • 貢献について
  • 前提知識
    • 暗号学
      • 決定問題
      • P/NP問題
      • 計算複雑性理論
    • 数学
      • 代数的構造
      • 離散対数問題 (DLP)
      • 楕円曲線
      • 算術回路
  • PSE-Core-Program
    • Week 1
    • Week 2 さらなる暗号技術とSNARKsとSTARKs
    • Week 5 Frontier
  • zkSNARKs
    • Spartan
  • Folding Scheme
    • Nova
    • SuperNova
    • HyperNova
    • NeutronNova
    • CycleFold
  • Lookup Argument
    • 概要とLasso以前の提案
    • Lasso
  • zkVM
    • Backgrounds
      • Multi Linear extension(MLE)
      • Folding scheme
      • Lookup Singularity
      • Cycle of Curves
      • Extension Field
      • Glossary
      • CCS
      • Switch-board (Nebula)
    • Building Blocks
      • Binius
      • GKR
      • Circle STARK
      • Sum-check Protocol
    • 動作概要
    • ゼロ知識証明
      • メモリ読み込み・書き込みの一貫性
        • Merkle-Tree
        • Spice
        • Jolt-Memory-Checking
        • Nebula
        • Proof-for-Deep-Though
      • 命令の実行
      • バイトコードから命令へのデコード
    • プロジェクト
      • SP1
      • RISC-Zero
      • Jolt
      • Valida
      • Nexus
Powered by GitBook
On this page
  • 対称暗号と非対称暗号 (Symmetric & Asymmetric Cryptography)
  • AES (Advanced Encryption System)
  • 非対称暗号: RSA (Rivest Shamir Adleman)
  • ハッシュ関数 (Hash Function)
  • SHA256 (Secure Hash Algorithm)
  • マークルツリー (Merkle Tree)
  • デジタル署名 (Digital Signature): Schnorr署名 (Schnorr Signature)
  • 離散対数に基づく公開鍵暗号学: Diffie-Hellman 鍵交換 (Diffie-Hellman Key Exchange)
  • Elgamal暗号化 (Elgamal Encryption)
  • コミットメント (Cryptographic Commitment)
  • Pedersenコミットメント (Pedersen Commitment)
  • 楕円曲線暗号 (Elliptic Curve Cryptography)
  • ECDSA (Elliptic Curve Digital Signature Algorithm)
  • BLS署名 (Boneh-Lynn-Shacham Signature)
  • ペアリング暗号 (Pairing Based Cryptography)
  1. PSE-Core-Program

Week 1

参照先: https://github.com/privacy-scaling-explorations/core-program/blob/main/2024/week1_cryptographic_basics.md

対称暗号と非対称暗号 (Symmetric & Asymmetric Cryptography)

対称暗号化アルゴリズムは、暗号化機能と復号化機能の両方を実行するために同じ鍵を使用します。

非対称暗号化アルゴリズムは、暗号化に使用される鍵は公開鍵と呼び、復号化に使用される鍵を秘密鍵と呼びます。

公開鍵と暗号鍵は、数学的の関係性を持ちます。

AES (Advanced Encryption System)

AESは対称暗号の一種。鍵生成、暗号化、復号化の三つのアルゴリズムで定義される。

例:Aliceは機密データをBobに安全に送信したい。

鍵生成
  1. Aliceは鍵長を選択する(128, 192, または 256ビット)

  2. 選択した長さのランダムな鍵KKKを生成する

  3. 鍵拡張アルゴリズムを使用して、ラウンド鍵K0,K1,...,KrK_0, K_1, ..., K_rK0​,K1​,...,Kr​を生成する (rrrは総ラウンド数:128ビット鍵で10、192ビット鍵で12、256ビット鍵で14)

暗号化
  1. 平文MMMを128ビット(16バイト)のブロックに分割する

  2. 各ブロックに対して以下の操作を行う:

    1. AddRoundKey: ブロックとK0K_0K0​をXORXORXOR

    2. r−1r-1r−1回の主ラウンドを実行:

      1. SubBytes: 各バイトをS-boxを用いて置換

      2. ShiftRows: 行ごとに左循環シフト

      3. MixColumns: 列ごとに線形変換

      4. AddRoundKey: 状態とKiK_iKi​をXORXORXOR

    3. 最終ラウンド:

      1. SubBytes

      2. ShiftRows

      3. AddRoundKey(KrK_rKr​を使用)

  3. 暗号文CCCを出力

復号化
  1. 暗号文CCCを128ビット(16バイト)のブロックに分割する

  2. 各ブロックに対して以下の操作を行う:

    1. AddRoundKey: ブロックとKrK_rKr​をXORXORXOR

    2. r−1r-1r−1回の逆主ラウンドを実行:

      1. InvShiftRows: 行ごとに右循環シフト

      2. InvSubBytes: 各バイトを逆S-boxを用いて置換

      3. AddRoundKey: 状態とKiK_iKi​をXORXORXOR

      4. InvMixColumns: 列ごとに逆線形変換

    3. 最終ラウンド:

      1. InvShiftRows

      2. InvSubBytes

      3. AddRoundKey(K0K_0K0​を使用)

  3. 平文MMMを出力

注意点
  • AESは有限体GF(28)GF(2^8)GF(28)上で動作する

  • SubBytesステップでは、バイトの乗法逆元を求めた後にアフィン変換を適用

  • MixColumnsステップでは、固定の多項式との乗算を行う

  • 鍵拡張アルゴリズムは、元の鍵から各ラウンドで使用する鍵を生成する複雑なプロセスを含む

非対称暗号: RSA (Rivest Shamir Adleman)

RSAは非対称暗号の一種。鍵生成、鍵共有、暗号化、復号三つのアルゴリズムで定義される。

例:BobはAliceに、危険な環境で安全に秘密を伝えたい。

鍵生成(暗号鍵、公開鍵)
  1. Aliceは p,qp, qp,q 二つ素数をランダムに選び、下記二点を計算する

    1. n=p⋅qn = p \cdot qn=p⋅q

  2. 1<e<λ(n)1<e<\lambda(n)1<e<λ(n)、そして gcd(e,λ(n))=1gcd(e, \lambda(n))=1gcd(e,λ(n))=1を満たす公開鍵eeeを選択する

  3. Aliceは d,p,q,λ(n)d, p, q,\lambda(n)d,p,q,λ(n)を秘密鍵として保管し、(n,e)(n, e)(n,e)を公開鍵として公開する

暗号化
  1. BobはAliceから共有された公開鍵 (n,e)(n, e)(n,e)を取得する

  2. 共有したい平文MMMを整数mmmに変換し、0<m<n0 < m < n0<m<nだと確認する( m>nm > nm>nの場合、メッセージが m(modn)m \pmod nm(modn)に削減される)

  3. c=me(modn)c = m^e \pmod nc=me(modn)を計算する

  4. 暗号文cccをAliceに送る

復号化
  1. Aliceは暗号文cccを取得する

  2. cd≡(me)d≡m(modn)c^d \equiv (m^e)^d \equiv m \pmod ncd≡(me)d≡m(modn)を計算する

  3. mmmから平文MMMに復元する

ハッシュ関数 (Hash Function)

SHA256 (Secure Hash Algorithm)

マークルツリー (Merkle Tree)

デジタル署名 (Digital Signature): Schnorr署名 (Schnorr Signature)

デジタル署名とは、非対称暗号を利用し、電子文書に対し暗号を用いた署名を付与することで、その電子文書が作成名義人によって作成されたこと、そして作成されて以降が改変されていないことを証明する技術です。

例: AliceはBobへあるメッセージ mmm を送信し、そのメッセージが自分から作成し、改変されていないことを証明したい。

プロトコル

Aliceの事前準備

  1. 大きな素数 ppp、そしてp−1p-1p−1を割り切れる素数 qqq

  2. 秘密鍵 xxx を 0<x<q0 < x < q0<x<q から選択する

  3. 公開鍵 y=gx(modp)y = g^x \pmod py=gx(modp) を作成する

  4. qqqを法とする整数乗法群Zp∗\mathbb{Z}_p^*Zp∗​

  5. ハッシュ関数 HHH

Aliceはメッセージ mmm に署名する

  1. nonce kkkを 0<k<p−10 < k < p -10<k<p−1から選択する

  2. r=gk(modp)r=g^k \pmod pr=gk(modp) を計算する

  3. mmm と rrr を結合し、 e=H(m∣∣r)e=H(m||r)e=H(m∣∣r)を計算する

  4. s=k−xe(modq)s=k-xe \pmod qs=k−xe(modq)を計算する

  5. (s,e,m)(s,e,m)(s,e,m)をBobへ送信する

Bobは (s,e)(s,e)(s,e)に基づいて mmm を検証する

  1. e′=H(m∣∣r)e'=H(m||r)e′=H(m∣∣r)を計算する

e′==ee' ==ee′==e であれば、Bobはメッセージ mmm はAliceが作成し、改変されず着信したことを証明できたとみなす。

離散対数に基づく公開鍵暗号学: Diffie-Hellman 鍵交換 (Diffie-Hellman Key Exchange)

AliceとBobの間、事前の秘密の共有無しに、盗聴の可能性のある通信路を使って、共通暗号鍵を構築する方法です。共通公開鍵を生成する過程までは非対称暗号を利用し、その後の交流は共通暗号鍵に基づく対照暗号を利用します。

プロトコル

事前準備

  1. 大きな素数 ppp

  2. 整数乗法群Zp∗\mathbb{Z}_p^*Zp∗​、生成元とするgggとh∈Zp∗h \in \mathbb{Z}_p^*h∈Zp∗​

鍵生成

  1. Aliceは秘密鍵 aaa を 1<a<p−11 < a < p-11<a<p−1からランダムに選択する

  2. Bobは秘密鍵 bbb を 1<b<p−11 < b < p-11<b<p−1からランダムに選択する

公開値を計算する

  1. Aliceは公開鍵 A=ga(modp)A=g^a \pmod pA=ga(modp)を計算し、Bobへ送信する

  2. Bobは公開鍵 B=gb(modp)B=g^b \pmod pB=gb(modp)を計算し、Aliceへ送信する

お互いローカルで共通秘密鍵を計算する

  1. Aliceは共通秘密鍵 s=Ba(modp)s=B^a \pmod ps=Ba(modp) を計算する

  2. Bobは共通秘密鍵 s=Ab(modp)s=A^b \pmod ps=Ab(modp) を計算する

そしてAliceとBobは共通秘密鍵sssを共有することをできました

Elgamal暗号化 (Elgamal Encryption)

コミットメント (Cryptographic Commitment)

Cryptographic Commitmentは、ある値を選択し、その選択を固定しつつ、後で公開するまでその値を秘密にしておく方法です。簡単に言えば、デジタルの世界での封筒のようなものです。

コミットメントには、主に2つの重要な特性があります。

  • Binding(拘束性): 一度コミットした値を後から変更することはできません。これは、封筒に入れた手紙を後から書き換えられないのと同じです。

  • Hiding(隠蔽性): コミットメントを受け取った人は、それが開示されるまで中身を知ることができません。これは、封筒を開けるまで中身が分からないのと同じです。

コミットメントの分かりやすい例として、AliceとBobがオンラインでコイントスをするアプリケーションを考えてみましょう。

  1. アリスがコインの表裏を予想し、その予想をコミットメントとして送信します。

  2. ボブがコインを投げ、結果を発表します。

  3. アリスが自分の予想を公開し、コミットメントを開示します。

  4. ボブはアリスの予想がコミットメントと一致するか確認します。

これにより、お互いに不正ができない公平なコイントスが実現できます。

Cryptographic Commitmentは、ゼロ知識証明においても重要な役割を果たします。Prover(証明者)は、証明の一部をコミットメントとして事前に提示し、後でVerifier(検証者)の選択に応じて必要な情報だけを開示することができます。

また、Lamport署名方式など、一部のデジタル署名システムでもCryptographic Commitmentが使用されています。署名者は秘密の値にコミットし、後で部分的に公開することで署名を生成します。

さらに、MPC(マルチパーティ計算)においてもCryptographic Commitmentは重要な役割を果たしています。

  • 入力の確定: 参加者は自身の入力にコミットすることで、計算途中で入力を変更できないようにします。

  • 計算の公平性: 全ての参加者が入力を提供した後にのみ計算が進行することを保証します。

  • 検証可能性: 計算過程や結果の正当性を検証する際に、コミットメントが重要な役割を果たします。

Pedersenコミットメント (Pedersen Commitment)

Cryptographic Commitmentを実現する高度なコミットメントスキームの一つとしてPedersen Commitmentがあります。

Pedersen Commitmentは以下のような手順で機能します:

  1. セットアップ:

    • 大きな素数位数qqqを持つ群GGGを選びます。

    • その群の中から二つの生成元g,hg, hg,hをランダムに選びます。

    • G,q,g,hG, q, g, hG,q,g,hは公開パラメータとなります。

  2. コミットメントの生成:

    • コミットしたい値mmmと、ランダムな値rrr(000からq−1q-1q−1の範囲)を選びます。

    • コミットメントC=gm×hrC = g^m \times h^rC=gm×hrを計算します。

    • CCCを公開します。

  3. コミットメントの開示と検証:

    • 後で、mmmとrrrを公開します。

    • 検証者はC==gm×hrC == g^m \times h^rC==gm×hrを確認します。

また、Pedersen Commitmentには、以下のような特徴があります:

  • Binding(拘束性): コミットメントを生成した後、異なる値m′m'm′とr′r'r′で同じCCCを生成することは計算量的に不可能です。

  • Hiding(隠蔽性): コミットメントCCCからmmmの情報を得ることは、離散対数問題を解くのと同じくらい困難です。

  • 準同型性: 二つのコミットメントC1=gm1×hr1C1 = g^{m1} \times h^{r1}C1=gm1×hr1とC2=gm2×hr2C2 = g^{m2} \times h^{r2}C2=gm2×hr2があるとき、C1×C2=gm1+m2×hr1+r2C1 \times C2 = g^{m1+m2} \times h^{r1+r2}C1×C2=gm1+m2×hr1+r2となります。これは、コミットメントを開示せずに加算操作ができることを意味します。

ハッシュベースのコミットメントスキーム(例:C=H(m∣∣r)C = H(m || r)C=H(m∣∣r))と比較すると、Pedersen Commitmentには以下のような利点があります:

  1. 無条件の隠蔽性: 計算能力に関係なく、CCCからmmmの情報を得ることは不可能です。

  2. 準同型性: コミットメントを開示せずに、加算などの演算が可能です。

一方で、Pedersen Commitmentは離散対数問題の難しさに依存しているため、将来的に量子コンピュータなどでこの問題が解決されると、Binding性が失われる可能性があります。

楕円曲線暗号 (Elliptic Curve Cryptography)

楕円曲線暗号は、有限体上の楕円曲線の整数点の集合をアーベル群として利用した非対称暗号です。

RSAと比べると、同じビット数のセキュリティーに対して、鍵の大きさが小さいメリットがあり、計算の効率化が重視されています。

ECDSA (Elliptic Curve Digital Signature Algorithm)

Schnorr署名と似ているようなデジタル署名であるが、利用している群を整数乗法群から有限体上の楕円曲線の整数点の集合群に切り替えたと認識した方が理解しやすいかと思います。

例: AliceはBobへあるメッセージ mmm を送信し、そのメッセージが自分から作成し、改変されていないことを証明したい。

プロトコル

Aliceの事前準備

  1. 利用する楕円曲線 EEE , 素数 ppp とそれに基づく次数 nnn の有限体上の楕円曲線の整数点の集合

  2. ベースポイント GGG

  3. 1<Sk<n−11<S_k<n-11<Sk​<n−1 を満たす秘密鍵 SkS_kSk​

  4. Pk=Sk⋅GP_k=S_k \cdot GPk​=Sk​⋅G

  5. ハッシュ関数 HHH

  6. SkS_kSk​ 以外の情報を全部共有する

Aliceはメッセージ mmm に署名する

  1. 1<k<n−11<k<n-11<k<n−1 を満たすnonce kkk を選択する

  2. r=(x1,y1)=kGr=(x_1,y_1)=kGr=(x1​,y1​)=kG を計算する

  3. メッセージをハッシュし、 h=H(m)h=H(m)h=H(m) を計算する

  4. r=x1(modn)r=x_1 \pmod nr=x1​(modn) を計算する

  5. s=k−1(h+rSk)(modn)s=k^{-1}(h+rS_k) \pmod ns=k−1(h+rSk​)(modn) を計算する

  6. (m,r,s)(m,r,s)(m,r,s) をBobへ送信する

Bobは (s,e)(s,e)(s,e)に基づいて mmm を検証する

  1. ローカルで h=H(m)h=H(m)h=H(m) を再現する

  2. c=s−1(modn)c=s^{-1} \pmod nc=s−1(modn) を計算し、 u1=h⋅c,u2=r⋅cu_1=h \cdot c, u_2=r \cdot cu1​=h⋅c,u2​=r⋅c を計算する

  3. r==u1⋅G+u2⋅Pk=hc⋅G+rc⋅Pk=c(h⋅G+r⋅Pk)=s−1(h⋅G+r⋅G⋅Sk)=(hG+rG⋅Sk)k−1(h+r⋅Sk)=G(h+r⋅Sk)k−1(h+r⋅Sk)=Gk−1=kG=r(modn)\begin{aligned} r &== u_1 \cdot G + u_2 \cdot P_k \\&= h c \cdot G + rc \cdot P_k \\&= c (h \cdot G + r \cdot P_k) \\&= s^{-1}(h \cdot G + r \cdot G \cdot S_k) \\&= \frac {(hG + rG \cdot S_k)} {k^{-1} (h+r \cdot S_k)} \\&= \frac {G(h + r \cdot S_k)} {k^{-1} (h+r \cdot S_k)} \\ &= \frac G {k^{-1}} = kG = r \pmod n \end{aligned}r​==u1​⋅G+u2​⋅Pk​=hc⋅G+rc⋅Pk​=c(h⋅G+r⋅Pk​)=s−1(h⋅G+r⋅G⋅Sk​)=k−1(h+r⋅Sk​)(hG+rG⋅Sk​)​=k−1(h+r⋅Sk​)G(h+r⋅Sk​)​=k−1G​=kG=r(modn)​を検証する

BLS署名 (Boneh-Lynn-Shacham Signature)

ペアリング暗号 (Pairing Based Cryptography)

Previous算術回路NextWeek 2 さらなる暗号技術とSNARKsとSTARKs

Last updated 7 months ago

λ(n)=lcm(p−1,q−1)\lambda(n) =lcm(p -1,q-1)λ(n)=lcm(p−1,q−1) ()

d≡e−1(modλ(n))d \equiv e^{-1} \pmod{\lambda(n)}d≡e−1(modλ(n))を満たす暗号鍵 dddを選択する ()

カーマイケル関数
拡張ユークリッド互除法