密码协议学习笔记(5):高级签名协议
(回顾:当待签名的数据无法参与签名算法的运算时,可以对其哈希值进行签名.)
盲签名:
盲签名的使用场景举例:
投票人需要让选举委员会为自己的选票背书,但又不愿向委员会透露自己到底向哪位候选人投票(防止被委员会或其他人打击报复)
用户User提供信息,私钥持有者Signer在不知道信息是什么的情况下进行签名.
一个盲签名方案一般由以下三个算法构成:
- Setup:概率多项式时间算法,输出系统参数
和签名人的公私密钥对 - Sign:概率多项式时间交互协议,公共输入:公钥
,签名人秘密输入:私钥 ,用户秘密输入:信息 ,停止后得到签名 - Verify:输入:系统参数
,签名人公钥 ,消息签名对 输出为1或0,代表签名有效或无效
盲签名的安全需求:
- 正确性:Sign进行的签名,Verify一定输出签名有效
- 不可伪造:不知道私钥
则无法生成有效签名 - 盲性:除请求签名的User,任何人都无法将Sign过程中的会话信息和最终的签名联系起来.
基本设计思路:
- 盲化:User用消息
计算出 - 签名:Signer对
签名得到 - 去盲:User通过
计算出签名
基于RSA问题的盲签名:
Setup:
Signer选定大质数
将
Sign:
User | Signer | |
选择一个随机数 使用扩展欧几里得算法计算出 对于待签名的信息 |
||
计算 |
||
计算 |
Verify:
判断
基于离散对数的盲签名:
(感觉书上的方案有点问题,先略过)
部分盲签名-基于双线性映射:
在盲签名协议中,被签名的消息完全由User控制,可能存在风险.为解决此问题,考虑允许Signer在签名中嵌入公共信息,这就是部分盲签名的概念.例如,将有效期作为电子货币的公共信息嵌入盲签名中.
回顾:双线性映射:
设
- 双线性性
, - 非退化性
- 计算有效性
,存在有效算法计算
Setup:
取大素数
双线性映射
Signer选择
将
Sign:
User | Signer | |
双方约定公共信息 |
||
选择随机数 对于待签名的信息 计算 其中 |
||
计算 |
||
计算 |
Verify:
对于消息
证明:
首先考虑
然后观察等式左端:
安全性:
由于User在计算
如果User要伪造签名,则需要计算哈希碰撞,这在计算复杂性上是不可能的.
群签名:
一些成员(member)和管理员(manager)所组成的群(group),任何成员可代表整个群做出签名,验证者只能验证签名来自该群,而无法验证来自哪个成员.除非管理员打开(open)该签名,此时才可揭示签名者的身份.
注意,一般群签名体制都要求允许额外添加成员,有的还允许移除成员.
群签名体制的构成:
- 初始化:产生用于验证的群公钥,属于成员的成员公钥,成员私钥,用于打开签名的管理员私钥
- 成员加入:新用户和管理员交互,获得批准后加入群,并获得密钥,有的协议中还需要颁发证书.
- 签名:群成员对消息产生签名.
- 验证:验证者使用群公钥验证某签名是否由该群成员签署.
- 打开:群管理员利用管理员私钥揭示签名由群中哪个成员签署.
群签名体制的安全性要求:
- 正确性:成员产生的合法密钥验证必然有效
- 不可伪造性:非群成员无法产生合法签名
- 匿名性:除非群管理员打开签名,否则无法揭示签名由哪个群成员产生
- 无关联性(强匿名性):除非群管理员打开签名,否则无法揭示任意两个不同的群签名是否由同一人产生
- 可跟踪性:群管理员可以通过打开揭示签名来自哪个成员
- 防陷害性:包括群管理员在内的任何群成员都不能产生其他成员的合法签名
- 抗联合攻击(强防陷害性):即使多个成员和管理员勾结,也不能产生其他成员的合法签名
一个简单的群签名方案:
假设
初始化:
GM为每个人分发一份私钥表,这些密钥表互不相交.
GM计算出所有表中的私钥对应的公钥,并以随机顺序排列为一张公钥表,并公开.
签名:
某成员要进行签名时,在自己的私钥表中选择一个未使用过的私钥,使用此私钥对消息签名.
验证:
验证者用公钥表中的所有公钥依次尝试验证,只要有一个公钥验证通过,则认为该签名是在群中产生的.
打开:
因为GM知道公钥表中公钥与私钥的对应关系,因此可以根据验证签名有效的那个公钥属于谁,来揭示谁是签名者.
该方案的缺陷:
- 每个私钥只能使用一次,否则会丧失无关联性
- GM由于知道所有人的私钥表,因此可以通过生成签名陷害成员
- 验证时,需要对公钥表中所有公钥进行验证,开销太大.
- ...
另一个简单的群签名方案:
该方案的改进在于不让GM知道群成员的私钥,该方案依赖ElGamal签名算法.回顾:密码协议学习笔记(1.5):几种常用的非对称密码体系 - Isakovsky - 博客园 (cnblogs.com)
设
初始化:
(博主注:如何防止私钥重复呢?注意,还要防止成员因为被告知私钥重复而推测出他人的私钥.博主想到的方案是,保证
GM为群成员随机生成
签名:
群成员将
具体而言,在
将
验证:
验证者使用公钥表中所有的公钥
具体而言,是判断
打开:
GM由于持有
该方案的优点:
- GM不持有私钥,因此无法再陷害成员
- 密钥表大小明显减小,验证开销降低
该方案的缺陷:
- 每个成员的私钥只有一个,多次签名会导致产生关联性,可通过定时颁发新的
来解决,或者一次颁发多个 - 当新成员加入时,也需要重新为所有人颁发新的
(否则攻击者就可以通过对比公钥表更新前后添加了谁,而区分出旧成员和新成员的签名) - 密钥表大小是
,当成员较多时开销还是太大.
短的群签名方案:
该方案基于双线性对,存在两个管理者,一个被称为issuer,负责颁发私钥,另一个称为opener,负责打开群成员身份.
注意,这个方案中,由于私钥是由issuer产生后颁发的,因此要求issuer可信(不主动陷害成员),以及issuer和成员之间的信道安全.(而opener则无法伪造签名)
初始化:
令
取
取
(用如下方式生成
记
将
加入:
假设系统中有
签名:
给定群公钥
- 选择
- 计算
- 选择
- 计算
- 计算
- 计算
- 将
作为对 产生的签名发布.
(博主注:如何计算
验证:
当已知公钥
- 计算
- 接受签名,当且仅当
不考虑哈希碰撞的问题,签名被接受,当且仅当
观察第二项:
然后分别观察:
将结论代回:
因此:
打开:
给定群公钥
- 验证该签名是群成员产生的有效签名.
- 计算
- 检查
与哪个 相符,以此获知对应的成员
该方案的的公钥大小与成员数量无关,大大减小运算开销(使用了椭圆曲线上的"压缩存储技术")
虽然双线性映射计算开销较大,但
成员撤销:
在群签名体制中,有时(由于离职等原因)需要撤销成员的身份,不再认可该成员使用群的私钥做出的签名有效性.
在前文提到的两种"简单的群签名方案"中,管理员只需要将成员对应的公钥从公钥表中移除即可.
短的群签名方案的成员撤销操作:
在"短的群签名方案"中,可以通过发布"撤销成员列表"的方式撤销群成员.
成员
撤销成员
- issuer将撤销成员的私钥发布在撤销成员列表上
- (任何人都可以)计算
然后将 作为新的群公钥发布,此时,仍满足 - 剩下的群成员以如下方式更新它们的私钥,以成员
为例,它的原私钥是 ,它计算 更新自己的私钥.此时 (撤销列表发布时也可以预先计算出 并作为附加信息发布)
这样做的好处是,当成员被撤销时,不需要所有成员在线,只需要当它们上线的时候,检查撤销列表的末尾,更新自己的私钥即可.
环签名:
在古代,大臣们向皇上进谏,但由于忠言逆耳,皇帝如果不满意直谏,就会发威将带头进谏的人杀掉。于是大臣们想了一个办法,在奏折上画个圈圈,每个赞同提议的大臣们在圆圈外围署名,这样一来,一荣俱荣,一损俱损,皇上无法从名字上来识别出谁是带头者,从而大臣们就保全了自己。
密码学中的环签名则考虑这样的场合:某个国家的内阁成员他知道一条关于首相的丑闻,并想将这个丑闻泄露给报刊记者。自然不能对这个丑闻使用普通数字签名,因为这样会暴露自己的身份。也不能随便让一个平民百姓去告诉记者,因为这样的检举不具有可信性。 此时,可以选择所有内阁成员,连同自己一起构成一个环,然后使用环签名体制,对该丑闻产生环签名,将产生的消息签名对发送给记者。记者接到后执行环签名验证算法,之后可以确信这个消息是由内阁中的某个成员泄露,从而具有很大的可信性;但同时记者无法获知检举人的身份.
安全性需求:
- 正确性(consistency):环内任意成员进行的签名都能被验证有效
- 匿名性(anonymity):任一验证者无法识别真正的签名人
- 不可伪造性(unforgeability):不在环中的成员无法生成有效签名
- 可链接性(linkabilily):(部分环签名提供这种性质)可以确定两个签名是否是同一人产生的(但仍然无法确认此人身份)(例如,要向某公司中所有员工匿名收集问卷,但每人最多允许提交一份)
不具有可链接性的环签名:
该体系基于双线性映射构造.
令
设环中有
环签名生成算法(ring-sign):
设成员
- 计算
- 选择随机数
- 计算
- 计算
- 输出
环签名验证算法(ring-verify):
给定环
若成立,则认为签名有效.
实际上:
注意,
而对于
因此,
代回原式,
需要说明的是,
具有可链接性的环签名:
该体系基于离散对数问题构造.
令
设环中有
环签名生成算法(ring-sign):
设成员
- 计算
- 选择随机数
- 对于
,计算 - 计算
- 计算
- 将
作为签名输出.
环签名验证算法(ring-verify):
给定消息
然后检查如下等式是否成立:
如果成立,则接受签名.
显然,若不考虑哈希碰撞的话,当且仅当
观察
环签名链接算法(link):
给定签名
当环内成员试图陷害环内其他成员
而当环内成员只是试图隐藏自己的身份,不去管到底嫁祸给了谁时,它尝试截获其他场合获得的某个过期的
基于身份的数字签名(Identity Based Signature, IBS):
(回顾:基于身份的密钥分配密码协议学习笔记(2):密钥交换协议 - Isakovsky - 博客园 (cnblogs.com))
将用户的公开身份信息(电子邮件,身份证号)等作为公钥(或将其哈希值作为公钥)私钥则通过可信第三方由密钥生成器(Private Key Generator, PKG)生成.并通过安全信道发送给用户.
IBS的构成:
常用的IBS体系由以下四个算法构成:
初始化(Setup):
PKG生成系统的主密钥和参数
私钥提取(Extract):
PKG获得用户身份信息
签名(Sign):
用户使用系统参数
验证(Verify):
验证者使用系统参数
安全性需求:
一般地,说数字签名体制是安全的,是指它具有在适应性选择消息攻击下的不可伪造性.
说一个基于身份的数字签名体制是安全的,是指它具有在适应性选择消息和选择身份攻击下的不可伪造性.
更严格地,可以使用下面的形式化定义:
设IBS=(Setup,Extract,Sign,Verify)是一个基于身份的数字签名体系,防御者
Charlie | Alice | |
运行Setup算法,生成系统参数 |
||
任意选择身份信息 |
||
生成 |
||
任意选择身份信息 |
||
生成 |
|
|
|
||
最后,生成一个三元组 |
||
运行验证算法 若验证的结果是签名有效,则称Alice赢得了博弈. |
|
如果攻击者无法在多项式时间内以不可忽略的概率在上述博弈中获胜,则称IBS在适应性选择消息身份攻击下是不可伪造的.
使用双线性对技术的IBS:
Setup:
令
PKG随机选择
Extract:
用户提交一个身份信息
Sign:
给定消息
最后输出
Verify:
验证签名
然后验证下列等式是否成立:
若成立,则认为签名有效.
实际上:
不使用双线性对的IBS(基于RSA):
由于双线性对计算开销较大,因此一些不使用双线性对的技术也被提出了
(回顾:RSA签名体系:密码协议学习笔记(1.5):几种常用的非对称密码体系 - Isakovsky - 博客园 (cnblogs.com))
Setup:
PKG选择两个大素数
选择哈希函数
(博主注:书中写的哈希函数值域是
将
Extract:
用户发送
Sign:
对于消息
将
Verify:
验证者计算下列等式是否成立:
成立则认为签名有效.
实际上:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~