零知识证明(zk-SNARK)- groth16(一)

全称为 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge,简洁非交互式零知识证明,简洁性使得运行该协议时,即便 statement 非常大,它的 proof 大小也仅有几百个bytes,并且验证一个 proof 的时间可以达到毫秒级别。
这是一个通用的零知识证明协议,可以用作各种证明,如范围证明。
核心方法是通过R1CS,QAP等方法将计算难题变为多项式,将计算结果正确性巧妙转化为了多项式的有特殊解的问题,生成对应proof,然后再运用多项式证明方法,来完成证明与验证。

Non-Interactive Argument of Knowledge of a Polynomial

(注意 计算和参数选取是在域内,即有模运算)

一般多项式的证明

场景如下:Verifier 有一个多项式 f ( x ) f(x) f(x),Prover 向 Verifer 证明他知道这一个多项式。
假设 Prover 知道的多项式为 p ( x ) p(x) p(x),那么现在要证明的就是 f ( x ) = p ( x ) f(x)=p(x) f(x)=p(x),如果这两个多项式的阶数最高为 d d d,那么两个多项式代表的曲线将最多有 d d d个交点,当 Verifier 随机在一个很大的范围内取一个值 s s s的时候,那么 s s s d d d相同的概率会非常低,所以有以下协议

  • Verifier 在大范围里随机选择一个值 s s s,并且在本地计算 f ( s ) f(s) f(s),然后把 s s s发送给 Prover
  • Prover 计算 p ( s ) p(s) p(s),然后发送给Verifier
  • Verifier 验证 f ( s ) = ? p ( s ) f(s)\overset{?}=p(s) f(s)=?p(s)

证明多项式的根

有些多项式是可以分解多个多项式的乘积的,如假设 p ( x ) = ( x − a ) ( x − b ) ( x − c ) p(x)=(x-a)(x-b)(x-c) p(x)=(xa)(xb)(xc)那么
假设 Prover 有一个多项式 p ( x ) p(x) p(x),现在他想证明他的多项式持有一部分根(部分多项式),也就是证明他的多项式 p ( x ) = t ( x ) h ( x ) p(x)=t(x)h(x) p(x)=t(x)h(x)中包含 t ( x ) t(x) t(x)假设为 ( x − a ) ( x − b ) (x-a)(x-b) (xa)(xb),而此时的 t ( x ) t(x) t(x)称为目标多项式,是公开的,要注意 Prover 是不能透露原多项式的。那么有以下协议

  • Verifier 在大范围内随机取值 s s s,计算 t = t ( s ) t= t(s) t=t(s),然后将 s s s发送给 Prover
  • Proer 计算 h ( x ) = p ( x ) t ( x ) h( x) = \frac {p(x)}{t(x)} h(x)=t(x)p(x), h ( s ) h(s) h(s), p ( s ) p(s) p(s),然后发送后两个给 Verifier
  • Verfier 验证 p ( s ) = ? t ( s ) h ( s ) p(s)\overset{?}=t(s)h(s) p(s)=?t(s)h(s)

显而易见以上变量都局限为整数,如果 p p p确实能够整除 t t t,那么等式一定是成立的,如果不能,那么式子将存在余式,有极大的概率不是整数。
当然此协议仍然有很大漏洞,比如 Prover 可能完全不知道 p ( x ) p(x) p(x),但知道公开的 t ( x ) t(x) t(x),所以可以完全捏造出 h ( x ) h(x) h(x)满足条件。

同态加密

