零知识证明系列之二——Schnorr协议

article/2025/10/4 5:05:02

​Schnorr协议简介

Schnorr协议是由德国数学家和密码学家Claus-Peter Schnorr在1991年提出,是一种基于离散对数难题的知识证明机制。Schnorr本质上是一种零知识的技术,即Prover声称知道一个密钥x的值,通过使用Schnorr加密技术,可以在不揭露x的值情况下向Verifier证明对x的知情权,即可用于证明你有一个私钥。

预备知识

想要彻底了解这个协议,我们需要一些预备知识(如果你没有看懂上面的协议简介的话)。

1.公钥加密机制

在之前HIBE的文章里有涉及到,在公钥密码体中,每个通信方均拥有一个密钥对,即公钥(public key)和私钥(private key),在加密方案中分别用于加密和解密消息,与传统的非对称加密体制不同的是,公钥和私钥是不同的。

2.椭圆曲线算法

椭圆曲线并不是椭圆,而是形如以下形状的关于x轴对称的曲线:

因为涉及群,域等数学概念,我尽量描述得通俗易懂些(可能并不是特别准确,感兴趣的读者可以参考相关资料)。

假设现在随机生成一个秘密密数字a,我们可以把这个数字当作成私钥,然后把它映射到椭圆曲线群上的一个点 a*G,简写为 aG。这个点我们把它当做公钥。

于是我们有:

  • sk = a

  • PK = aG

椭圆曲线群和有限域之间存在着一种同态双射关系。什么叫双射呢?就是把一个集合X的每个元素都对应集合Y的一个元素,就像下面这样:

有限域,我们用 q这个符号表示,当q为素数的时候,我们管它叫素数域,它是指从 0, 1, 2, …, q-1这样一个整数集合。而在一条椭圆曲线上,我们通过一个基点,G,(确切的说是生成元)可以产生一个循环群,标记为 0G, G, 2G, …, (q-1)G,正好是数量为 q个曲线点的集合。

任意两个曲线点正好可以进行一种类似于加法的二元运算 ,P (假设为2G)+ Q (假设为3G)= R(就是5G),(如上图所示,找到两个相加的点的延长线与椭圆曲线的交点,就得到新的点R)并且满足交换律和结合律。于是我们就用 +这个符号来表示。我们在素数域的加法都可以在椭圆曲线上进行类比,但是椭圆曲线上好像有无穷多个点,我们需要在把椭圆曲线限制到一个有限域内,而我们之所以把这个群称为循环群,因为把群的最后一个元素 (q-1)G,再加上一个 G就回到群的第一个元素 0G。

下面是曲线 

的图像。可以发现,椭圆曲线变成了离散的点,且关于y=p/2对称。

给任意一个有限域上的整数 r,我们就可以在循环群中找到一个对应的点 rG,但是反过来给你rG让去找到r是一件很困难的,在密码学中被称为离散对数难题。

也就是说,如果任意给一个椭圆曲线循环群上的点 R,那么到底是有限域中的哪一个整数对应 R,这个计算是很难的,如果有限域足够大,比如说 256bit 这么大,我们姑且可以认为这个反向计算是不可能做到的。

Schnorr 协议充分利用了有限域和循环群之间单向映射,实现了最简单的零知识证明安全协议:证明者向验证者证明她拥有 PK 对应的私钥 sk。

交互式Schnorr协议流程

我们让Alice充当证明者,Bob充当验证者,协议流程如下:

Alice:随机地选择一个标量,然后计算出(为椭圆的生成元),将发送给Bob;

Bob:回应一个随机标量;

Alice:通过计算,将标量回应给Bob;

Bob:将z转换为椭圆曲线上的点,即,然后验证

交互过程如下图:

首先我们来复习一下之前所说的零知识证明的三个特性:

(1)完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。

(2)合理性。没有人能够假冒证明方,使这个证明成功。

(3)零知识性。证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。

下面我们来一一进行比对:

1.完备性:在等式  等式边同时乘以,便得到,所以说,按照协议里的交互流程,一定能够通过验证者的验证,即验证了完备性。

2.合理性:如果Alice事先不知道私钥的话,那么他是否可以构造出  和  那么是否可以在最后一步验证成功呢?将 带入最后一个需要Bob等式 ,可得,我们在等式两边同时约去  ,可得  ,这其实就是Bob在椭圆曲线上同态地检查 。因为Alice不知道的值,所以就无法得知等式右边的值,自然也就无法找到对应的  和  了。(这里只是一个简单的阐述,更深层的需要了解抽取器的涵义)

3.零知识性:Bob 验证是在椭圆曲线群上完成。Bob知道 映射到曲线上的点,但是不知道本身;Bob 知道  映射到曲线群上的点 ,即,但是不知道  本身。Bob 可以校验  的计算过程是否正确,但是又没有暴露  和  的值(这里只是一个简单的阐述,更深层的需要了解模拟器的含义)。

非交互式Schnorr协议流程

