一种基于SM9算法椭圆曲线参数的零知识证明实现方法

专利类型 发明公开 法律事件 公开; 实质审查;
专利有效性 实质审查 当前状态 实质审查
申请号 CN202410809240.X 申请日 2024-06-21
公开(公告)号 CN118631458A 公开(公告)日 2024-09-10
申请人 北京江南天安科技有限公司; 申请人类型 企业
发明人 李雪雁; 李祖凡; 第一发明人 李雪雁
权利人 北京江南天安科技有限公司 权利人类型 企业
当前权利人 北京江南天安科技有限公司 当前权利人类型 企业
省份 当前专利权人所在省份:北京市 城市 当前专利权人所在城市:北京市海淀区
具体地址 当前专利权人所在详细地址:北京市海淀区马甸东路17号金澳国际大厦1110室 邮编 当前专利权人邮编:100088
主IPC国际分类 H04L9/30 所有IPC国际分类 H04L9/30H04L9/32
专利引用数量 0 专利被引用数量 0
专利权利要求数量 6 专利文献类型 A
专利代理机构 郑州坤博同创知识产权代理有限公司 专利代理人 毛雪娇;
摘要 本 发明 公开了一种基于SM9 算法 椭圆曲线参数的零知识证明实现方法,包括如下步骤:第一步:预处理阶段;第二步:初始化阶段;第三步:证明生成阶段;第四步:证明验证阶段,本发明基于Groth16协议,将协议中选用的通用BN254曲线替换成国密SM9的椭圆曲线,实现零知识证明Groth16协议的国密化,推进零知识证明合规使用;本发明采用国密SM9密码算法准则中椭圆曲线参数,符合国密规范,安全性好。用C++语言基于libsnark库进行工程化实现,兼容性高,由于曲线参数和工程化实现差异,此方案的最终执行效率是原方案的90%,满足实际应用需求。
权利要求