显然我们不能在协议里进行明文的传输,但又需要密文的计算,所以需要一个满足加密和计算两种特性的算法。
同态加密算法 E ( x ) E(x) E(x),如 E ( a x + b y ) = g a x + b y = g a x ⋅ g b y = ( g x ) a ⋅ ( g y ) b = E ( x ) a ⋅ E ( y ) b . E(a x+b y)=g^{a x+b y}=g^{a x} \cdot g^{b y}=\left(g^{x}\right)^{a} \cdot\left(g^{y}\right)^{b}=E(x)^{a} \cdot E(y)^{b} . E(ax+by)=gax+by=gaxgby=(gx)a(gy)b=E(x)aE(y)b. g g g是生成元),这里基于离散对数难题和 CDH 假设(即给定 g a , g b g^a,g^b ga,gb,得到 g a b g^{ab} gab很困难)。显然这是仅仅满足同态加法的同态加密,不支持密文相乘。
那么该算法不支持乘法,仅有一个 s s s的情况下,该怎么同态计算多项式呢?显然是不行的,于是想办法把同态乘法转变为同态加法,注意到,多项式 P ( x ) P(x) P(x)可以看作是一组系数和未知数的线性结合,也就是计算出 s s s的各个幂次,这需要固定好多项式的阶数 d d d,相当于限制了多项式的阶数,这样提前计算出 s 1 , … , s d s^1,\dots,s^d s1,,sd,然后计算出多项式的每个部分相加即可。
具体使用如下,

  1. Verifier 在大范围里随机选择一个 s s s,先计算好 s s s的幂次 s 1 , … , s d s^1,\dots,s^d s1,,sd,接着计算 t ( s ) t(s) t(s),最后 E ( 1 ) , E ( s ) , … , E ( s d ) E(1),E(s),\dots,E(s^d) E(1),E(s),,E(sd)并发给 Prover
  2. Prover 收到数据后计算, h ( x ) = p ( x ) t ( x ) h( x) = \frac {p(x)}{t(x)} h(x)=t(x)p(x),然后配合多项式的系数计算 E ( p ( s ) ) E(p(s)) E(p(s)) E ( h ( s ) ) E(h(s)) E(h(s))并发送给Verifier
  3. Verifier 进行验证 E ( p ( s ) ) = ? E ( t ( s ) ) E ( h ( s ) ) E(p(s))\overset{?}=E(t(s))E(h(s)) E(p(s))=?E(t(s))E(h(s)),即 g p ( s ) = ( g h ( s ) ) t ( s ) g^{p(s)} = (g^{h(s)})^{t(s)} gp(s)=(gh(s))t(s)

** KCA(The Knowledge of Coefficient Test and Assumption)**

上面的协议的还是有很大漏洞,比如 Prover 在计算多项式的时候,没有采用多项式的格式(常数系数和未知数的线性组合),而是使用了另外的方法,算法找到一个满足 z p = ( z h ) t ( s ) z_p = (z_h)^{t(s)} zp=(zh)t(s)的两个值 z p , z h z_p,z_h zp,zh去替代掉 g p ( s ) , g h ( s ) g^{p(s)},g^{h(s)} gp(s),gh(s),也就是根本没用多项式,直接仿造了满足条件的结果。
这里就需要对 Prover 进行限制,让他必须使用满足条件的多项式,限定为常数,也限定了指数,不能随意改变指数。所以KCA也可以叫做KEA(Knowledge of exponent)
思路如下,
定义一对元素 ( a , b = α ⋅ a ) (a,b = \alpha \cdot a) (a,b=αa)(称为一个 α \alpha α-对), α ⋅ a \alpha \cdot a αa表示 α \alpha α a a a相加,也就是 a α a^\alpha aα,那么一个KC流程如下具体如下,

  1. 首先Verifier会随机选择一个非零的 α \alpha α,计算 b = α ⋅ a b = \alpha \cdot a b=αa,定义这是一个 α − s h i f t \alpha -shift αshift
  2. Verifier 发送这个 challenge pair ( a , b ) (a,b) (a,b)给 Prover。
  3. 这时候 Prover 会 respond 一对不一样,但具有相同性质的 pair ( a ′ , b ′ ) (a',b') (a,b),它应当是 α − s h i f t \alpha -shift αshift
  4. 如果收到的是一个 α − s h i f t \alpha -shift αshift,那么Verifier 接受这个response