交互式Schnorr 协议中,Bob 需要给出一个随机的挑战数 c,这里我们可以让 Alice 用下面这个式子来计算这个挑战数,  ,因为哈希函数的单向性,虽然 c 是 Alice 计算的,但是 Alice 并没有能力实现通过挑选 c 来作弊。

这样,就把三步Schnorr协议合并为一步。Alice可直接发送(R,z),因为Bob拥有Alice的公钥PK,于是Bob可自行计算出c。然后验证。

这里运用到了Fiat-Shamir协议 ,它可以把整个协议压缩成一步交互,有兴趣的读者可以深入了解相关内容。

结语

在这篇文章中,我们简单地介绍了一个专职零知识证明,schnorr协议。我们又离通用的零知识证明协议更近了一步。下一篇文章我们将会来一起探讨那个深奥的zk-snark,不过在这之前,我们还需要一些预备知识来进行铺垫。

参考:

公众号“安比实验室”:https://github.com/sec-bit/learning-zkp/blob/master/zkp-intro/2/zkp-simu.md

更多相关知识内容:

零知识证明系列之一——初探零知识证明

电子投票系统与区块链

Tips

更多长安链开源项目QA,可登录开源社区、技术文档库查看。

下载源码

https://git.chainmaker.org.cn/chainmaker/chainmaker-go

查阅文档

https://docs.chainmaker.org.cn/

 “长安链ChainMaker”是国内首个自主可控区块链软硬件技术体系,由微芯研究院联合头部企业和高校共同研发,具有全自主、高性能、强隐私、广协作的突出特点。长安链面向大规模节点组网、高交易处理性能、强数据安全隐私等下一代区块链技术需求,融合区块链专用加速芯片硬件和可装配底层软件平台,为构建高性能、高可信、高安全的数字基础设施提供新的解决方案,为长安链生态联盟提供强有力的区块链技术支撑。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”


http://chatgpt.dhexx.cn/article/r7RD4MLe.shtml

相关文章

Schnorr 签名方案和 BLS 签名方案的全面对比

原文:https://medium.com/cryptoadvance/bls-signatures-better-than-schnorr-5a7fe30ea716https://medium.com/cryptoadvance/how-schnorr-signatures-may-improve-bitcoin-91655bcb4744 Schnorr 签名算法最初是由德国密码学家 Claus Schnorr 于 2008 年提出的&…

Schnorr签名算法(初始化和签名)C语言实现

Schnorr签名算法(初始化和签名) Schnorr签名算法(验证) Schnorr签名算法(正确性) Schnorr签名算法(举例) Schnorr签名算法(举例) C语言实例 #include <stdlib.h> #include <stdio.h> #include <time.h> int xy[22]; // 判断两个数是否互质 int isHuZhi(int …

Schnorr数字签名方案

Schnorr数字签名方案 Schnorr签名算法最初由德国密码学家claus schnorr于2008年提出&#xff0c;在密码学中&#xff0c;它是一种数字签名方案&#xff0c;以其简单著称 Schnorr数字签名方案也是基于离散对数的&#xff08;基于离散对数的还有ElGamal数字签名方案、DSA数字签…

记录我看的密码学方案中的技术,Shamir秘密共享,Schnorr零知识证明,EIGamal密码体制

记录我看的论文中基于的技术&#xff0c;对他们进行大概介绍 Shamir 秘密共享方案零知识证明EIGamal密码体制 Shamir 秘密共享方案 1979年&#xff0c;Shamir提出的一个基于拉格朗日插值的(k,n)门限方案 目的&#xff1a;可以将秘密s分给n个成员&#xff0c;规定至少有k&#…

schnorr签名和batch verification

schnorr 签名 概念&#xff1a;Schnorr签名算法最初是由德国密码学家ClausSchnorr于2008年提出的&#xff0c;在密码学中&#xff0c;它是一种数字签名方案&#xff0c;以其简单高效著称 原理&#xff1a;其安全性基于某些离散对数问题的难处理性。 签名过程&#xff1a; 和…

密码学学习笔记(十六 ):Schnorr签名算法

交互式零知识证明 零知识证明(ZKP)就是不会将证据泄露给验证者的知识证明。Schnorr身份认证识别协议是一个交互式ZKP&#xff0c;它满足了完备性、可靠性、零知识性。所谓的交互式ZKP方案通常包含3个步骤&#xff08;承诺、挑战和证明&#xff09;&#xff0c;在文献中通常被称…

ECDSA VS Schnorr signature VS BLS signature

1. ECDSA ECDSA&#xff0c;全称为Elliptic curve Digital Signature Algorithm&#xff0c;采用Elliptic curve cryptography来实现的数字签名算法。 公私钥对 ( p k , P ) (pk,P) (pk,P)&#xff0c;其中公钥 P p k G Ppk\times G PpkG&#xff0c; G G G为所选椭圆曲线的…

BSV 上的 Schnorr 签名

我们已经在 BSV 上实现了 Schnorr 签名。这是第一个也是唯一一个已知的实现&#xff0c;没有对原始协议进行任何更改。 一笔交易一个签名 Schnorr 是一种可以用于替代比特币签名当前使用的 ECDSA 算法的替代算法。一个关键优势是&#xff0c;同一交易的一个输入或多个输入中的多…

深入浅出零知识证明(一):Schnorr协议

最近在学习零知识证明&#xff0c;因为内容很多并且难度也大&#xff0c;想根据自己的学习路线做一系列总结&#xff0c;这是第一篇文章&#xff0c;主要介绍零知识证明的一些重要概念和思想&#xff0c;可以对零知识证明有直观的理解&#xff0c;然后讲解一个经典简洁的零知识…

密码学——Schnorr签名算法

一、基本知识 1.1 概述 Schnorr签名算法最初是由德国密码学家ClausSchnorr于2008年提出的&#xff0c;在密码学中&#xff0c;它是一种数字签名方案&#xff0c;以其简单高效著称&#xff0c;其安全性基于某些离散对数问题的难处理性。 1.2 椭圆曲线上的计算 密码学中&…

什么是 Schnorr 签名?

在密码学中&#xff0c;Schnorr 签名是由 Schnorr 签名算法生成的数字签名。 与大多数区块链不同&#xff0c;BTC自其早期以来基本保持不变&#xff0c;大多数升级都是有限的&#xff0c;并旨在增强网络的效率而不是功能。BTC协议的更新是非常罕见的&#xff0c;并且通常用于技…

史上最全的Schnorr签名方案和BLS签名方案的全面对比

前言 Schnorr 签名算法最初是由德国密码学家 Claus Schnorr 于 2008 年提出的&#xff0c;而来自区块链协议公司 Blockstream 的密码学家 Gregory Maxwell、Pieter Wuille 等人&#xff0c;则在 2018 年提出了一种名为 MuSig 的 Schnorr 签名方案&#xff0c;这也是我们即将探索…

Schnorr身份识别方案

Schnorr身份识别协议是又一个零知识证明协议&#xff0c;相比Fiamt协议有两点不同&#xff0c;一是其安全性依赖于离散对数的困难性&#xff0c;二是该方案使用乘法群&#xff0c;从而可以提前计算了一些参数&#xff0c;减小了证明者实时计算开销&#xff0c;特别适合计算能力…

Schnorr协议:非交互零知识身份证明和数字签名

本文首发公众号区块链之美&#xff01;致力于区块链技术研究&#xff0c;传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。 摘要&#xff1a;本篇文章介绍Schnorr的两大应用场景&#xff1a;从交互式零知识身份证明到非交互零知识身份证明、数字签名实现基本原理…

matlab实现rrt算法

这一部分算法强烈推荐两篇博客&#xff0c;尤其是第一篇博客介绍算法的原理非常简单易懂&#xff1a; https://blog.csdn.net/weixin_43465857/article/details/96451631 https://www.cnblogs.com/long5683/p/11795987.html https://blog.csdn.net/aoyousihaiqiuqihuang/articl…

RRT*算法的原理简介以及Python实现代码

![RRT算法原理图](https://img-blog.csdnimg.cn/20210420101155956.png?x-oss-p RRT大致流程 1.初始化随机树tree&#xff0c;以空的随机树开始添加节点&#xff0c;最开始只有Qinit。 2.执行sample函数&#xff0c;在地图中获得一个随机点Qrand。 3.遍历tree中所有节点&#…

RRT 算法研究(附 Python / C++ 实现)

RRT 算法研究 参考 机器人路径规划、轨迹优化课程-第五讲-RRT算法原理和代码讲解 机器人路径规划之RRT算法(附C源码) RRT算法(快速拓展随机树)的Python实现 《基于改进RRT算法的路径规划研究》 《面向室内复杂场景的移动机器人快速路径规划算法研究》 理论基础 RRT&#xff0…

RRT* 算法研究(附 MATLAB 和 Python 实现)

RRT* 算法研究 参考 机器人路径规划、轨迹优化课程-第六讲-RRT*算法原理和代码讲解 路径规划 | 随机采样算法&#xff1a;PRM、RRT、RRT-Connect、RRT* 基于采样的运动规划算法-RRT(Rapidly-exploring Random Trees) 《改进RRT算法在移动机器人路径规划中的应用研究》 理论基础…

算法实现1——一步一步实现RRT(算法原理及matlab代码)

首先我们得明白算法的原理&#xff0c;然后写出步骤。根据步骤可以写出主函数包括每一步的输入输出&#xff0c;怎么表示&#xff08;基本的伪代码表示&#xff0c;当然如果可以也可以写成汉字形式的&#xff09;&#xff0c;最后一步一步写出代码&#xff0c;调试工作是必须的…

RRT、RRT-connect、RRT*等算法、A*等等路径规划算法

1 原始RRT算法运行结果&#xff1a;python&#xff0c;这里以2D_rrt及其衍生相关算法为例&#xff08;边做边更新&#xff09; CV搬运工们&#xff0c;先上github连接&#xff1a;&#xff08;点个赞呗&#xff09;&#xff08;不想要拿github包的后面有现成代码&#xff09;…