1.一种基于SM9算法椭圆曲线参数的零知识证明实现方法,其特征在于:包括如下步
骤:
第一步:预处理阶段;
第二步:初始化阶段;
第三步:证明生成阶段;
第四步:证明验证阶段。
2.根据权利要求1所述的一种基于SM9算法椭圆曲线参数的零知识证明实现方法,其特
征在于:所述第一步具体为:
SM9算法椭圆曲线参数和计算定义:
定义SM9算法椭圆曲线参数,为了表示SM9算法椭圆曲线的256比特规模的参数,同时为
了兼容libsnark库的定义结构,在改造过程中,首先定义数据类型FieldT表示椭圆曲线基域元素Fp_model,数据类型G1表示椭圆曲线一阶群元素sm9_bn256_G1,数据类型G2表示椭圆曲线二阶群元素sm9_bn256_G2,数据类型GT表示为十二次扩域上元素Fp12_by4_model;
在C++程序语言实现过程中,以运算符重载的形式重新生成基域元素FieldT之间的
“+”、“‑”、“*”计算关系,以及一阶群元素G1、二阶群元素G2之间的“+”、“‑”、“*”计算关系,计算关系“/”运算可以视作求逆运算与“*”运算的结合。
3.根据权利要求2所述的一种基于SM9算法椭圆曲线参数的零知识证明实现方法,其特
征在于:还包括将算术电路转换为R1CS,预处理模的功能即为将初始计算问题从算术电路的描述形式转换为R1CS约束的表示形式,使用R1CS_constraint类表示一条由算术电路转换而来的R1CS约束,在此基础上使用R1CS_constraint_system类表示全部的R1CS约束共同组成的R1CS系统,同时将初始计算问题的解,即证明方要证明的内容记为witness,转换为符合算术电路约束的表示形式。
4.根据权利要求1所述的一种基于SM9算法椭圆曲线参数的零知识证明实现方法,其特
征在于:所述第二步初始化阶段设计为以下流程:
生成随机参数公共参考串CRS,多项式计算,生成密钥,具体细节如下:
1)、生成随机参数公共参考串CRS:CRS的内容包括随机参数α,β,γ ,δ,x,α,β,γ ,δ,x∈Fp,Fp为SM9算法椭圆曲线系数有限域,x是计算多项式点值的参数;α,β,γ ,δ与SM9算法椭圆曲线基域点群G1的生成元g1点乘得到群G1上四个新的离散点;β,γ ,δ与SM9算法椭圆曲线二次扩域上点群G2的生成元g2进行点乘得到群G2上三个新的离散点;以及通过alpha_g1,beta_g2计算的双线性对。
2)、多项式计算:根据包含所有原始约束条件的R1CS对象和公共参考字符串CRS中设定
的随机参数x将初始获得的R1CS表示形式转化为多项式形式;该方法为对应Groth16协议中的ui(x),vi(x),wi(x)结构创建三个多项式向量A,B,C以及多项式在有限域上取值运算所得到的数据;随后用拉格朗日插值算法遍历R1CS中的约束数据,计算R1CS约束结构对应的多项式系数。
3)、生成密钥:根据传入的初始R1CS、随机参数公共参考串CRS、以及计算得到的中间数据生成包含证明密钥和验证密钥的密钥对结构keypair;
keypair中验证密钥verification_key包括CRS阶段生成的两个G2群椭圆曲线离散点,
以及一个双线性对计算结果,和多项式值组合在椭圆曲线G1群上的离散点值gamma_ABC_
g1,该点计算过程中ui(x),vi(x),wi(x)为通过R1CS约束计算得到的多项式,l的取值为在解向量中witness的长度加1,α,β,γ的值在CRS中随机决定,
keypair中证明密钥proving_key除离散点群随机值,还包括对多项式ui(x),vi(x),wi
(x)点值的中间项在G1群、G2群上离散点值的计算结果A_query、B_query、H_query、L_
query;
A_query中ui(x)为通过R1CS约束系统中矩阵U得到的全部多项式,m为得到的多项式数
量,g1为CRS阶段通过随机参数决定的一阶群单位元;
B_query中vi(x)为通过R1CS约束系统中矩阵V得到的全部多项式,g2为CRS阶段通过随
机参数决定的二阶群单位元;
H_query中n为R1CS约束系统得到的多项式p(x)的阶,t(x)为此过程中的目标多项式,δ
为CRS阶段决定,g1为CRS阶段决定的一阶群单位元;
L_query计算公式如#(5)所示,
密钥生成部分得到的密钥对keypair,密钥对的生成意味着整个初始化步骤的完成。同
时在初始化模块完成之后,系统会将keypair密钥对保存并且重复使用,且对于验证方和证明方也均可公开使用和保存,之后在对同一个问题程序进行证明时,不再需要重复运行。
5.根据权利要求1所述的一种基于SM9算法椭圆曲线参数的零知识证明实现方法,其特
征在于:所述第三步具体为:
将初始化阶段中得到的证明密钥proving_key和预处理阶段中包含witness信息的解
向量作为输入数据,生成证明结构,在证明结构生成模块接受输入信息后,证明生成部分将上述过程得到的多项式计算结果代入椭圆曲线离散点循环群中进行运算,最终得到以椭圆曲线上的点为表示形式的证明结构Proof,并将其作为证明结构生成模块的输出,具体细节如下:
1)、证明方在预处理阶段中自身的witness信息以及中间变量共同构成解向量输入参
数,然后通过R1CS转换得到的多项式,计算全部多项式h(x)、U(x)、V(x)、W(x)的系数;同时在符合SM9椭圆曲线标准的有限域中随机生成参数r,s作为证明结构的零知识部分;
2)、通过将多项式系数结果进一步处理得到的多项式值与椭圆曲线循环群元素进行相
应的运算,最终得到一系列椭圆曲线循环群元素,这些循环群上的元素共同组成了本模块最终输出的证明结构Proof,
其中Proof元素A、C为G1循环群元素,B为G2循环群元素,h(x)为计算过程中得到的p(x)
除以目标多项式t(x)的结果,t(x)为计算多项式系数过程中基于所选择的值域得到的目标多项式。
6.根据权利要求1所述的一种基于SM9算法椭圆曲线参数的零知识证明实现方法,其特
征在于:所述第四步具体为:
在证明结构验证阶段中,通过传入证明结构Proof以及在初始化阶段中得到的验证密
钥verification_key,进行对应处理后返回验证结果,此处对Proof证明结构中的椭圆曲线循环群上点值进行对应的双线性对映射计算,与verification_key验证密钥中的双线性对数据进行比较以判断得到的证明结构Proof是否正确,具体细节如下:
通过计算Proof结构以及验证密钥verification_key中的数据,得到双线性对结果e
([A]1,[B]2)、 e([C]1,δg2);
结合verification_key中现有的双线性对计算数据alpha_g1_beta_g2,比较零知识证
明验证方案结果。

