Schnorr签名及其变种签名

探讨Schnorr签名的历史及其在多方签名中的应用,分析秘钥前缀技术的作用及其实现方式,介绍如何通过修改Schnorr签名实现简单的多方签名方案,包括秘钥聚合属性和秘钥生成协议的改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Schnorr 签名

这个基于离散对数的签名历史比较悠久了,结构也很简单,现在很多的签名都是这个签名的变体:
在这里插入图片描述
这里需要注意的一个点是公共参数c的生成,这几技术被叫做“key-prefixed”这个协议将公钥R和m 共同进行哈希,有论文表示这种做法对于多方的签名有更好的帮助。后来,有文献指出这种协议在Schnorr 中的作用是不必要的。

一种原生的设计多签名的方法如下:
在这里插入图片描述
通过简单的修改,就可以得到一个非常简单的多方签名方案,这就是一个传统的秘钥前缀希诺签名协议。并且明显的,这签名协议,不需要秘钥协商的过程,各方直接公布自己的公钥,然后各方就可以直接计算。这的确不需要任何的秘钥生成阶段假设,明显的,生成签名之后,在验证的时候,直接可以将所有的公钥联和在一起验证计算,这个属性称之为秘钥聚合属性。然而这有一个明显的缺点如下:
在这里插入图片描述
此时第一参与方就可以自己生成签名,然后发送给其他非签名者验证。

对这种行为的改进,是通过使用交互式秘钥生成协议。但是这个秘钥生成协议可能比较复杂,这其实是比较麻烦的。
随后BN提出了解决方案,可以避免使用复杂的秘钥生成方案。他们的主要思想是,对公开参数C进行拆分。
这是非常容易理解的,因为之前是因为C中只有聚合公钥,而此时聚合的公钥已经被修改了,所以无法鉴别,所以可以通过使用将各签名者的签名渗透到C的生成中,在验证的时候需要遍历C。但是最为重要的是,这个方案不在允许秘钥聚合。
所以就有了新的方案。

### Schnorr 签名算法实现代码示例 Schnorr签名是一种基于离散对数问题的数字签名方案,在许多现代加密库中得到了广泛应用。下面是一个简单的Python实现,用于展示如何创建和验证Schnorr签名。 #### 密钥生成 为了使用Schnorr签名,首先需要生成一对公私钥: ```python import hashlib from random import randint def generate_keys(p, q, g): """Generate a public/private key pair.""" # Generate private key d (random integer between 1 and q-1) d = randint(1, q - 1) # Calculate the corresponding public key Q = g^d mod p Q = pow(g, d, p) return d, Q ``` 此部分实现了密钥对的生成过程[^1]。 #### 创建签名 当拥有了一对有效的公私钥之后,就可以利用它们来进行消息的签署操作了: ```python def sign(message, d, p, q, g): """Sign a message using the private key.""" k = randint(1, q - 1) # Select ephemeral key k randomly from Z_q* r = pow(g, k, p) % q # Compute commitment R=g^k mod p e = int(hashlib.sha256((str(r)+message).encode()).hexdigest(), 16) % q # Hash function H(R||M)=e s = (k - d * e) % q # Signature component S=k-d*e mod q return r, s ``` 这里展示了具体的签名流程以及参数计算方法。 #### 验证签名 最后一步是对接收到的消息及其附带的签名字节串进行校验,确认其真实性: ```python def verify_signature(message, signature, Q, p, q, g): """Verify a signed message against its claimed originator's public key""" r, s = signature if not (0 < r < q and 0 < s < q): return False # Check range of components e = int(hashlib.sha256((str(r)+message).encode()).hexdigest(), 16) % q # Recompute hash value E=H(R|M) v = pow(g, s, p) * pow(Q, (-e), p) % p # Verify equation V=G^s*Q^-E mod P return v % q == r # Final check on equality condition ``` 上述代码片段提供了完整的Schnorr签名机制的功能演示,包括但不限于密钥生成、签名创建及有效性检验等功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值