Greetings! New to Zcash?
The Zcash network is young, but evolving quickly! Sign up and we'll be in touch with monthly highlights on ecosystem growth, network development and how to get started with Zcash!

言語

Rustのペアリング暗号

Sean Bowe | Jul 06, 2016

ペアリング暗号 は刺激的な研究分野であり、Zcashの zkSNARKs の必須コンポーネントです。ユーザーが個人情報を開示することを要求することなくトランザクションが有効であることを証明します。 今年の初めに、Bitcoinの 初のゼロ知識の偶発的支払い を行うためにzkSNARKを使用しました!

今後の目標の1つは、これらのツールの仕組みをよりよく説明し、さらにアクセスしやすく することです。最初のステップとして、「bn」と呼ばれるRust用の ペアリング暗号 ライブラリの開発に着手しています。ペアリング暗号はzkSNARKにとって大変重要ですが、実際のところ何なのでしょうか?

楕円曲線

ビットコインで使用される secp256k1 のような正規の 楕円曲線 構造は、 デジタル署名 などの用途で設計されます。曲線上の点は サイクリックグループ を形成し、お互いに足したりスカラー倍で掛け合わせたりすることができます。 被乗数に指定された点と、商の点を見つけるのは不可能と信じられており、 「楕円曲線の離散対数問題」と呼ばれています。

この一方向性(乗算は簡単でも逆は困難)が、いくつかの便利なツールやプロトコルを作成するために使われています。次のDiffie-Hellmanの鍵交換がシンプルな例です。 AliceはBobの公開鍵をAliceの(スカラー数の)秘密鍵で掛け合わせ、反対にBobもそのようにすることで、盗聴の可能性がある中で共有シークレットを見つけます。

この鍵交換プロトコルは、3者に拡張できますが次のように2ラウンドが必要です。 AB、および`C`の3者の場合、A`が共有シークレットを取得するには、次のようにします。`B がBの公開鍵を C に送信し、C はそれをCの秘密鍵を掛け合わせて、その結果をAに送り、A は、Aの秘密鍵を掛け合わせることで、共有シークレットを導き出せます。

ペアリング暗号

ペアリング暗号化は、これらの概念を拡張したものです。ここで、後から記述された*2つの*サイクリックグループ(\(G_{1}\)) と、e: \(G_{1} \times G_{2} \rightarrow G_{T}\) という形式を持つ3番目のサイクリックグループへのマッピングがあるとします。\(G_{T}\) は乗法で記述されます。このマッピングが バイリニア である場合、次のようになります。

\(e(a g_{1}, b g_{2}) = e(g_{1}, g_{2})^{ab}\) の場合、\(a\) および \(b\) はスカラーであり、 \(g_{1}\) および \(g_{2}\) 各グループのジェネレータです。

基本的に、最初の2グループの要素のうちいずれかのスカラー乗法は、最終グループの 要素の累乗法と同等です。

Jouxのキーアグリーメントプロトコル

ペアリング暗号化を、上に示した3者間の鍵交換のシナリオに当てはめてみましょう。ペアリングを使用すると、交換を 1ラウンド で実行できます。各当事者 \(P\) がそれぞれの公開鍵 \(P^{pk} = (P^{sk} g_{1}, P^{sk} g_{2})\) を公開し、秘密鍵 \(P^{sk}\) の機密性を保ちます。すべての当事者 \(A, B, C\) がバイリニアペアリング関数を使用して同じ共有シークレットを計算できます。

Aliceの計算 Bobの計算 Carol計算
\(e(B_{1}^{pk}, C_{2}^{pk})^{A^{sk}}\) \(e(C_{1}^{pk}, A_{2}^{pk})^{B^{sk}}\) \(e(A_{1}^{pk}, B_{2}^{pk})^{C^{sk}}\)
すべてが以下と同等: \(e(g_{1}, g_{2})^{A^{sk} B^{sk} C^{sk}}\)

コードをご希望の場合は、新しいライブラリにある例を参照してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 // 秘密鍵の生成
 let alice_sk = Scalar::random(rng);
 let bob_sk = Scalar::random(rng);
 let carol_sk = Scalar::random(rng);

 // G1とG2で公開鍵を生成
 let (alice_pk1, alice_pk2) = (G1::one() * &alice_sk, G2::one() * &alice_sk);
 let (bob_pk1, bob_pk2) = (G1::one() * &bob_sk, G2::one() * &bob_sk);
 let (carol_pk1, carol_pk2) = (G1::one() * &carol_sk, G2::one() * &carol_sk);

 // それぞれの当時者が共有秘密を計算します
let alice_ss = pairing(&bob_pk1, &carol_pk2) ^ &alice_sk;
let bob_ss = pairing(&carol_pk1, &alice_pk2) ^ &bob_sk;
let carol_ss = pairing(&alice_pk1, &bob_pk2) ^ &carol_sk;

 assert!(alice_ss == bob_ss && bob_ss == carol_ss);

bn

「bn」クレートは、弊社の [BCGTV14] 研究員により設計された暗号化構造を使用したペアリングオペレーションを行うための Rust言語 ライブラリです。zkSNARKsでの使用に合わせたBarreto-Naehrig楕円曲線を使用しています。 ライブラリは新しく未完成のため、生産ソフトウェアには使用できませんが、この種類の新しい暗号の理解を広め、 使いやすくするという目標に一歩近づきました。

bnクレートについては、 github または crates.io でご確認ください! ZcashのSlack への参加や、 Zcashチームからの メール通知 への登録も、お気軽にどうぞ。