注意,这是满足DL问题的, Prover 是很难找到一个 α \alpha α,那么她该如何构造新的 α − s h i f t \alpha -shift αshift呢?一个显而易见的方式是,Prover 选择一个常数系数 γ \gamma γ,直接构造 ( a ′ , b ′ ) = γ ( a , b ) (a',b') = \gamma(a,b) (a,b)=γ(a,b)
假设 Verifier 发送的不是一个,而是是 d d d α − s h i f t \alpha -shift αshift,那么 Prover 也将选择一组系数 c 1 , … , c d c_1,\dots,c_d c1,,cd,respond 一个
( a ′ , b ′ ) = ( ∑ i = 1 d c i a i , ∑ i = 1 d c i b i ) (a',b') = (\sum_{i=1}^d c_ia_i,\sum_{i=1}^d c_ib_i) (a,b)=(i=1dciai,i=1dcibi),显然该对也是满足 α − s h i f t \alpha -shift αshift。如果把 Verifier 发的内容优化一下,就构成了KCA。

Blind Evaluation of Polynomials Verifiable Protocol

完整的多项式盲验证协议。
解决整个问题需要满足的两个性质:

  • **Blindness:**也就是 Prover 不能获取到 s s s,同样 Verifier 也不能拿到 p ( x ) p(x) p(x)(同态)。
  • **Verifiability:**也就是得确保 Prover 发的 E ( p ( x ) ) E(p(x)) E(p(x))确实是用某个多项式 p ( x ) p(x) p(x)计算的,而不是完全不相关的数据(KCA)

那么使用KCA对前面协议进行优化如下,

  1. Verifier 随机选择 α \alpha α(非0)和 s s s,然后计算 t ( s ) t(s) t(s),接着构造 α − s h i f t \alpha -shift αshift ( g , g α ) , ( g s , g α ⋅ s ) , … , ( g s d , g α ⋅ s d ) (g,g^{\alpha}),(g^s,g^{\alpha \cdot s} ),\dots,(g^{s^d},g^{\alpha \cdot s^d}) (g,gα),(gs,gαs),,(gsd,gαsd)
  2. Prover 则使用多项式 p ( x ) p(x) p(x)的系数 c 1 , … , c d c_1,\dots,c_d c1,,cd,然后计算 E ( h ( s ) ) E(h(s)) E(h(s))以及 ( E ( p ( s ) ) , E ( α p ( s ) ) ) = ( g ∑ i = 1 d c i s i , g ∑ i = 1 d c i α ⋅ s d ) (E(p(s)),E(\alpha p(s))) = (g^{\sum_{i=1}^d c_is^i},g^{\sum_{i=1}^d c_i\alpha \cdot s^d}) (E(p(s)),E(αp(s)))=(gi=1dcisi,gi=1dciαsd),发送给Verifier
  3. Verifier进行验证 E ( p ( s ) ) = ? E ( α p ( s ) ) E(p(s))\overset ?=E(\alpha p(s)) E(p(s))=?E(αp(s)) E ( p ( s ) ) = ? E ( t ( s ) ) E ( h ( s ) ) E(p(s))\overset{?}=E(t(s))E(h(s)) E(p(s))=?E(t(s))E(h(s))即可

该方案也可以解决前面的问题,即Prover 不能随意构造满足类似 z p = ( z h ) t ( s ) z_p = (z_h)^{t(s)} zp=(zh)t(s) h ( s ) h(s) h(s),这样会很容易不满足 α − s h i f t \alpha -shift αshift的限制条件。

Parings and bilinear map

