Schnorr技术详解
Schnorr
Schnorr本质上是一种零知识的技术,即证明方(Prover)声称知道一个密钥x
的值,通过使用Schnorr加密技术,可以在不揭露x的值情况下向验证方(Verifier)证明对x
的知情权。
注意,接下来讲解Schnorr过程中提到的关于哈希函数的性质、椭圆曲线上的离散对数难题和加密解密过程就不做过多的叙述。
一般会通过一个游戏过程来阐述Schnorr的流程:证明方为Alice,验证方为Bob。Bob要在不知道x
的情况下验证Alice知道它。
方案一
方案一的过程如下所述,这是一种仅支持一个验证者进行验证的方案
- Alice : 均匀随机地选择一个秘密值
r
- Alice :
s = x + r
- Alice : 通过椭圆曲线将r和x转换为椭圆曲线上的点
R = r * G
X = x * G
- Alice : 提交一个证明
(X,s,R)
- Bob : 将
s
转换为椭圆曲线上的点- 验证
s * G ?== X + R
- 验证
由于椭圆曲线上的离散对数问题,知道X
和G
的情况下通过X = x * G
接触x
是不可能的,所以保证了x的私密性。但是这种方案是存在问题的,x
和r
都是Alice自己生成的,她知道Bob会用X
和R
相加然后再与s * G
进行比较。所以她完全可以在不知道x
的情况下构造
R = r * G - X 和 s = r
这样Bob的验证过程就变成
s * G ?== X + R==> r * G ?== r * G - X + X
这是永远成立的,所以这种方案并不正确。为了不让Alice能够构造R
,提出了下面两种解决方案,值得一提的是,第一种解决方案仍然是只支持一个验证者进行验证的方案;而第二种方案是一种单向的非交互协议,即证明方提交证明之后,所有人都可以作为验证方对证明的合法性进行验证,即这种方案是可以公开验证的。
Sigama协议(∑-protocol)
这是一种交互式的方案,需要证明方和验证方进行交互,过程如下:
- Alice : 均匀随机选择
r
,计算R = r * G
,并将R
发送给Bob - Bob : 均匀随机选择
e
,将e
发送给Alice - Alice : 计算
s = r + e * x
和X = x * G
,将证明(X,s)
发送给Bob - Bob : 计算
s * G ?== R + e * x
与一步解决问题(Alice单方面发送一些信息给Bob)不同,整个协议变成了三步:
- Alice将
R
发送给Bob - Bob发送
e
给Alice作为验证条件 - Alice回传最终的证明
s
这个三步验证看起来很像希腊字母sigama(∑),故这个协议也叫做"sigma协议"(sigma protocol)。但是由于协议存在交互过程,那么就无法防止证明方和验证方进行串通,所以这种方案只对参与交互的验证者有效,其他不参与交互的验证者无法判断整个过程是否存在串通的舞弊行为。所以,这种签名是无法公开验证的。
为了增强签名的可用性,并适用于数字签名,需要将它修改为单向的(non-interactive)。
非交互式的Schnorr
从上一个方案可以看到,为了不让Alice进行造假,需要Bob发送一个e
值,并将e
值构造进公式中。所以,如果Alice选择一个无法造假并且大家公认的e
值并将其构造进公式中,问题就解决了。生成这个公认无法造假的e
的方法是使用哈希函数。
具体过程如下:
- Alice : 均匀随机选择
r
,并依次计算
R = r * G
X = x * G
e = HASH(R)
s = r + e * x
- Alice : 生成证明
(s,X,R)
- Bob(或者任意一个验证者) : 计算
e = HASH(R)
- Bob(或者任意一个验证者) : 验证
s * G ?== R + e * X
可以看到,如果Alice用e = HASH(R)
来构造e
,那么她无法通过构造R
来将e * X
从式子中减去。她若要这么做的话,则必须反复尝试
R = r * G - e * X 即 R = r * G - HASH(R) * X
并使等式成立。但是我们知道,HASH函数的性质是输入尽管改动很小,输出也会完全改变。反应在式子中即R
稍有变化,e
就改变了,所以这是一个极难尝试成功的式子。因此Alice无法作恶。
Schnorr签名
上述过程其实只是一个零知识证明的过程,要把Schnorr运用到签名也是很简单的。只需要把需要签名的消息嵌入计算e
的公式中即可。
最终的Schnorr签名过程如下:
- 生成签名
- 生成私钥
x = random number
- 计算
X = x * G
- 生成随机盐值
r = random number
- 计算
R = r * G
- 将签名的消息message嵌入,计算
e = HASH(R||message)
- 计算
s = r + e * x
- 提交签名
(x,R,s)
- 验证签名
- 计算
e = HASH(R||message)
- 计算
s1 = R + e * X
- 计算
s2 = s * G
- 验证
s1 ?== s2
Schnorr实现多签
在Mimble-Wimble中,使用Schnorr多签技术可以使得交易双方在不知道对方私钥的情况下对一笔交易进行多重签名,确保一笔交易的合法性。利用Schnorr多签技术,还可以实现无脚本的脚本(scriptless script)功能,例如实现一些合约功能,如原子交换等。
这里简单提一下运用Schnorr完成多签的原理。若A和B想在不了解对方私钥的情况下共同对一笔交易进行签名,只需要利用椭圆曲线上加法同态加密的思想就可以了。
可以看到,Schnorr的整个过程,包括加密和解密都是一个加法的验证过程,我们观察签名过程的核心公式
s * G == R + e * X
先说结果,若要实现A和B的多签,只需要将公式写成如下
(sA + sB) * G == (RA + RB) + e * (XA + XB)
可以看到,只要签名的双方共用一个e
值,就可以在不透露私钥的情况下,通过椭圆曲线上的加法同态加密即可进行签名和验证了。
具体的实现细节,可以看我的另一篇文章区块链上的隐私技术——Mimble-Wimble,其中介绍了利用Schnorr多签进行联合签名的细节。
Tips : 文章同步更新至我的Github : Kingsley-Sun的Github
Schnorr技术详解相关推荐
- 【H.264/AVC视频编解码技术详解】十九:熵编码算法(5)——H.264的CABAC(上):语法元素的二值化方法...
<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行 ...
- Linux磁盘阵列技术详解(二)--raid 1创建
我在Linux磁盘阵列技术详解(一)里已经详细介绍了几种RAID磁盘阵列方式,原理以及创建raid 0 的详细步骤.那么这篇文档就着重讲解如何创建raid 1的技术: 步骤如下: ① 分区 同样我们还 ...
- 《Hadoop技术详解》一导读
前 言 Hadoop技术详解 本书采用的约定 本书采用以下排版约定. 斜体 用于表明新的术语.URL.电子邮件地址.文件名和文件扩展名. 等宽字体 用于程序清单,正文段落中有关的程序元素,如变量及函数 ...
- 科普:5G网络关键技术详解
不久前,中国华为公司主推的Polar Code(极化码)方案,成为5G控制信道eMBB场景编码方案.消息一出,在网络上就炸开了锅,甚至有媒体用"华为碾压高通,拿下5G时代"来形容这 ...
- zookeeper 分布式过程协同技术详解.pdf_阿里大牛耗时18个月整理这份ZooKeeper分布式详解文档...
前言 摩尔定律揭示了集成电路每18个月计算性能就会增加一倍.随着信息的飞速膨胀,很多应用都无法依赖单个服务器的性能升级来处理如此庞大的数据量,分布式系统和应用越来越受到人们的青睐.分布式系统和应用不仅 ...
- Qtum量子链研究院:Plasma技术详解(下篇)
Plasma的设计模型有两个主要的分支:Plasma MVP(Minimal Viable Plasma,最小可行的Plasma)和Plasma Cash.Plasma MVP的目标是为最基本的可用的 ...
- Python数据科学-技术详解与商业实践视频教程
Python数据科学-技术详解与商业实践(八大案例) 网盘地址:https://pan.baidu.com/s/13QrR_5Er6LgWCWzSb7qOrQ 提取码:s7vw 备用地址(腾讯微云): ...
- 视频直播技术详解(8)直播云 SDK 性能测试模型
<视频直播技术详解>系列之八:直播云 SDK 性能测试模型 牛小七2016年10月12日发布在 视频直播技术详解 七牛云于 6 月底发布了一个针对视频直播的实时流网络 LiveNet 和完 ...
- 视频直播技术详解(7)现代播放器原理
<视频直播技术详解>系列之七:现代播放器原理 牛小七2016年9月29日发布在 视频直播技术详解 from: http://blog.qiniu.com/archives/7040 七牛云 ...
最新文章
- spring @Required
- 网络推广是做什么的介绍网站内容更新时需要遵循哪些原则?
- 【Intellij IDEA系列】IDEA泛型处理Unchecked assignment:'java.util.Map' to 'java.util.Maplt;'
- 【RabbitMQ】一文带你搞定RabbitMQ延迟队列
- POJ3197(连分数表示)
- 453. 最小操作次数使数组元素相等
- 【机器学习】Andrew Ng——01概述
- C++奥赛一本通贪心题解
- 通过命令行启动uwp应用
- 设置linux系统的线程数量,Linux_查看系统cpu个数、核心数、线程数
- [转]22条经典的编程引言
- Android studio 下载SDK
- 手把手教大家如何优化长尾关键词
- 海康摄像头使用网线连接电脑后无法访问摄像头ip
- 随想·手中没有红玫瑰
- (45.5)【API接口漏洞】API接口之Web Service测试工具Soap UI PRO、SOAPSonar、Burp Suite、WSSAT、WS-Attacker
- 图的表示(无权图和有权图)
- 七年级计算机会考重点知识点总结,2021年度七年级科学会考知识点整理.doc
- Oracle数据库启动与关闭
- 如何在win10中安装jdk