说明书全文

一种基于SM9算法椭圆曲线参数的零知识证明实现方法

技术领域

[0001] 本发明涉及隐私计算和椭圆曲线技术领域,具体为一种基于SM9算法椭圆曲线参数的零知识证明实现方法。

背景技术

[0002] 零知识证明指证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。
[0003] 零知识证明是隐私计算中的一种分支技术,属于密码学范畴,主要用在加密货币链、身份验证和数据隐私保护等领域,保护用户的隐私,确保数据的安全性和可验证性。
[0004] 零知识证明协议有交互式和非交互式两种,简洁非交互式协议(zk‑SNARK)由于兼具简洁性和非交互性,在实际应用中被广泛使用。本发明基于zk‑SNARK的一种主流协议‑‑Groth16协议进行国密改造并基于开源libsnark库工程化实现。
[0005] Groth16协议由三个模块构成,生成证明的初始参数设置模块(Setup)、生成证明结构的证明模块(Prove),以及对证明结构的正确性进行验证的模块(Verify)。在整个协议的运行过程中,证明方自己的隐私信息为非公开,证明方在证明模块根据隐私信息和公开信息生成证明结构并公开,验证方通过验证证明结构验证信息正确性但无从知晓证明方掌握的隐私信息。
[0006] Groth16协议其具体的实现流程为:
[0007] 1.构造算术电路(circuit):将需要证明的问题转换为算术电路的表示形式;
[0008] 2.构造一阶约束系统(R1CS):将算术电路一阶方程转化为多项式方程组的形式,其中每个算术电路对应一个一阶方程,表示一个约束条件;
[0009] 3.构造QAP问题(二次算术程序):根据给定的约束条件,生成满足这些条件的多项式。将多项式进行线性组合,进而得到满足原始问题约束的多项式整除关系,构造二次算术程序QAP问题;
[0010] 4.参数设置(Setup):选择合适的椭圆曲线和双线性对作为算法的基础,生成密钥对;
[0011] 5.生成证明结构(Prove):通过引入椭圆曲线密码学的基础运算以及双线性对算法,结合上述步骤得到的多项式QAP问题,生成椭圆曲线上离散对数点,完成证明结构的生成;
[0012] 6.验证证明结构(Verify):验证方获得离散对数点,基于双线性映射在椭圆曲线点群上重构整除关系,使用证明者提供的证明结构验证信息的正确性,但得不到隐私信息,确保证明的正确性和零知识性。
[0013] 椭圆曲线是一种重要的数学结构,密码学界基于椭圆曲线离散对数难题构建了多个椭圆曲线公钥密码算法,如SM2,ECDSA等。椭圆曲线参数决定了椭圆曲线密码算法的安全性和效率。Groth16协议选择通用的BN254曲线来增强协议的安全性。
[0014] 现有技术中,基于椭圆曲线密码学的零知识证明方案中所采用的椭圆曲线参数多为国际标准参数,或未公开参数标准。Groth16协议选择通用的BN254曲线,目前尚未有符合国密标准参数规范的实现方案。