前面的协议基本实现了诚实两方之间的交互方案,相关的 proof 仅仅在两方之间有效,无法重复使用,但在实际运用中,存在这恶意的多方的情况,这显然不符合实际。所以,需要让一些秘密参数变得可重复使用甚至公开,而且足够可信以防止滥用。
首先考虑将 Verifier 生成的 ( t ( s ) , α ) (t(s),\alpha) (t(s),α)进行加密保护,防止泄露。如果采用前面的同态加密,那么在后面的乘法计算中就会涉及到同态的乘法 ,但是前面用的同态算法不支持同态乘法。那么必须用到类似乘法的时候应该怎么办呢?这时候就引入了椭圆双曲线映射。
Parings 是能够将一个集合里的两个加密输入确定性的映射到另一个集合里的一个输出的一种乘法表示函数。
即: e : G × G → G T e: \mathbb{G} \times \mathbb{G} \rightarrow \mathbb{G}_T e:G×GGT满足以下性质
e ( g 1 a , g 2 b ) = e ( g 1 , g 2 ) a b = e ( g 1 a b , g 2 ) = e ( g 1 , g 2 a b ) \begin{aligned}e(\mathrm{g_1^a,g_2^b})&=\mathrm{e(g_1,g_2)^{ab}=e(g_1^{ab},g_2)=e(g_1,g_2^{ab})}\end{aligned} e(g1a,g2b)=e(g1,g2)ab=e(g1ab,g2)=e(g1,g2ab)
e ( g 1 a , g 2 b ) e ( g 1 c , g 2 d ) = e ( g 1 , g 2 ) a b + c d \begin{aligned} e(\mathrm{g_1^a,g_2^b})e(\mathrm{g_1^c,g_2^d})&=\mathrm{e(g_1,g_2)^{ab+cd}}\end{aligned} e(g1a,g2b)e(g1c,g2d)=e(g1,g2)ab+cd
其意义在于,将某个群中的一对元素映射到一个新的群,当且仅当两个原像对应指数的积相同其像也相同。并且,该函数要求是可计算的(即不需要用暴力搜索等方式),它能够验证一对(加密后的)数据的乘积是否和另一对相同(虽然算不出这个乘积)
接下来将协议的计算放到满足Parings的椭圆曲线群上来。

Multiple Parties Composite Common Reference String

首先引入一个可信的第三方来随机生成 s s s α \alpha α,并且计算出CRS(Common Reference String),共证明和验证两部分,都是公开的( i ∈ { 0 , … , d } i \in \{0,\dots,d\} i{0,,d}),接着需要删除掉 s s s α \alpha α

  • Proving Key: E ( s i ) , E ( α s i ) = g s i , g α s i E(s^i),E(\alpha s^i) = g^{s^i},g^{\alpha s^i} E(si),E(αsi)=gsi,gαsi
  • Verification Key: E ( t ( s ) ) , E ( α ) = g t ( s ) , g α E(t(s)),E(\alpha) = g^{t(s)},g^{\alpha} E(t(s)),E(α)=gt(s),gα

