您好!刚知道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的核心组成部分—无需要求用户揭示私有信息即可证明交易的有效性。今年的早些时候,我们也用zkSNARKs实现了比特币的 第一笔零知识有条件支付

我们的前进目标之一是更好地解释这些工具是如何工作的,让它们更为大众所熟悉。作为第一步,我们开始为Rust开发一个名为“bn”的 配对密码 学库。匹配密码学对zkSNARKs非常重要,但它究竟是什么呢?

椭圆曲线

常规的 椭圆曲线 例如比特币所用的 secp256k1 是被设计为用于 数字签名 等事务的。曲线上的点形成一个 循环群 :它们可以被加在一起,并可以被乘以标量。在给出一点和乘点时,找到被乘数几乎是不可能的,这被称为“椭圆曲线离散对数问题”。

这种非对称性被用于许多有用工具和协议。Diffie-Hellman秘钥交换就是一个简单的例子:Alice用他的私钥乘以Bob的公钥,反之亦然,以在存在窃听者的情况下发现一个共享的秘密。

秘钥交换协议可以被扩展到三方,但是需要进行两轮操作:对于A、B和C三方,A通过让B发送他的公钥给C获得共享的秘密,C用她的私钥乘以B的公钥,并将结果发送给A,A然后通过用自己的私钥乘以这个结果获得共享的秘密。

配对密码学

配对密码学是这些概念的一个扩展。现在想象一下,我们有两个循环群:\(G_{1}\)\(G_{2}\), 和向第三个循环群的映射e: \(G_{1} \times  G_{2} \rightarrow  G_{T}\) ,如果这一映射是双线性的,那么:

\(e(a g_{1}, b g_{2}) = e(g_{1}, g_{2})^{ab}\),其中 \(a\)\(b\)\(g_{2}\) 是各自群的生成器。

本质上,前两个群中的一个元素的标量乘法等于最有一组元素的幂。

Joux的秘钥协商协议

让我们将配对秘密学应用到上面提到的三方秘钥交换中。利用配对,我们在一轮操作中执行交换。每一方 \(P\) 公开他们的公钥 \(P^{pk} = (P^{sk} g_{1}, P^{sk} g_{2})\) ,并对他们的私钥 \(P^{sk}\) 进行保密。\(A, B, C\) 三方使用双线性配对函数都能计算出相同的共享秘密:

Alice Computes Bob Computes Carol Computes
\(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}}\)
All equivalent to \(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
// Generate private keys
let alice_sk = Scalar::random(rng);
let bob_sk = Scalar::random(rng);
let carol_sk = Scalar::random(rng);

// Generate public keys in G1 and 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);

// Each party computes the shared secret
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”是用于执行这些配对操作的 Rust编程语言 库,利用了我们的 科学家设计 的一个加密结构。 它使用一个Barreto-Naehrig椭圆曲线。这个库是新的、不完整的,不应该被应用到真实生成环境中,但是这是我们实现我们的目标—使得这一新的密码学更为人所知和易于使用—的第一步。

请在 github 或者 crates.io 上查看bn! 欢迎加入 我们的slack 或者注册我们的 邮件通知列表