发明内容

[0015] 本发明的目的在于提供一种基于SM9算法椭圆曲线参数的零知识证明实现方法,以解决上述背景技术中提出的问题。
[0016] 为实现上述目的,本发明提供如下技术方案:一种基于SM9算法椭圆曲线参数的零知识证明实现方法,包括如下步骤:
[0017] 第一步:预处理阶段;
[0018] 第二步:初始化阶段;
[0019] 第三步:证明生成阶段;
[0020] 第四步:证明验证阶段。
[0021] 优选的,所述第一步具体为:
[0022] SM9算法椭圆曲线参数和计算定义:
[0023] SM9算法是我国商用密码标准算法,于2021年成为国际标准,SM9算法是基于椭圆曲线双线性对构造出的标识密码,属于公钥密码,SM9算法选用的椭圆曲线是256比特的BN2 3
曲线,椭圆曲线方程:y=x+5,嵌入次数为12,采用1‑2‑4‑12塔式扩张;
[0024] 在libsnark库中Groth16协议选用的是通用的BN254曲线,曲线方程为:y2=x3+3,采用1‑2‑6‑12塔式扩张,由于这两条曲线的参数和扩张形式不同,导致在libsnark库进行工程化实现时,不能沿用库中的参数和计算关系,需重新定义构造。
[0025] 首先定义SM9算法椭圆曲线参数,为了表示SM9算法椭圆曲线的256比特规模的参数,同时为了兼容libsnark库的定义结构,在改造过程中,首先定义数据类型FieldT表示椭圆曲线基域元素Fp_model,数据类型G1表示椭圆曲线一阶群元素sm9_bn256_G1,数据类型G2表示椭圆曲线二阶群元素sm9_bn256_G2,数据类型GT表示为十二次扩域上元素Fp12_
by4_model;
[0026] 然后定义计算关系,在C++程序语言实现过程中,以运算符重载的形式重新生成基域元素FieldT之间的“+”、“‑”、“*”计算关系,以及一阶群元素G1、二阶群元素G2之间的“+”、“‑”、“*”计算关系,计算关系“/”运算可以视作求逆运算与“*”运算的结合。
[0027] 优选的,还包括将算术电路转换为R1CS,预处理模块的功能即为将初始计算问题从算术电路的描述形式转换为R1CS约束的表示形式,使用R1CS_constraint类表示一条由算术电路转换而来的R1CS约束,在此基础上使用R1CS_constraint_system类表示全部的R1CS约束共同组成的R1CS系统,同时将初始计算问题的解,即证明方要证明的内容记为
witness,转换为符合算术电路约束的表示形式。
[0028] 优选的,所述第二步初始化阶段设计为以下流程:
[0029] 生成随机参数公共参考串CRS,多项式计算,生成密钥,具体细节如下:
[0030] 1)、生成随机参数公共参考串CRS:CRS的内容包括随机参数α,β,γ ,δ,x,α,β,γ ,δ,x∈Fp,Fp为SM9算法椭圆曲线系数有限域,x是计算多项式点值的参数;α,β,γ ,δ与SM9算法椭圆曲线基域点群G1的生成元g1点乘得到群G1上四个新的离散点;β,γ ,δ与SM9算法椭圆曲线二次扩域上点群G2的生成元g2进行点乘得到群G2上三个新的离散点;以及通过alpha_g1,beta_g2计算的双线性对。
[0031] 2)、多项式计算:根据包含所有原始约束条件的R1CS对象和公共参考字符串CRS中设定的随机参数x初始获得的R1CS表示形式转化为多项式形式;该方法为对应Groth16协议中的ui(x),vi(x),wi(x)结构创建三个多项式向量A,B,C以及多项式在有限域上取值运算所得到的数据;随后用拉格朗日插值算法遍历R1CS中的约束数据,计算R1CS约束结构对应的多项式系数。
[0032] 3)、生成密钥:根据传入的初始R1CS、随机参数公共参考串CRS、以及计算得到的中间数据生成包含证明密钥和验证密钥的密钥对结构keypair;
[0033] keypair中验证密钥verification_key包括CRS阶段生成的两个G2群椭圆曲线离散点,以及一个双线性对计算结果,和多项式值组合在椭圆曲线G1群上的离散点值gamma_ABC_g1,该点计算过程中ui(x),vi(x),wi(x)为通过R1CS约束计算得到的多项式,l的取值为在解向量中witness的长度加1,α,β,γ的值在CRS中随机决定,
[0034]
[0035] keypair中证明密钥proving_key除离散点群随机值,还包括对多项式ui(x),vi(x),wi(x)点值的中间项在G1群、G2群上离散点值的计算结果A_query、B_query、H_query、L_query;
[0036] A_query中ui(x)为通过R1CS约束系统中矩阵U得到的全部多项式,m为得到的多项式数量,g1为CRS阶段通过随机参数决定的一阶群单位元;
[0037]
[0038] B_query中vi(x)为通过R1CS约束系统中矩阵V得到的全部多项式,g2为CRS阶段通过随机参数决定的二阶群单位元;
[0039]
[0040] H_query中n为R1CS约束系统得到的多项式p(x)的阶,t(x)为此过程中的目标多项式,δ为CRS阶段决定,g1为CRS阶段决定的一阶群单位元;
[0041]
[0042] L_query计算公式如#(5)所示,
[0043]
[0044] 密钥生成部分得到的密钥对keypair,密钥对的生成意味着整个初始化步骤的完成。同时在初始化模块完成之后,系统会将keypair密钥对保存并且重复使用,且对于验证方和证明方也均可公开使用和保存,之后在对同一个问题程序进行证明时,不再需要重复运行。
[0045] 优选的,所述第三步具体为:
[0046] 将初始化阶段中得到的证明密钥proving_key和预处理阶段中包含witness信息的解向量作为输入数据,生成证明结构,在证明结构生成模块接受输入信息后,证明生成部分将上述过程得到的多项式计算结果代入椭圆曲线离散点循环群中进行运算,最终得到以椭圆曲线上的点为表示形式的证明结构Proof,并将其作为证明结构生成模块的输出,具体细节如下:
[0047] 1)、证明方在预处理阶段中自身的witness信息以及中间变量共同构成解向量输入参数,然后通过R1CS转换得到的多项式,计算全部多项式h(x),U(x),V(x),W(x)的系数;
同时在符合SM9椭圆曲线标准的有限域中随机生成参数r,s作为证明结构的零知识部分;
[0048] 2)、通过将多项式系数结果进一步处理得到的多项式值与椭圆曲线循环群元素进行相应的运算,最终得到一系列椭圆曲线循环群元素,这些循环群上的元素共同组成了本模块最终输出的证明结构Proof,
[0049]
[0050] 其中Proof元素A、C为G1循环群元素,B为G2循环群元素,h(x)为计算过程中得到的p(x)除以目标多项式t(x)的结果,t(x)为计算多项式系数过程中基于所选择的值域得到的目标多项式。
[0051] 优选的,所述第四步具体为:
[0052] 在证明结构验证阶段中,通过传入证明结构Proof以及在初始化阶段中得到的验证密钥verification_key,进行对应处理后返回验证结果,此处对Proof证明结构中的椭圆曲线循环群上点值进行对应的双线性对映射计算,与verification_key验证密钥中的双线性对数据进行比较以判断得到的证明结构Proof是否正确,具体细节如下:
[0053]
[0054]
[0055] 通过计算Proof结构以及验证密钥verification_key中的数据,得到双线性对结果e([A]1,[B]2)、 e([C]1,δg2);
[0056] 结合verification_key中现有的双线性对计算数据alpha_g1_beta_g2,比较零知识证明验证方案结果。
[0057] 与现有技术相比,本发明的有益效果是:本发明基于Groth16协议,将协议中选用的通用BN254曲线替换成国密SM9的椭圆曲线,实现零知识证明Groth16协议的国密化,推进零知识证明合规使用;本发明采用国密SM9密码算法准则中椭圆曲线参数,符合国密规范,安全性好。用C++语言基于libsnark库进行工程化实现,兼容性高,由于曲线参数和工程化实现差异,此方案的最终执行效率是原方案的90%,满足实际应用需求。附图说明
[0058] 图1为本发明流程逻辑示意图;
[0059] 图2为本发明椭圆曲线功能示意图;
[0060] 图3为本发明实施例算数电路图。