接着基于CRS,让 Prover 和 Verifier 仅仅通过CRS就能完成协议。继续优化协议如下,(下面简化 p = p ( s ) , t , h p=p(s),t,h p=p(s),t,h也类似)

  • 对于 Prover 来说,公开的CRS中已经包含了第一步的内容,接下来是利用 Proving Key 来计算出 E ( h ( s ) ) E(h(s)) E(h(s)) ( E ( p ( s ) ) , E ( α p ( s ) ) ) (E(p(s)),E(\alpha p(s))) (E(p(s)),E(αp(s)))
  • 对于Verifier来说,是利用CRS中的 Verfication来进行验证( p ′ = α p p' = \alpha p p=αp
    • 首先验证 p = t ⋅ h p=t \cdot h p=th,即 e ( g p , g 1 ) = e ( g t , g h ) = e ( g , g ) p = e ( g , g ) t ⋅ h e(g^p,g^1) = e(g^t,g^h) = e(g,g)^p = e(g,g)^{t \cdot h} e(gp,g1)=e(gt,gh)=e(g,g)p=e(g,g)th
    • 然后验证 α − s h i f t \alpha -shift αshift,即 e ( g p , g α ) = e ( g p ′ , g ) e(g^p,g^\alpha) = e(g^{p'},g) e(gp,gα)=e(gp,g)

注意:这里也暴露出两个问题,

  1. Proving Key 中的 E ( α ) E(\alpha) E(α)是公开的,也就是对于 Prover 来说 ,他是可以打破多项式的限制条件的。
  2. 引入了一个可信第三方,但更复杂的现实中不能保证第三方不存在恶意,比如不销毁 trusted setup 的随机秘密,这一旦暴露会导致任何人都可以伪造证明。

于是 ZKSNARK 引入了多方联合的setup,每个人用自己的私钥 ( α , s ) (\alpha,s) (α,s)和前一个人生成的 CRS 作为输入生成一个新的 CRS,只要保证有一个人销毁了私钥,就能保证最终的CRS是安全的。具体实现如下,
假设有三方 Alice,Bob,Carol 参与,仅需要使用同态乘法让每个人的私钥相加即可
image.png
同理参与方 Carol 公开后也可以进行验证。

完整的简短非交互式的多项式证明方案

这里用 { g s i } i ∈ [ d ] \{g^{s^i}\}_{i\in[d]} {gsi}i[d]代表 s 1 , … , s d s^1,\dots,s^d s1,,sd
首先确定好目标多项式 t ( x ) t(x) t(x)和 prover 的多项式的阶数 d d d,prover 需要证明他持有的多项式里含有 t ( x ) t(x) t(x)
具体如下
image.png

参考

浅谈零知识证明:背景与起源
zcash官方科普
Exploring Elliptic Curve Pairings
Quadratic Arithmetic Programs: from Zero to Hero
Why and how zk-SNARK works
ZKSNARK介绍
李威翰,张宗洋,周子博等.简洁非交互零知识证明综述[J].密码学报,2022,9(03):379-447.DOI:10.13868/j.cnki.jcr.000525.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年年度总结,一个小白的CSDN涨粉历程

前言 滚滚长江东逝水,一去不复返。 转眼间已到2024年节点,时间如滚滚长江水向东奔流不息,在长江消失之前,都不会停歇,也不会回头。人亦如此,不管是生活还是学习,都是不断往前走的过程&#xff…

数据中台的数据处理及应用说明

科技飞速发展的时代,企业信息化建设会越来越完善,越来越体系化,当今数据时代背景下更加强调、重视数据的价值,以数据说话,通过数据为企业提升渠道转化率、改善企业产品、实现精准运营,为企业打造自助模式的…

[BUG]Datax写入数据到psql报不能序列化特殊字符

1.问题描述 Datax从mongodb写入数据到psql报错如下 org.postgresql.util.PSQLException: ERROR: invalid bytesequence for encoding "UTF8": 0x002.原因分析 此为psql独有的错误,不能对特殊字符’/u0000’,进行序列化,需要将此特殊字符替…

GCP 创建1个windows vm 并连接

有时需要临时使用1台windows 的机器 创建windows vm 既然是临时 直接用gcloud command gcloud compute instances create instance-windows \--zoneeurope-west2-c \--machine-typen2d-standard-4 \--boot-disk-size100GB \--image-projectwindows-cloud \--imagewindows-se…

力扣回溯算法-电话号码的字母组合

力扣第17题,电话号码的字母组合 题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 .电话号码的字母组合 示例: 输入:“2…

【动态规划】【字符串】C++算法:正则表达式匹配

作者推荐 视频算法专题 涉及知识点 动态规划 字符串 LeetCode10:正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符 ’ 匹配零个或多个前面的那一个元素 所谓匹配,是…

ORACLE Primavera Unifier v23.12 最新虚拟机(VM)分享下载

引言 根据上周的计划,我近日简单制作了一个基于ORACLE Primavera Unifier 最新版23.12的虚拟机演示环境,里面包括了unifier的全套系统服务 此虚拟系统环境仅用于演示、培训和测试目的。如要在生产环境中使用此虚拟机,请您与Oracle 销售代表联…

使用setoolkit制作钓鱼网站并结合dvwa靶场储存型XSS漏洞利用

setoolkit是一款kali自带的工具 使用命令启动 setoolkit 1) Social-Engineering Attacks 1) 社会工程攻击 2) Penetration Testing (Fast-Track) 2) 渗透测试(快速通道) 3) Third Party Module…

排序算法-选择插入排序

