密码协议形式化分析与可证明安全实验2——使用circom和snarkjs来创建一个零知识snark电路

这篇具有很好参考价值的文章主要介绍了密码协议形式化分析与可证明安全实验2——使用circom和snarkjs来创建一个零知识snark电路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

过程

  • 环境配置
  1. RUST的安装

作者此次使用的OS为WIN10系统,在Rust官网下载对应的版本进行安装。最好使用镜像网站,不然下载速度会非常缓慢。

按照指示一步一步走完后,在命令行输入rustc --version查看是否正确安装

  1. NODE的安装

Node.js下载安装及环境配置教程【超详细】_nodejs下载-CSDN博客

作者根据此文章的指示完成的NODE.js的配置。

  1. circom的安装

在命令行输入

git clone GitHub - iden3/circom: zkSnark circuit compiler

 cargo build --release

cargo install --path circom

之后可以用以下命令查看circom版本:

circom --help

如下图所示,返回了版本信息,就说明circom安装成功了。

  1. 安装snarkjs

在命令行窗口中输入npm install -g snarkjs@latest安装snarkjs的module

安装完成后可以使用snarkjs --help查看帮助

  • 构建电路与证明

准备工作 - 电路部分

首先准备好一个电路文件 circuit.circom ,具体如下

pragma circom 2.1.4;

template Multiplier() {

signal input a;

signal input b;

signal output c;

c <== a*b;

}

component main = Multiplier()

将上述代码保存为 .circom 文件,放在对应目录下

第一行表示指定编译该电路用到的circom版本为2.1.4

电路包含三个变量,其中a,b为输入,输出为c,该电路可以证明Prover知道两个数字a和b,其乘积为c

这里第5行的 <== 符号有两个含义:将值与变量 c 相关联,然后是施加约束 a*b

之后是将该电路声明为Multiplier模板,并用main组件将该模板实例化

circom在编译电路时必须要有一个main组件

之后执行下列命令编译电路

circom circuit.circom --r1cs --wasm --sym

这里的三个参数可以生成三个文件

r1cs:生成基于R1CS约束系统的电路,得到一个.r1cs的二进制文件

wasm:生成一个circuit_js的目录(目录名取决于电路名),目录内包含一个wasm文件和其他用于生成witness的相关文件

sym:生成一个.sym的符号文件,用于调试和打印约束系统

如果还加了 --c 参数,则还会生成一个 _cpp 目录,里面包含了相关的.cpp,.dat,MakeFile等等文件,这些文件将用于编译C代码以生成witness文件