具体实施方式

[0061] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0062] 须知,本说明书所附图式所绘示的结构、比例、大小等,均仅用以配合说明书所揭示的内容,以供熟悉此技术的人士了解与阅读,并非用以限定本申请可实施的限定条件,故不具技术上的实质意义,任何结构的修饰、比例关系的改变或大小的调整,在不影响本申请所能产生的功效及所能达成的目的下,均应仍落在本申请所揭示的技术内容得能涵盖的范围内。
[0063] 请参阅图1‑3,本发明提供一种技术方案:一种基于SM9算法椭圆曲线参数的零知识证明实现方法,包括如下步骤:
[0064] 第一步:预处理阶段;
[0065] 第二步:初始化阶段;
[0066] 第三步:证明生成阶段;
[0067] 第四步:证明验证阶段。
[0068] 本发明中,第一步具体为:
[0069] SM9算法椭圆曲线参数和计算定义:
[0070] 定义SM9算法椭圆曲线参数,为了表示SM9算法椭圆曲线的256比特规模的参数,同时为了兼容libsnark库的定义结构,在改造过程中,首先定义数据类型FieldT表示椭圆曲线基域元素Fp_model,数据类型G1表示椭圆曲线一阶群元素sm9_bn256_G1,数据类型G2表示椭圆曲线二阶群元素sm9_bn256_G2,数据类型GT表示为十二次扩域上元素Fp12_by4_model;
[0071] 在C++程序语言实现过程中,以运算符重载的形式重新生成基域元素FieldT之间的“+”、“‑”、“*”计算关系,以及一阶群元素G1、二阶群元素G2之间的“+”、“‑”、“*”计算关系,计算关系“/”运算可以视作求逆运算与“*”运算的结合。
[0072] 本发明中,还包括将算术电路转换为R1CS,预处理模块的功能即为将初始计算问题从算术电路的描述形式转换为R1CS约束的表示形式,使用R1CS_constraint类表示一条由算术电路转换而来的R1CS约束,在此基础上使用R1CS_constraint_system类表示全部的R1CS约束共同组成的R1CS系统,同时将初始计算问题的解,即证明方要证明的内容记为witness,转换为符合算术电路约束的表示形式。
[0073] 本发明中,所述第二步初始化阶段设计为以下流程:
[0074] 生成随机参数公共参考串CRS,多项式计算,生成密钥,具体细节如下:
[0075] 1)、生成随机参数公共参考串CRS:CRS的内容包括随机参数α,β,γ ,δ,x,α,β,γ ,δ,x∈Fp,Fp为SM9算法椭圆曲线系数有限域,x是计算多项式点值的参数;α,β,γ ,δ与SM9算法椭圆曲线基域点群G1的生成元g1点乘得到群G1上四个新的离散点;β,γ ,δ与SM9算法椭圆曲线二次扩域上点群G2的生成元g2进行点乘得到群G2上三个新的离散点;以及通过alpha_g1,beta_g2计算的双线性对。
[0076] 2)、多项式计算:根据包含所有原始约束条件的R1CS对象和公共参考字符串CRS中设定的随机参数x将初始获得的R1CS表示形式转化为多项式形式;该方法为对应Groth16协议中的ui(x),vi(x),wi(x)结构创建三个多项式向量A,B,C以及多项式在有限域上取值运算所得到的数据;随后用拉格朗日插值算法遍历R1CS中的约束数据,计算R1CS约束结构对应的多项式系数。
[0077] 3)、生成密钥:根据传入的初始R1CS、随机参数公共参考串CRS、以及计算得到的中间数据生成包含证明密钥和验证密钥的密钥对结构keypair。
[0078] keypair中验证密钥verification_key包括CRS阶段生成的两个G2群椭圆曲线离散点,以及一个双线性对计算结果,和多项式值组合在椭圆曲线G1群上的离散点值gamma_ABC_g1,该点计算过程中ui(x),vi(x),wi(x)为通过R1CS约束计算得到的多项式,l的取值为在解向量中witness的长度加1,α,β,γ的值在CRS中随机决定,
[0079]
[0080] keypair中证明密钥proving_key除离散点群随机值,还包括对多项式ui(x),vi(x),wi(x)点值的中间项在G1群、G2群上离散点值的计算结果A_query、B_query、H_query、L_query;
[0081] A_query中ui(x)为通过R1CS约束系统中矩阵U得到的全部多项式,m为得到的多项式数量,g1为CRS阶段通过随机参数决定的一阶群单位元;
[0082]
[0083] B_query中vi(x)为通过R1CS约束系统中矩阵V得到的全部多项式,g2为CRS阶段通过随机参数决定的二阶群单位元;
[0084]
[0085] H_query中n为R1CS约束系统得到的多项式p(x)的阶,t(x)为此过程中的目标多项式,δ为CRS阶段决定,g1为CRS阶段决定的一阶群单位元;
[0086]
[0087] L_query计算公式如#(5)所示,
[0088]
[0089] keypair示意表
[0090]
[0091]
[0092] 密钥生成部分得到的密钥对keypair,密钥对的生成意味着整个初始化步骤的完成。同时在初始化模块完成之后,系统会将keypair密钥对保存并且重复使用,且对于验证方和证明方也均可公开使用和保存,之后在对同一个问题程序进行证明时,不再需要重复运行。
[0093] 本发明中,第三步具体为:
[0094] 将初始化阶段中得到的证明密钥proving_key和预处理阶段中包含witness信息的解向量作为输入数据,生成证明结构,在证明结构生成模块接受输入信息后,证明生成部分将上述过程得到的多项式计算结果代入椭圆曲线离散点循环群中进行运算,最终得到以椭圆曲线上的点为表示形式的证明结构Proof,并将其作为证明结构生成模块的输出,具体细节如下:
[0095] 1)、证明方在预处理阶段中自身的witness信息以及中间变量共同构成解向量输入参数,然后通过R1CS转换得到的多项式,计算全部多项式h(x)、U(x)、V(x)、W(x)的系数;
同时在符合SM9椭圆曲线标准的有限域中随机生成参数r,s作为证明结构的零知识部分;
[0096] 2)、通过将多项式系数结果进一步处理得到的多项式值与椭圆曲线循环群元素进行相应的运算,最终得到一系列椭圆曲线循环群元素,这些循环群上的元素共同组成了本模块最终输出的证明结构Proof
[0097]
[0098] 其中Proof元素A、C为G1循环群元素,B为G2循环群元素,h(x)为计算过程中得到的p(x)除以目标多项式t(x)的结果,t(x)为计算多项式系数过程中基于所选择的值域得到的目标多项式。
[0099] 本发明中,第四步具体为:
[0100] 在证明结构验证阶段中,通过传入证明结构Proof以及在初始化阶段中得到的验证密钥verification_key,进行对应处理后返回验证结果,此处对Proof证明结构中的椭圆曲线循环群上点值进行对应的双线性对映射计算,与verification_key验证密钥中的双线性对数据进行比较以判断得到的证明结构Proof是否正确,具体细节如下:
[0101]
[0102]
[0103] 通过计算Proof结构以及验证密钥verification_key中的数据,得到双线性对结果e([A]1,[B]2)、 e([C]1,δg2);
[0104] 结合verification_key中现有的双线性对计算数据alpha_g1_beta_g2,比较零知识证明验证方案结果。
[0105] 实施例:
[0106] 以证明者需要向验证方证明自己知道方程x3+x+5=35的解为例:
[0107] 零知识证明要解决的问题:
[0108] 证明方知道方程的解为x=3,此处的解x=3,以及满足算术电路的中间变量为witness,证明方需要向验证方证明自己持有的一组变量{x,s1,s2,s3,s4}确实是满足该方程电路的一组答案,但不泄露x的具体值。
[0109] 预处理阶段:
[0110] 备注:若SM9算法椭圆曲线的参数和计算关系没有预先定义,这里要进行定义。
[0111] 将方程转化成算术电路,算术电路是多元一次方程组的形式,方程组中的每一个等式可以表示成两个因子相乘,因子的内部可以包含加运算,但是不能再有乘运算。
[0112] 记所有算术电路中的变量和常数1构成了解向量 长度为m,则在此时得到的算术电路为:
[0113]
[0114] 算术电路的表示形式为可以为 最终得到的矩阵可以表示为:
[0115]
[0116] 列向量转换为多项式的计算过程为插值运算,首先选取插值域{r1,r2,…,rn}(一般情况为方便计算,插值域选取为{1,2,…,n}),记矩阵W,U,V的任一列向量为则 有唯一对应的插值多项式f(x),满足插值域{r1,r2,…,rn}与
的对应关系f(ri)=vi(i∈{1,...,n})。分为计算拉格朗日基函数、计
算拉格朗日插值多项式、计算拉格朗日插值多项式系数三个步骤。
[0117] 拉格朗日基函数计算中m为对应的矩阵中行向量长度,也即是解向量 的长度:
[0118]
[0119] 拉格朗日插值多项式中m所代表的数据与基函数表达式中一致,yi为矩阵中在对应位置的值。
[0120]
[0121] 以矩阵U中第一组列向量(0,0,0,5)为例,最终得到的多项式u1(x)结果为,其余多项式如同u1(x)所示计算方法:
[0122]
[0123] 在此过程中,目标多项式为t(x)=(x‑1)(x‑2)(x‑3)(x‑4),完成上述步骤之后,矩阵U,V,W中每一个列向量转变得到的多项式均以系数表示的形式存储。
[0124] 初始化阶段:
[0125] 此处若设u1(x)所得到的多项式表示为a1,0x0+a1,1x1+a1,2x2+a1,3x3,其余多项式同0 1 2 3
理,v1(x)所得到的多项式表示为b1,0x+b1,1x+b1,2x+b1,3x,其余多项式同理,w1(x)所得到
0 1 2 3
的多项式表示为c1,0x+c1,1x+c1,2x +c1,3x ,其余多项式同理,CRS得到的随机数为alpha、beta、gamma、delta、t,循环群生成元分别为g1/g2,最终得到结果如下:
[0126]
[0127]
[0128] 证明生成阶段:
[0129] 设得到的随机数为r,s,解向量为a_v,则计算结果如下:
[0130]
[0131] 证明验证阶段:
[0132]
[0133] 根据Proof与vk计算e([A]1,[B]2)、 e([C]1,δg2)对照vk中的结果e(αg1,βg2),如果相同则证明正确,否则错误。
[0134] 综上所述,本发明基于Groth16协议,将协议中选用的通用BN254曲线替换成国密SM9的椭圆曲线,实现零知识证明Groth16协议的国密化,推进零知识证明合规使用;本发明采用国密SM9密码算法准则中椭圆曲线参数,符合国密规范,安全性好。用C++语言基于libsnark库进行工程化实现,兼容性高,由于曲线参数和工程化实现差异,此方案的最终执行效率是原方案的90%,满足实际应用需求。
[0135] 还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
QQ群二维码
意见反馈