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に安全に送信したい。
鍵生成
Aliceは鍵長を選択する(128, 192, または 256ビット)
選択した長さのランダムな鍵Kを生成する
鍵拡張アルゴリズムを使用して、ラウンド鍵K0,K1,...,Krを生成する (rは総ラウンド数:128ビット鍵で10、192ビット鍵で12、256ビット鍵で14)
暗号化
平文Mを128ビット(16バイト)のブロックに分割する
各ブロックに対して以下の操作を行う:
AddRoundKey: ブロックとK0をXOR
r−1回の主ラウンドを実行:
SubBytes: 各バイトをS-boxを用いて置換
ShiftRows: 行ごとに左循環シフト
MixColumns: 列ごとに線形変換
AddRoundKey: 状態とKiをXOR
最終ラウンド:
SubBytes
ShiftRows
AddRoundKey(Krを使用)
暗号文Cを出力
復号化
暗号文Cを128ビット(16バイト)のブロックに分割する
各ブロックに対して以下の操作を行う:
AddRoundKey: ブロックとKrをXOR
r−1回の逆主ラウンドを実行:
InvShiftRows: 行ごとに右循環シフト
InvSubBytes: 各バイトを逆S-boxを用いて置換
AddRoundKey: 状態とKiをXOR
InvMixColumns: 列ごとに逆線形変換
最終ラウンド:
InvShiftRows
InvSubBytes
AddRoundKey(K0を使用)
平文Mを出力
注意点
AESは有限体GF(28)上で動作する
SubBytesステップでは、バイトの乗法逆元を求めた後にアフィン変換を適用
MixColumnsステップでは、固定の多項式との乗算を行う
鍵拡張アルゴリズムは、元の鍵から各ラウンドで使用する鍵を生成する複雑なプロセスを含む
非対称暗号: RSA (Rivest Shamir Adleman)
RSAは非対称暗号の一種。鍵生成、鍵共有、暗号化、復号三つのアルゴリズムで定義される。
例:BobはAliceに、危険な環境で安全に秘密を伝えたい。
鍵生成(暗号鍵、公開鍵)
Aliceは p,q 二つ素数をランダムに選び、下記二点を計算する
n=p⋅q
λ(n)=lcm(p−1,q−1) (カーマイケル関数)
1<e<λ(n)、そして gcd(e,λ(n))=1を満たす公開鍵eを選択する
d≡e−1(modλ(n))を満たす暗号鍵 dを選択する (拡張ユークリッド互除法)
Aliceは d,p,q,λ(n)を秘密鍵として保管し、(n,e)を公開鍵として公開する
暗号化
BobはAliceから共有された公開鍵 (n,e)を取得する
共有したい平文Mを整数mに変換し、0<m<nだと確認する( m>nの場合、メッセージが m(modn)に削減される)
c=me(modn)を計算する
暗号文cをAliceに送る
ハッシュ関数 (Hash Function)
SHA256 (Secure Hash Algorithm)
マークルツリー (Merkle Tree)
デジタル署名 (Digital Signature): Schnorr署名 (Schnorr Signature)
デジタル署名とは、非対称暗号を利用し、電子文書に対し暗号を用いた署名を付与することで、その電子文書が作成名義人によって作成されたこと、そして作成されて以降が改変されていないことを証明する技術です。
例: AliceはBobへあるメッセージ m を送信し、そのメッセージが自分から作成し、改変されていないことを証明したい。
プロトコル
Aliceの事前準備
大きな素数 p、そしてp−1を割り切れる素数 q
秘密鍵 x を 0<x<q から選択する
公開鍵 y=gx(modp) を作成する
qを法とする整数乗法群Zp∗
ハッシュ関数 H
Aliceはメッセージ m に署名する
nonce kを 0<k<p−1から選択する
r=gk(modp) を計算する
m と r を結合し、 e=H(m∣∣r)を計算する
s=k−xe(modq)を計算する
(s,e,m)をBobへ送信する
Bobは (s,e)に基づいて m を検証する
e′=H(m∣∣r)を計算する
e′==e であれば、Bobはメッセージ m はAliceが作成し、改変されず着信したことを証明できたとみなす。
離散対数に基づく公開鍵暗号学: Diffie-Hellman 鍵交換 (Diffie-Hellman Key Exchange)
AliceとBobの間、事前の秘密の共有無しに、盗聴の可能性のある通信路を使って、共通暗号鍵を構築する方法です。共通公開鍵を生成する過程までは非対称暗号を利用し、その後の交流は共通暗号鍵に基づく対照暗号を利用します。
Elgamal暗号化 (Elgamal Encryption)
コミットメント (Cryptographic Commitment)
Cryptographic Commitmentは、ある値を選択し、その選択を固定しつつ、後で公開するまでその値を秘密にしておく方法です。簡単に言えば、デジタルの世界での封筒のようなものです。
コミットメントには、主に2つの重要な特性があります。
Binding(拘束性): 一度コミットした値を後から変更することはできません。これは、封筒に入れた手紙を後から書き換えられないのと同じです。
Hiding(隠蔽性): コミットメントを受け取った人は、それが開示されるまで中身を知ることができません。これは、封筒を開けるまで中身が分からないのと同じです。
コミットメントの分かりやすい例として、AliceとBobがオンラインでコイントスをするアプリケーションを考えてみましょう。
アリスがコインの表裏を予想し、その予想をコミットメントとして送信します。
ボブがコインを投げ、結果を発表します。
アリスが自分の予想を公開し、コミットメントを開示します。
ボブはアリスの予想がコミットメントと一致するか確認します。
これにより、お互いに不正ができない公平なコイントスが実現できます。
Cryptographic Commitmentは、ゼロ知識証明においても重要な役割を果たします。Prover(証明者)は、証明の一部をコミットメントとして事前に提示し、後でVerifier(検証者)の選択に応じて必要な情報だけを開示することができます。
また、Lamport署名方式など、一部のデジタル署名システムでもCryptographic Commitmentが使用されています。署名者は秘密の値にコミットし、後で部分的に公開することで署名を生成します。
さらに、MPC(マルチパーティ計算)においてもCryptographic Commitmentは重要な役割を果たしています。
入力の確定: 参加者は自身の入力にコミットすることで、計算途中で入力を変更できないようにします。
計算の公平性: 全ての参加者が入力を提供した後にのみ計算が進行することを保証します。
検証可能性: 計算過程や結果の正当性を検証する際に、コミットメントが重要な役割を果たします。
Pedersenコミットメント (Pedersen Commitment)
Cryptographic Commitmentを実現する高度なコミットメントスキームの一つとしてPedersen Commitmentがあります。
Pedersen Commitmentは以下のような手順で機能します:
セットアップ:
大きな素数位数qを持つ群Gを選びます。
その群の中から二つの生成元g,hをランダムに選びます。
G,q,g,hは公開パラメータとなります。
コミットメントの生成:
コミットしたい値mと、ランダムな値r(0からq−1の範囲)を選びます。
コミットメントC=gm×hrを計算します。
Cを公開します。
コミットメントの開示と検証:
後で、mとrを公開します。
検証者はC==gm×hrを確認します。
また、Pedersen Commitmentには、以下のような特徴があります:
Binding(拘束性): コミットメントを生成した後、異なる値m′とr′で同じCを生成することは計算量的に不可能です。
Hiding(隠蔽性): コミットメントCからmの情報を得ることは、離散対数問題を解くのと同じくらい困難です。
準同型性: 二つのコミットメントC1=gm1×hr1とC2=gm2×hr2があるとき、C1×C2=gm1+m2×hr1+r2となります。これは、コミットメントを開示せずに加算操作ができることを意味します。
ハッシュベースのコミットメントスキーム(例:C=H(m∣∣r))と比較すると、Pedersen Commitmentには以下のような利点があります:
無条件の隠蔽性: 計算能力に関係なく、Cからmの情報を得ることは不可能です。
準同型性: コミットメントを開示せずに、加算などの演算が可能です。
一方で、Pedersen Commitmentは離散対数問題の難しさに依存しているため、将来的に量子コンピュータなどでこの問題が解決されると、Binding性が失われる可能性があります。
楕円曲線暗号 (Elliptic Curve Cryptography)
楕円曲線暗号は、有限体上の楕円曲線の整数点の集合をアーベル群として利用した非対称暗号です。
RSAと比べると、同じビット数のセキュリティーに対して、鍵の大きさが小さいメリットがあり、計算の効率化が重視されています。
ECDSA (Elliptic Curve Digital Signature Algorithm)
Schnorr署名と似ているようなデジタル署名であるが、利用している群を整数乗法群から有限体上の楕円曲線の整数点の集合群に切り替えたと認識した方が理解しやすいかと思います。
例: AliceはBobへあるメッセージ m を送信し、そのメッセージが自分から作成し、改変されていないことを証明したい。
プロトコル
Aliceの事前準備
利用する楕円曲線 E , 素数 p とそれに基づく次数 n の有限体上の楕円曲線の整数点の集合
ベースポイント G
1<Sk<n−1 を満たす秘密鍵 Sk
Pk=Sk⋅G
ハッシュ関数 H
Sk 以外の情報を全部共有する
Aliceはメッセージ m に署名する
1<k<n−1 を満たすnonce k を選択する
r=(x1,y1)=kG を計算する
メッセージをハッシュし、 h=H(m) を計算する
r=x1(modn) を計算する
s=k−1(h+rSk)(modn) を計算する
(m,r,s) をBobへ送信する
Bobは (s,e)に基づいて m を検証する
ローカルで h=H(m) を再現する
c=s−1(modn) を計算し、 u1=h⋅c,u2=r⋅c を計算する
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)
Last updated