本节主要讲解zkSNARK涉及到的密码学知识。因为上一部分介绍的,证明者知道一些值,可能会恶意伪造证明。所以我们需要考虑在不破坏协议的前提下,对某些值能够进行模糊计算操作。
同态加密的目的允许对一个值进行加密,并能够对这种加密进行算术运算。实现加密同态性的方法有很多种,我们将简要介绍一种简单的方法。
这里我们选一个基数去加密我们设计的明文,例如,我们设基数为5,去加密一个数字5: 5 3 = 125 5^3 = 125 53=125,因此,125就是明文3加密的结果。
模运算:a mod b:设 a , b ∈ Z a,b \in \mathbb{Z} a,b∈Z且 b > 0 b>0 b>0,如果 q , r ∈ Z q,r \in \mathbb{Z} q,r∈Z满足 a = q b + r a=qb+r a=qb+r,且 0 ≤ r < b 0 \le r<b 0≤r<b,则定义:a mod b := r.
小例子:日常我们生活时钟,17点对应的几点? 17 mod 12 =5 对应下午5点 生活中还能找到许多小例子
我们将同态加密和模运算结合。例如;
5
1
=
5
(
m
o
d
7
)
5
2
=
4
(
m
o
d
7
)
5
3
=
6
(
m
o
d
7
)
5^1=5(mod \,7) \quad 5^2=4(mod \,7) \quad 5^3=6(mod \,7)
51=5(mod7)52=4(mod7)53=6(mod7)
不同指数但有相同结果:
5
5
=
3
(
m
o
d
7
)
5
11
=
3
(
m
o
d
7
)
5
17
=
3
(
m
o
d
7
)
5^5=3(mod \,7) \quad 5^{11}=3(mod \,7) \quad 5^{17}=3(mod \,7)
55=3(mod7)511=3(mod7)517=3(mod7)
因此我们可以联想的离散对数难题,如果给你一个密文,以及一个基元,很难找到对应的明文。大部分现在密码学都是基于离散对数难题来进行构造。该方案的所有同态性质都保留在模域内:
e
n
c
r
y
p
t
i
o
n
:
5
3
=
6
(
m
o
d
7
)
m
u
l
t
i
p
l
i
c
a
t
i
o
n
:
6
2
=
(
5
3
)
2
=
5
6
=
1
(
m
o
d
7
)
a
d
d
i
t
i
o
n
:
5
3
×
5
2
=
5
5
=
3
(
m
o
d
7
)
encryption: \quad 5^3 = 6(mod\,7)\\ multiplication: \quad 6^2=(5^3)^2 = 5^6=1(mod\,7)\\ addition: \quad 5^3 \times 5^2 = 5^5 = 3(mod\,7)
encryption:53=6(mod7)multiplication:62=(53)2=56=1(mod7)addition:53×52=55=3(mod7)
本文中,我们声明加密函数: E ( v ) = g v ( m o d n ) E(v)=g^v(mod \ n) E(v)=gv(mod n),其中表示我们想要加密的值。
结合上述同态加密,我们现在可以用一个随机值x去加密计算多项式,并相应地修改零知识协议。
假设多项式方程为
p
(
x
)
=
x
3
−
3
x
+
2
x
p(x) = x^3-3x+2x
p(x)=x3−3x+2x,我们可以确定该多项式的系数分别为:1,-3,2。因为同态加密并不允许对一个加密的值取幂,所以我们连同需要加密值的幂次一起加密,分别为:
E
(
x
)
,
E
(
x
2
)
,
E
(
x
3
)
E(x),E(x^2),E(x^3)
E(x),E(x2),E(x3),所以我们计算加密的多项式如下:
E
(
x
3
)
1
⋅
E
(
x
2
)
−
3
⋅
E
(
x
)
2
=
(
g
x
3
)
1
⋅
(
g
x
2
)
−
3
⋅
(
g
x
)
2
=
g
1
x
3
⋅
g
−
3
x
2
⋅
g
2
x
=
g
x
3
−
3
x
2
+
2
x
E(x^3)^1 \cdot E(x^2)^{-3} \cdot E(x)^2=(g^{x^3})^1 \cdot(g^{x^2})^{-3} \cdot (g^x)^2=\\ g^{1x^3} \cdot g^{-3x^2} \cdot g^{2x}=g^{x^3-3x^2+2x}
E(x3)1⋅E(x2)−3⋅E(x)2=(gx3)1⋅(gx2)−3⋅(gx)2=g1x3⋅g−3x2⋅g2x=gx3−3x2+2x
通过这样的运算,我们得到了多项式在未知
x
x
x处的加密求值。这是一个非常强大的机制,而且由于同态性,同一个多项式在加密空间中的加密求值总是相同的。
现在我们更新我们前面介绍的协议版本,对于幂次为 d d d的多项式:
在这里,证明者是不知道关于 s s s的任何信息的。虽然在这样的协议中证明者的能力是有限的,他仍然可以使用任何其他手段伪造证明没有实际使用提供加密的多项式,例如,如果证明者声称有一个令人满意的多项式只使用 s 3 s^3 s3和 s 1 s^1 s1两个多项式,显然这是不可能验证当前协议。
一个多项式的知识就是这个它的系数 c 0 , c 1 , . . . , c i c_0,c_1,...,c_i c0,c1,...,ci,以及在该协议中我们将这些系数对以及加密的 s s s的项用系数再求幂,例如: E ( s i ) c i = g c i ⋅ s i E(s^i)^{c_i}=g^{c_i \cdot s^i} E(si)ci=gci⋅si。我们已经在 s s s的加密指数的选择上限制了证明者,但是这样的限制不是强制的,有一种可能存在找到一些任意值 z p , z h z_p,z_h zp,zh,满足等式 z p = ( z h ) t ( s ) z_p = (z_h)^{t(s)} zp=(zh)t(s),将他们发送给验证者,代替 g p , g h g^p,g^h gp,gh。例如:对于随机数 r r r, z h = g r , z p = ( g t ( s ) ) r z_h =g^r,z_p=(g^{t(s)})^r zh=gr,zp=(gt(s))r,其中 g t ( s ) g^{t(s)} gt(s)是提供加密 s s s的指数项。显然存在这种威胁,这就是为什么验证者需要证明仅仅由自身提供的加密 s s s的指数项用于计算 g p , g h g^p,g^h gp,gh,而不是其他。
让我们考虑一个幂次为1的多项式 f ( x ) = c ⋅ x f(x)=c \cdot x f(x)=c⋅x,对应 s s s项的加密值为 E ( s ) = g s E(s)=g^s E(s)=gs。我们可以确定仅仅有一个加密项,同态性乘以系数 c c c,结果为 ( g s ) c (g^s)^c (gs)c。有一种方法是要求对另一个移位的加密值和原始值执行相同的操作,作为校验和的算术类比,确保结果是对原始值的求幂。
Alice有一个值 a a a,她要求Bob可以取任意次方,但唯一要求只有 a a a可以取幂,而不是其它:
因为Bob不能从元组 ( a , a ′ ) (a,a') (a,a′)抽取 α \alpha α,Bob通过以下操作进行有效回应:
Alice收到后进行验证:
结论
Bob对元组的两个值应用了相同的指数(即c)
Bob能够适用Alice的元组并保留了 α \alpha α的关系
Bob知道指数c,因为使用同一个指数才会产生一个有效元组 ( b . b ′ ) (b.b') (b.b′)
Alice不知道c,Bob也不知道 α \alpha α
最终,该协议向Alice提供了一个证明,Bob确实用他知道的某个值对a求幂,而他不能做任何其他操作,例如乘法、加法,因为这会消除α-移位关系.
在同态加密背景下,求幂是加密值的乘法。我们可以将同样的结构应用到简单的一系数多项式中 f ( x ) = c ⋅ x : f(x)=c \cdot x: f(x)=c⋅x:
像这种构造,限制了证明者仅仅使用由验证者提供的加密 s s s的项,因此证明者只能选择多项式的系数 c c c,计算发送给验证者。我们帮将这种一次多项式的方法扩展的多项式中,因为每一项使用同态加法合并在一起。因此,如果证明者给s的幂次加密以及它们的移位值,他可以计算原始多项式和移位多项式,其中必须保持相同的检查。特别是对于d次多项式:
对于我们先前的举得多项式: p ( x ) = x 3 − 3 x 2 + 2 x p(x)=x^3-3x^2+2x p(x)=x3−3x2+2x执行以下步骤:
现在我们可以确定证明者没有使用任何其他的东西,除了由验证者多项式提供,因为没有其他的方法来保持α-移位。与我们开始时相比,我们现在拥有了一个robust协议。然而,无论如何加密,零知识属性仍然有一个显著的缺陷:虽然理论上多项式系数 c i c_i ci可以有很大范围的值,但在现实中,它可能是非常有限的,这意味着验证者可以强制有限范围的系数组合,直到结果等于证明者的答案。例如,如果我们为每个系数考虑100个值的范围,那么幂次为2的多项式将总共有100万个不同的组合,这就需要不到100万个迭代。而且,即使只有一个系数,且系数值为1,安全协议也应该是安全的。
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>
我正在使用devise,当用户更改密码时,网站会将他们注销。我在网上读到,添加sign_in可以解决问题但不起作用,并且当密码更改时用户会注销。这是我的代码if@user.errors[:base].empty?and@user.update_attributes(params[:user])sign_in(current_user,:bypass=>true)flash[:success]="Useraccounthasbeensuccessfullyupdated"redirect_toedit_user_path(params[:site_id],@user)elserender