原文标题:《从零开始学习 zk-SNARK(二)——多项式的非交互式零知识证明》 ——even@ 安比实验室 作者:Maksym Petkus 翻译 & 注解:even@ 安比实验室([email protected]) 校对:valuka@ 安比实验室 本系列文章已获作者中文翻译授权。 限制多项式 上文说到,多项式的知识其实就是它的系数 c0, c1, …, ci 的知识。协议中我们是通过对秘密值 s 的幂的加密值再进行求幂来对系数进行「赋值」。我们已经限制了 prover 对 s 幂的加密值的选择, 但是这个限制并不是强制的,也就是说,prover 可以使用任何可能的方法找到满足下面等式的值 zp 和 zh 解决这个问题的一种方法就是用另一个「变换」的加密值做同样的操作,充当类似算术中「校验和」(Checksum)的作用,以此确保结果是原始值的求幂值。 这个是通过 Knowledge-of-Exponent Assumption (简称 KEA) 方法来实现的,在 [Dam91] 中有介绍,更精准一点(注意 a 和 α(alpha) 这两个字符的不同)说: a)Alice 有一个值 a,她想要 Bob 对其进行任意指数的求幂(这里 a 是一个有限域群的生成器),唯一的要求是只能对 a 进行求幂,为了保证这一点,她要: 选择一个随机数 α 计算 a' = a α(mod n) 提供一个元组 (a, a') 给 Bob, 然后让他对这两个值执行任意的求幂运算,返回结果元组 (b, b'),这里的指数「α-变换」依然保持不变,即 bα = b'(mod n) b) 因为 Bob 无法从元组 (a, a') 中提取 α 的值,通过暴力破解也难以实现,那就可以推断 Bob 生成有效元组的唯一方法就是执行下面的步骤: 选择一个值 c 计算 b=(a)c(mod n) 和 b' = (a')c (mod n) 回复 (b,b') c) 有了回复的元组和 α,Alice 就可以验证等式: (b)α = b' (ac)α = (a')c ac·α = (aα)c 结论是: Bob 在元组的两个值的计算上都用了同一个指数(即 c) Bob 只能用 Alice 原本的元组来保持 α 关系 Bob 知道指数 c,因为构造验证值 (b,b′) 的唯一方式是用同一个指数 Alice 并不知道 c,这和 Bob 不知道 α 的原因一样 虽然 c 是被加密的,但它的可能取值范围并不足够大到保持其零知识的性质,这个问题我们将在后面「零知识」那一节解决。 最后这个协议提供了一个证明给 Alice,Bob 确实是用他知道的某个值对 a 进行求幂的,而且他也不能做别的任何操作,例如:乘法,加法,因为这样就会破坏 α-变换关系。 在同态加密中,求幂是对被加密值进行乘法运算。我们可以应用这个结构到一个简单的系数多项式 f(x) = c? x 的例子中: 这个结构「限制」prover 只能用 verifier 提供的加密的 s 进行计算,因而 prover 只能将系数 c 赋给 verifier 提供的多项式。现在我们可以扩展这种单项式上的方法到多项式上,因为计算是先将每项的分配分开计算然后再「同态地」相加在一起的(这个方法是 Jens Groth 在 [Gro10] 中介绍的)。所以如果给定 prover 一个指数为 s 的幂以及它们的变换的加密值,他就可以计算原始的和变换后的多项式,这里也必须要满足同样的校验。对于阶数为 d 的多项式: 现在我们就可以确保 prover 是用了 verifier 提供的多项式而不是其它值做计算的了,因为别的方法不能够保持 α-变换。当然如果 verifier 想要确保在 prover 的多项式中排除了 s 的某些次幂,如 j,他就不提供对应的密文及其变换: 与前面的协议相比,我们现在已经有了一个比较健壮的协议。但是尽管已经做了加密,在零知识 性质上也还依然存在一个很明显的缺陷:即理论上多项式参数 c? 是一个很广的取值范围内的值,实际上这个范围可能很有限(比如前面例子中的 6),这就意味着 verifier 可以在有限范围的系数组合中进行暴力破解,最终计算出一个与 prover 的答案相等的结果。比如我们将每个系数的取值范围定为 100,多项式阶数为 2,那么大概会有 100 万种不同的组合,这里可以认为暴力破解只需要少于 100 万次的迭代。更重要的是,即使在只有一个系数,值为 1 的例子中,安全协议也应该能够保证其安全。 注解 even@ 安比实验室: 有了 KEA,就可以约束 prover 只能通过用 verifier 提供的加密值去构造证明了。严格点讲,这里是用的是 KEA 的扩展版本,叫做 The q-power Knowledge of Exponent Assumption. 零知识证明 因为 verifier 能够从 prover 发送的数据中提取未知多项式 p(x) 的知识,那么我们就来看一下这些提供的数据(证明): 注意零知识是如何轻而易举地融入到这个结构中去的,这通常也被称为"无成本的"零知识。 注解 even@ 安比实验室: 借助这个」无成本的」技巧,就可以轻松实现零知了。但是这里实现零知识的方法和实际中的 Pinocchio 协议,还有 Groth16 方案略有不同。实际方案中是用乘法乘以 δ^(δ·t(s))。 非交互式 到现在为止,我们已经讲完了一个交互式的零知识方案。但为什么我们还需要有非交互式呢?因为交互式证明只对原始的 verifier 有效,其他任何人(其他的 verifier)都不能够信任这个证明,因为: verifier 可以和 prover 串通,告诉他密码参数 s, α,有了这些参数 prover 就可以伪造证明,就像前面 remark 3.1 提到的那样。 verifier 也可以使用同样的方法自己伪造证明。 verifier 必须保存 α and t(s) 直到所有相关证明被验证完毕,这就带来了一个可能造成秘密参数泄漏的额外攻击面。 因而 prover 就需要分别和每个 verifier 做交互来证明一个陈述(就是例子中指的多项式的知识)。 尽管交互式证明也有它的用处,例如一个 prover 只想让一个特定的 verifier(称为目标 verifier,更多的信息参见 [JSI96])确信,就不能再重复利用同一个证明去向别人证明这个声明了,但是当一个 prover 想让众多的参与者同时或者永久地确信的话,这种方法就很低效了。prover 需要保持一直在线并且对每一个 verifier 执行相同的计算。 因而,我们就需要一个可以被重复使用,公开,可信,又不会被滥用的秘密参数。 我们先来思考一下如何在构造出秘密值 (t(s),α) 构造之后保证它的安全性。我们可以对其进行加密,方式与 verifier 在发送加密值给 prover 之前对 s 的幂使用的加密方式一致。但是 remark 3.2 中提到,我们使用的同态加密并不支持两个秘密值相乘,这一点对 t(s) 和 h 的加密值相乘以及 p 和 α 的加密值相乘的验证都很重要。这个问题适合用 Pairing 配对操作来解决。 注解 even@ 安比实验室:这里非交互的证明协议将对参数加密,但引入了两个问题: 1)同态加密无法对两个加密值做乘法,那如何验证加密后的参数呢? 2)加密值一旦泄露,协议的信任关系将无法保证,如何确保参数的安全性? 加密值相乘 配对操作(双线性映射)是一个数学结构,表示为函数 e(g,g),它给定一个数据集中的两个加密的输入(即 ga, gb),可以将他们确定性地映射到另一组不同的输出数据集上的它们的乘积,即 e(ga, gb) = e(g, g)ab: 因为源数据集和输出数据集(通常被称为一个 group)是不同的,所以一个配对的结果不能用做其他配对计算的输入。我们可以将输出集(也称为「目标集」)视为「不同的宇宙」。因而我们不能用另一个加密值乘以结果,而且配对这个名称本身也表明了,我们一次只能将两个加密值相乘。
区块律动 BlockBeats 提醒,根据银保监会等五部门于 2018 年 8 月发布《关于防范以「虚拟货币」「区块链」名义进行非法集资的风险提示》的文件,请广大公众理性看待区块链,不要盲目相信天花乱坠的承诺,树立正确的货币观念和投资理念,切实提高风险意识;对发现的违法犯罪线索,可积极向有关部门举报反映。 —- 编译者/作者:区块律动BlockBeat 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
【零知识证明】zk-SNARK(二)——多项式非交互式零知识证明
2020-01-27 区块律动BlockBeat 来源:区块链网络
- 上一篇:超过77个加密项目声称得到实物黄金的支持
- 下一篇:世界经济论坛发起全球加密治理联盟
LOADING...
相关阅读:
- SUTER强势登陆国际一线交易所BITTREX Global2020-08-04
- SUTER强势登陆B网 百倍计划初现端倪2020-07-31
- 区块链的价值在DNC上将体现到极致2020-07-30
- 技术简述 ZK Rollup 与 Validium 等零知识证明方案如何扩展区块链性能2020-07-29
- 零知识证明与区块链扩展2020-07-29