Schnorr签名算法是由Claus Schnorr提出,是一个椭圆曲线上的签名算法,我们回顾下素数域上一些术语:
- 椭圆曲线的阶:椭圆曲线所有点的个数,包含无穷远点;
- 椭圆曲线上点的阶:若P为椭圆曲线上的点,nP=无穷远点,n取最小整数,即n为P的阶。
- 基点:椭圆曲线参数之一,用G表示,是椭圆曲线上的一点;
- 余因子:椭圆曲线的余因子,用h表示,为椭圆曲线点的个数/基点的阶。
- 椭圆曲线参数:素数域:,其中p为素数,确定,a和b确定椭圆曲线的方程,G为基点,n为G的阶,h为余因子。
首先介绍下Schnorr签名算法,假设签名者的公私钥对为$(sk,pk)$,其中$sk\in Z_{n}^{*}$,$pk=sk\cdot G$,G为基点,为消息m进行签名,签名过程如下:
- 随机选取一个整数;
- 计算;
- 计算,如果s=0,则返回1重新选择。
签名者将签名和消息m发送给验证者,验证者进行验签,验证如下等式是否成立:
若成立,则验签成功。
Schnorr签名算法相较于ECDSA存在一个有趣的属性,可以将多个签名组合在一起,然后使用相对应的多个公钥共同对组合后的签名进行验证。
我们假设现在有两个分别使用不同私钥生成的签名和,签名的消息分别为和。我们可以得到:
验签时,进行如下判断即可: