深入学习区块链的隐私保护(三)Schnorr签名

Schnorr签名算法是由Claus Schnorr提出,是一个椭圆曲线上的签名算法,我们回顾下素数域上一些术语:

  • 椭圆曲线的阶:椭圆曲线所有点的个数,包含无穷远点;
  • 椭圆曲线上点的阶:若P为椭圆曲线上的点,nP=无穷远点,n取最小整数,即n为P的阶。
  • 基点:椭圆曲线参数之一,用G表示,是椭圆曲线上的一点;
  • 余因子:椭圆曲线的余因子,用h表示,为椭圆曲线点的个数/基点的阶。
  • 椭圆曲线参数:素数域:(p,a,b,G,n,h),其中p为素数,确定F_{p},a和b确定椭圆曲线的方程,G为基点,n为G的阶,h为余因子。

首先介绍下Schnorr签名算法,假设签名者的公私钥对为$(sk,pk)$,其中$sk\in Z_{n}^{*}$,$pk=sk\cdot G$,G为基点,为消息m进行签名,签名过程如下:

  1. 随机选取一个整数k\in Z_{n}^{*}
  2. 计算R=k\cdot G
  3. 计算s=k+H(m||R||pk)*sk\, mod \, n,如果s=0,则返回1重新选择。

签名者将签名(R,s)和消息m发送给验证者,验证者进行验签,验证如下等式是否成立:
  s\cdot G==R+H(m||R||P)\cdot P
  若成立,则验签成功。

Schnorr签名算法相较于ECDSA存在一个有趣的属性,可以将多个签名组合在一起,然后使用相对应的多个公钥共同对组合后的签名进行验证。

我们假设现在有两个分别使用不同私钥sk_{1},sk_{2}生成的签名(R_{1},s_{1})(R_{2},s_{2}),签名的消息分别为m_{1}m_{2}。我们可以得到:
s_{1}+s_{2}=k_{1}+H(m_{1}||R_{1}||pk_{1})*sk_{1}+k_{2}+H(m_{2}||R_{2}||pk_{2})*sk_{2}

验签时,进行如下判断即可:
s_{1}\cdot G+s_{2}\cdot==R_{1}+H(m_{1}||R_{1}||P_{1})+R_{2}+H(m_{2}||R_{2}||P_{2})
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章