文章目录 排序算法-选择插入排序 排序算法-选择插入排序 /// <summary>/// 选择插入排序/// Krystal 2023-11-10 09:02:06 每一次找一个最小的放到正确的位置上/// 直接选择排序通过每一轮的比较&#xff0c;找到最大值和最小值&#xff0c;将最大值的节点和右边交换&…

[OCR]Python 3 下的文字识别CnOCR

目录 1 CnOCR 2 安装 3 实践 1 CnOCR CnOCR 是 Python 3 下的文字识别&#xff08;Optical Character Recognition&#xff0c;简称OCR&#xff09;工具包。 工具包支持简体中文、繁体中文&#xff08;部分模型&#xff09;、英文和数字的常见字符识别&#xff0c;支持竖…

【Elasticsearch源码】 分片恢复分析

带着疑问学源码&#xff0c;第七篇&#xff1a;Elasticsearch 分片恢复分析 代码分析基于&#xff1a;https://github.com/jiankunking/elasticsearch Elasticsearch 8.0.0-SNAPSHOT 目的 在看源码之前先梳理一下&#xff0c;自己对于分片恢复的疑问点&#xff1a; 网上对于E…

outlook邮箱群发邮件方法?邮箱如何群发?

outlook邮箱群发邮件如何使用&#xff1f;QQ邮箱设置群发的步骤&#xff1f; Outlook邮箱群发邮件&#xff1a;必要性 Outlook邮箱作为全球广泛使用的邮件服务之一&#xff0c;不仅提供了便捷的邮件收发功能&#xff0c;还支持多种附件、日历提醒及强大的联系人管理。Outlook…

Java集合/泛型篇----第五篇

系列文章目录 文章目录 系列文章目录前言一、说说LinkHashSet( HashSet+LinkedHashMap)二、HashMap(数组+链表+红黑树)三、说说ConcurrentHashMap前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…

微信计数统计器

前段采用非注入Exui编写 分享页 后台采用ThinkPHP开发

3D视觉-相机选用的原则

鉴于不同技术方案都有其适用的场景&#xff0c;立体相机的选型讲究的原则为“先看用途&#xff0c;再看场景&#xff0c;终评精度”&#xff0c;合适的立体相机在方案中可以起到事半功倍的效果。从用途上来进行划分&#xff0c;三维视觉方案主要应用在两个方向&#xff1a;测量…

ChatGPT 对SEO的影响

ChatGPT 的兴起是否预示着 SEO 的终结&#xff1f; 一点也不。事实上&#xff0c;如果使用得当&#xff0c;它可以让你的 SEO 工作变得更加容易。 强调“正确使用时”。 你可以使用ChatGPT来帮助进行关键字研究的头脑风暴部分、重新措辞你的内容、生成架构标记等等。 但你不…

国产化软硬件升级之路:πDataCS 赋能工业软件创新与实践

在国产化浪潮的推动下&#xff0c;基础设施软硬件替换和升级的需求日益增长。全栈国产化软硬件升级替换已成为许多领域中的必选项&#xff0c;也引起了数据库和存储领域的广泛关注。近年来&#xff0c;虽然涌现了许多成功的替换案例&#xff0c;但仍然面临着一些问题。 数据库…

操作系统 全整理

第一章 第二章 进程控制 原语 进程创建 进程终止 进程阻塞和唤醒 进程切换 进程通信 共享数据空间 略过 消息传递 以格式化的消息通过发送、接收消息原语来进行数据交换 管道通信 什么是线程&#xff1f; 线程的实现方式 线程模型是由 线程的状态与转换 进程调度 高级调…

[2024区块链开发入门指引] - 比特币运行原理

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面…

qs.stringify 使用arrayFormat属性 + allowDots的数据处理 - 附示例

qs&#xff1a;将url中的参数转为对象&#xff1b;将对象转为url参数形式 一、介绍 1、官方文档&#xff1a; https://github.com/ljharb/qs https://github.com/ljharb/qshttps://github.com/ljharb/qs 二、准备工作 1、安装依赖包 npm install qs --save 2、示例版本 &…