Appearance
盲签名
概述
: 签名者生成公私钥对 。 : 用户选择随机数 ,计算盲化消息 并发送给签名者。 : 签名者使用私钥 对盲化消息 进行签名,生成盲签名 并返回给用户。 : 用户使用随机数 对盲签名 进行去盲化,得到最终签名 。 : 验证者使用公钥 验证消息 和签名 的有效性。
主要应用于隐私保护,例如我有一个投票消息,需要签名者对其进行签名以证明其有效性,但不希望签名者知道具体内容,也不希望签名者能够将签名与我关联起来,就可以通过盲签名来实现。
RSA盲签名
: 签名者选择两个大素数 和 ,计算 ,计算 ,其中 。公钥为 ,私钥为 。 : 用户选择随机数 ,计算盲化消息 并发送给签名者。 : 签名者使用私钥 对盲化消息 进行签名,生成盲签名 并返回给用户。 : 用户使用随机数 对盲签名 进行去盲化,得到最终签名 , : 验证者计算 。
Schnorr盲签名
回顾:Schnorr签名
: 选择素数 使得 ,取阶为 的生成元 ;设哈希 。私钥 ,公钥 。 : 签名者选随机数 ,计算 ,计算 ,计算 ,签名为 。 : 验证者计算 ,检查 。 - 也可以令
,验证时计算 ,然后计算 ,检查 。
具体步骤
原始版
优化版
: 选择素数 使得 ,取阶为 的生成元 ;设哈希 。私钥 ,公钥 。 : 签名者选随机数 ,计算 ,发送 给用户。 : 用户选盲化因子 ,计算 ,令 ,并令 ,把 发给签名者。 : 签名者计算 ,返回 。 : 用户计算 ,得到最终签名 。 : 验证者计算 ,检查 。
正确性:本质上是确认
BLS 盲签名
KeyGen
- Sample
- Calc
Blind
- Sample
- Blind the message:
Sign
- Sign the blinded message:
Unblind
- Unblind the signature:
- Obvoiusly obtain the signature on the original message:
Verify
- Calc
BBS+
记双线性映射为
,阶为素数 。
公开生成元。
对消息数量为,为每个消息准备独立基点 ,并有额外基点 。
1. 签名者 - KeyGen
- Setup:
- Sample
(签名私钥) - Calc and publish
(签名公钥)
2. 用户 - Blind(承诺被盲化消息)
设有消息向量
- 用户取随机盲化因子
- 计算承诺(对隐藏消息):
其中 为隐藏消息下标集合。 - 用户给签名者发送:
- 承诺
- 公开消息
(若有), 为公开下标集合 - 对
的“消息知晓证明”(PoK,证明其确实知道 与隐藏消息,防止恶意构造)
- 承诺
3. 签名者 - BlindSign
签名者验证用户 PoK 通过后:
- 采样随机
- 先组合公开消息项:
- 将用户承诺并入:
- 计算盲签名核心:
- 返回盲签名:
4. 用户 - Unblind
用户收到
- 计算
- 得到最终 BBS+ 签名:
直观上,签名者签的是
,而 里含有用户承诺的 。去盲后把这部分并入 。
5. 验证者 - Verify
给定消息
- 计算
- 检查双线性等式
- 成立则验签通过。
正确性说明(简)
由签名构造
可得
两边分别与
又因
验证式成立。
选择性披露与零知识证明(BBS+ Proof of Knowledge)
设签名为
证明者想公开一部分消息
目标:向验证者证明“我持有一个有效 BBS+ 签名,且公开消息值正确”,同时不泄露隐藏消息与签名本体可链接信息。
证明者 - ProofGen
随机重随机化签名(unlinkability)
取随机,计算 其中
这一步保证同一原始签名每次出示得到不同证明,防止关联。
把“签名关系”改写为线性知识关系
可整理为(等价约束):实际实现时通常将公开项移到常量侧,仅对秘密变量做 Schnorr 型 PoK。
承诺阶段(Sigma 协议第一步)
对秘密变量(如及重随机化辅助量)采样随机掩码,构造承诺点 。 挑战生成(Fiat-Shamir)
其中
ctx建议包含域分离标签、协议版本、会话 nonce(防重放)。响应计算
对每个秘密输出响应 得到证明
验证者 - ProofVerify
- 检查披露消息编码、下标集合
合法。 - 用
中的 重建各承诺 (按验证方程)。 - 重新计算
- 验证
;一致则证明通过。
这表示:存在隐藏消息与签名见证,使得公开消息与某个有效 BBS+ 签名一致。

