zkSNARK-密码学基础
本节接着上一节继续讲
零知识
因为验证者可能从证明者发送的信息抽取关于多项式 p ( x ) p(x) p(x)的更多信息,让我们考虑证明者提供的信息: g p , g p ′ , g h g^p,g^{p'},g^h gp,gp′,gh。主要做的验证: g p = ( g h ) t ( s ) , ( g p ) α = g p ′ g^p = (g^h)^{t(s)},(g^p)^{\alpha}=g^{p'} gp=(gh)t(s),(gp)α=gp′。这个问题是我们怎么进行有效的验证,信息还不被抽取呢?一个问答是:我们使用一个随机数 δ \delta δ偏移这些值,例如: ( g p ) δ (g^p)^{\delta} (gp)δ。现在,为了抽取这个知识,需要找到这个随机数,然而这是不可能。我们展示一下详细的偏移过程,证明者抽取随机数 δ \delta δ,并做为证明值的幂次: ( g p ( s ) ) δ , ( g h ( s ) ) δ , ( g α p ( s ) ) δ (g^{p(s)})^{\delta},(g^{h(s)})^{\delta},(g^{\alpha p(s)})^{\delta} (gp(s))δ,(gh(s))δ,(gαp(s))δ,发送给验证者核验: ( g p ) δ = ( ( g h ) δ ) t ( s ) , ( ( g p ) δ ) a l p h a = ( g p ′ ) δ (g^p)^{\delta}=((g^h)^{\delta})^{t(s)},((g^p)^{\delta})^{alpha}=(g^{p'})^{\delta} (gp)δ=((gh)δ)t(s),((gp)δ)alpha=(gp′)δ。
非交互性
从上述方案来看,我们设计的是一个交互式零知识证明方案。为什么是这种情况呢?因为证明只对原始的验证者有效,没有人(其他验证者)可以信任相同的证明,因为:
- 验证者可能与证明者勾结,揭露那些允许伪造证明的秘密参数 s , α s,\alpha s,α
- 验证者自己也可以出于同样的原因生成假证明
- 验证者一定要存储 α , t ( s ) \alpha ,t(s) α,t(s),直到相关证明被验证,这就使得额外的攻击可能会泄露秘密参数
因此,为了证明一个陈述(在这种情况下是多项式的知识),需要与每个验证者进行单独的交互。而交互式证明系统也有它的用例,例如当一个证明者只想说服一个专门的验证者,这样证明就不能被重复用来向其他人证明相同的陈述,当一个人需要同时(例如,在像区块链这样的分布式系统中)或永久地说服许多人时,它是非常低效的。证明者将被要求一直保持在线,并对每个验证程序执行相同的计算。因此,我们需要秘密参数是可重用的,公开的,值得信任的和不可滥用的。我们需要如何安全的保护产生的参数 ( t ( s ) , α ) (t(s), \alpha) (t(s),α),我们可以用验证者在发送给证明者之前加密 s s s的相同方式加密它们。然而,我们使用的同态加密不支持两个加密值的相乘,这对于 t ( s ) t(s) t(s)和 h h h的加密相乘以及 p p p和 α α α的加密相乘的验证检查都是必需的,因此,引出下述方法。
加密值乘法(Multiplication of Encrypted Values)
密码配对(双线性映射)是一种数学结构,表示为一个函数 e ( g ∗ , g ∗ ) e(g^*,g^*) e(g∗,g∗),考虑到两个加密的输入(例如: g a , g b g^a,g^b ga,gb)从一组数据允许它们映射确定性乘积表示的一组不同的输出的数字,例如: e ( g a , g b ) = e ( g , g ) a b e(g^a,g^b)=e(g,g)^{ab} e(ga,gb)=e(g,g)ab。
由于源数集和输出数集是不同的,因此配对的结果不能作为另一个配对操作的输入。我们可以将输出集(也称为目标集)视为来自另一个世界。因此,我们不能将结果乘以另一个加密的值,根据名称本身的建议,我们一次只能将两个加密的值相乘。在某种意义上,它类似于一个哈希函数,它将所有可能的输入值映射到可能输出值集合中的一个元素,而且它不是简单的可逆的。
双线性映射函数 e ( g ∗ , g ∗ ) e(g^*,g^*) e(g∗,g∗)的一个基本的(技术上不正确的)数学类比是,有一种方法可以交换每个输入的底数和指数,这样底数 g g g在转换为指数的过程中被修改,例如, g a → a g g^a \to a^g ga→ag。然后将交换后的两个输入相乘,使原始的a和b值在相同的指数下相乘, e ( g a , g b ) = a g ⋅ b g = ( a b ) g e(g^a,g^b)=a^g \cdot b^g=(ab)^g e(ga,gb)=ag⋅bg=(ab)g。因此,由于在交换过程中使用另一个配对中的结果 ( a b ) g (ab)^g (ab)g(例如, e ( ( a b ) g , g c ) e((ab)^g,g^c) e((ab)g,g