此外可以采用 -o 参数来指定生成的目录名(如果不加这个参数,则默认目录名为 circname_js ,这里circname是你的.circom电路文件的名字

编译电路后,可以用snarkjs的相关命令来查看电路,先看一下snarkjs的帮助文件

这里用ri参数可以查看电路信息(或者用r1cs info也可以)

输出表示电路采用的曲线为bn-128,包含4个导线,其中2个私有输入,一个输出,输入输出之间包含一个约束关系

或者使用rp参数查看电路中的约束(或者用print r1cs也可以)

这里忽略掉前面的系数,得到的约束就是

到此为止,电路就编译好了,接下来需要给电路特定的输入,也就是构建witness,这里就需要用到前面生成的wasm文件

snarkjs采用json文件的方式将witness输入电路,需要准备一个 input.json 文件,如下

{"a": "3", "b": "11"}

将这个json文件放到刚刚生成的circuit_js下面,此时目录里面应该有四个文件,分别是之前的wasm文件和三个json文件然后在该目录下执行下列命令

node generate_witness.js circuit.wasm input.json witness.wtns

这样就得到了 witness.wtns 的证据文件,之后将利用这个文件来生成对应的snark证明

  • 准备工作 - 可信设置部分

证明生成需要两个文件,一个是前面构造电路时生成的r1cs文件 circuit.r1cs ,另一个是证据文件witness.wtns

接下来以Groth16为例来生成证明Groth16需要为每个电路都执行一次可信设置,因此在证明生成之前还需要针对电路完成一些准备工作,Plonk和FFlonk无需为每个电路都执行可信设置,Plonk和FFlonk的生成过程可以看

Groth16的可信设置由两部分组成

τ的幂次:这一部分与电路无关

phase 2:这一部分取决于电路

首先来生成 的幂次,命令如下

snarkjs powersoftau new bn128 12 pot12_0000.ptau -v

利用new命令创建τ \tauτ的幂次,这里有几个参数说明一下:

第一个参数为指定需要的曲线,snarkjs支持bn128和bls12-381两种曲线

第二个参数为约束参数,表示可信设置所支持的最大约束的数量,这里的12表示可信设置最多支持2^12 = 4096 个约束,这个参数的最大值为28,也即snarkjs可以生成具有至多2^28 ≈ 2.68 ∗10^8 个约束的电路

生成之后会在目录下得到一个 pot12_0000.ptau 文件

接下来需要用 contribute 命令,使用新的贡献来创建一个ptau文件

snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau --name="Firstcontribution" -v

这里会提示输入一些随机文本来为贡献提供额外的熵源,这里随便输就行,比如输入snowolfcontribute命令会将截止至现在的所有ptau文件作为输入(截止至目前为止的ptau文件为上面新建的pot12_0000.ptau ),同时输出一个新的ptau文件 pot12_0001.ptau ,该文件中包含新贡献者执行的计算

这个命令还有一个name参数,可以输入任何内容(可以理解为执行contribute命令的一些注释),在后续验证ptau文件时这些信息会作为辅助内容输出

如果不想在contribute命令执行过程中输入文本(懒狗行为),可以使用 -e 参数来讲命令变为非交互式的,就可以不用输入相关信息了

比如在第一次contribute的基础上利用 -e 参数再执行一次contribute

更新完成之后,用 verify 命令验证截止至目前为止的ptau(只执行了一次更新,所以验证0001这个ptau文件)

这里只是生成 的幂,还没有执行phase 2的命令,因此此时运行后系统会输出如下提示

[WARN] snarkJS: this file does not contain phase2 precalculated values.

Please run:

snarkjs "powersoftau preparephase2" to prepare this file to be used in thephase2 ceremony.

[INFO] snarkJS: Powers of Tau Ok!

不过验证通过了,就没什么问题

这里注意一点,每当新的zk-snark需要执行可信设置时,只需要对最新的ptau文件执行verify命令,即可验证截止到目前为止的整个挑战和相应链

接下来是利用beacon命令创建一个ptau文件,这个ptau文件会以随机beacon的形式对ptau文件完成贡献,可信设置的第一阶段需要对其应用一个随机beacon。引入beacon的命令如下

snarkjs powersoftau beacon pot12_0001.ptau pot12_beacon.ptau

1cbf6603d6ff9ba4e1d15d0fd83be3a80bca470b6a43a7f9055204e860298f99 10 -n="FinalBeacon

这里利用了以太坊第16668892个区块的Hash值作为beacon值,后面的参数10表示以该beacon值作为输入,计算 2^10次Hash

接下来是可信设置的第二部分,也即phase 2

phase 2用到的命令为 prepare phase2 ,该命令会用到前面输出的 pot12_beacon.ptau 文件,并基于τ,αβ,βτ该文件计算基于 的拉氏插值多项式,命令如下

snarkjs powersoftau prepare phase2 pot12_beacon.ptau pot12_final.ptau -v

输入命令之后,电脑会算一阵子,计算的时间取决于曲线、第一阶段中允许的约束数量(约束数量越大,计算时间越长)

生成完最终ptau文件后,别忘了用 verify 命令验证一下

这里验证通过的话会输出Powers of Tau Ok,且不再出现前面的“not contain phase2 precalculatedvalues”的警告信息

五.密钥生成

准备完毕之后,接下来是根据电路构建证明与验证密钥

首先需要用电路和上面的最终ptau文件生成一个zkey文件,该文件是一个零知识密钥文件,包含phase2的所有贡献,以及用于证明和验证的密钥,利用这个zkey文件可以验证其是否属于特定的电路。

snarkjs groth16 setup circuit.r1cs pot12_final.ptau circuit_0000.zkey

这里得到的 circuit_0000.zkey 文件不包含任何贡献,不能用于最终电路的证明,因此需要执行前面的贡献更新步骤

接下来使用 zkey 命令来对zkey文件进行贡献更新(前面用的是 powersoftau 命令,基本流程是一样的)

snarkjs zkey contribute circuit_0000.zkey circuit_0001.zkey --name="First

Contributor Name" -v #这里依然输入snowolf

snarkjs zkey contribute circuit_0001.zkey circuit_0002.zkey --name="Second

contribution Name" -v -e="Another random entropy"

snarkjs zkey verify circuit.r1cs pot12_final.ptau circuit_0002.zkey # 更新完贡献记得验证一下

然后引入随机beacon值并验证

之后基于该zkey文件,导出一个验证密钥,导出的密钥为json格式

六.密钥验证

接下来利用电路和证明密钥来构建证明

命令执行完毕后,可以得到两个json文件,一个是 public.json ,也就是statement

我们前面给的witness分别是3和11,因此 正确

另一个是 proof.json ,里面包含用于验证的元素

上面三个就是Groth16中三个用于配对的元素

  • 验证

利用上述两个json文件可以验证证明

通过验证。

总结

这个实验与上个实验相反,在Windows系统上更为简单。

RUST可以找国内镜像源,否则要下半天。

参考文献

密码协议形式化分析与可证明安全实验2——使用circom和snarkjs来创建一个零知识snark电路-CSDN博客

Node.js下载安装及环境配置教程【超详细】_nodejs下载-CSDN博客

GitHub - iden3/circom: zkSnark circuit compiler

https://blog.csdn.net/weixin_30767835/article/details/96215708?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170520277016800188532867%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170520277016800188532867&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-96215708-null-null.142^v99^pc_search_result_base9&utm_term=failure%20when%20receiving%20data%20fr&spm=1018.2226.3001.4187文章来源地址https://www.toymoban.com/news/detail-802841.html

到了这里,关于密码协议形式化分析与可证明安全实验2——使用circom和snarkjs来创建一个零知识snark电路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件工程——第4章形式化说明技术(非重点)

    本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 1.软件工程方法划分成哪三类?并各自举例 2.形式化方法的定义?

    2024年02月11日
    浏览(26)
  • 傻白入门芯片设计,形式化验证方法学——AveMC工具学习(二十)

    目录 一、形式验证方法学 (一)什么是形式化验证? (二)与传统验证的区别? 二、AveMC工具学习 (一)什么是AveMC? (二)AveMC的工作逻辑?  (三)AveMC验证应用场景? (四)AveMC的多种debug方式? (一)什么是形式化验证? 形式化验证方法学是 使用数学证明的方法,

    2024年02月11日
    浏览(20)
  • 密码学:可证明安全

    观看浙江大学暑期crypto school讲座的可证明安全有感,总结如下: 目录 · 概述 · 公钥密码 · 单向函数 · 离散对数 · DH密钥协商协议 · 用可证明安全证明DH密钥协商协议的安全性 可证明安全主要分为三个步骤: 确定威胁模型; 其次构造方案; 给出一个正式的安全性证明。

    2024年02月02日
    浏览(74)
  • 密码学之可证明安全初探

    本文将简要介绍现代密码学中的一项关键技术: 安全性证明 . 任何一个现代密码算法或协议都需要先经过完整的安全性证明, 才能去讨论其理论和应用价值. 如果一个密码方案无法做到可证明安全, 那么它声称的各种能力都将只是空中楼阁. 然而, 刚开始阅读现代密码学论文的时

    2024年02月12日
    浏览(18)
  • 切诺夫界(Chernoff Bound)形式及其证明

    设随机变量X的取值为 非负数 ,马尔可夫不等式形式为: P ( X ≥ ξ ) ≤ E ( X ) ξ P(X ge xi) le frac{E(X)}{xi} P ( X ≥ ξ ) ≤ ξ E ( X ) ​ p r o o f . proof. p roo f . 设非负随机变量 X X X 的概率密度函数为 f ( x ) f(x) f ( x ) E ( X ) = ∫ 0 ∞ x f ( x ) d x = ∫ 0 ξ x f ( x ) d x + ∫ ξ ∞ x f ( x ) d

    2024年02月03日
    浏览(22)
  • 《网络协议》05. 网络通信安全 · 密码技术

    title: 《网络协议》05. 网络通信安全 · 密码技术 date: 2022-09-10 15:16:15 updated: 2023-11-12 07:03:52 categories: 学习记录:网络协议 excerpt: 网络通信安全(ARP 欺骗,DoS DDoS,SYN 洪水攻击,LAND 攻击,DNS 劫持,HTTP 劫持)、密码技术(单向散列函数,对称加密,非对称加密,混合密码系统

    2024年01月24日
    浏览(29)
  • Win10文件夹共享(有密码的安全共享)(SMB协议共享)

    局域网内(无安全问题,比如自己家里wifi)无密码访问,参考之前的操作视频 【电脑文件全平台共享、播放器推荐】手机、电视、平板播放硬盘中的音、视频资源 下面讲解公共网络如办公室网络、咖啡厅网络等等环境下带密码的安全共享方式。 将插到电脑上的移动硬盘里面

    2024年04月14日
    浏览(39)
  • 7.6 密码设置与安全性分析(project)(安全意识)

    目录   第1关 随机生成一个n位密码 第2关 将随机生成的n位密码MD5加密 第3关 生成黑客密码字典 第4关 模拟碰撞破解MD5密码 第5关 检查密码是否泄漏 第1关  随机生成一个n位密码 本关任务:编写一个能随机生成一个n位密码的小程序。 1pass01.txt 1pass02.txt 1pass03.txt Linux密码中

    2024年02月01日
    浏览(74)
  • http协议为何不安全?教你使用抓包抓取到登录时输入的账号密码!

    大家可以发现,在2023年,基本上需要用户输入数据的网站都是使用https协议,简单来说就是比http更安全,使用了更高级的加密方式,即使部分网站使用http协议,用户输入数据也会使用哈希函数或者其他加密方式,http协议为什么不安全呢?我们不妨亲自抓包感受一下,自己输

    2024年02月07日
    浏览(17)
  • Shell脚本实现SFTP传输文件,通过密码形式

    cat 读取文件内容 grep server : 查找文件内容中包含server字符的,行内容 awk -F ‘=’ :实现字符串分割,分割字符’‘=’ ${print $2}: 其中$2 表示切割后数组中第几值 base -d :解码base64字符串,转为可识别字符串

    2024年02月12日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包