密码学06-数字签名

数字签名的基本概念

数字签名

  • 数字签名是一种类似写在纸上的传统的物理签名。它使用公钥加密技术实现,用于鉴别数字信息或者签名者身份的方法。
  • 数字签名必须保障:
    1. 接收者能够核实发送者对文档的签名;
    2. 发送者事后不能否认对文档的签名;
    3. 不能伪造对文档的签名

数字签名载体

  • 一个签名有消息和载体两个部分,即签名所表示的意义和签名的物理表现形式

数字签名VS手写签名

  • 传统手写签名中签名与文件是一个物理整体

    • 具有共同的物理载体
    • 物理上的不可分割、不可复制的特性
    • 签名与文件的不可分割和不能重复使用
  • 数字签名中,签名与文件是电子形式

    • 没有固定的物理载体,即签名及文件的物理形式和消息已经分开
    • 电子载体是可以任意分割、复制的
    • 数字签名有可能与文件分割,被重复使用
  • 传统签名的验证是通过与存档手迹对照来确定真伪的,它是主观的、模糊的、容易伪造的,从而也是不安全的。

  • 数字签名则是用密码,通过公开算法可以检验的,是客观的、精确的,在计算上是安全的。

传统签名和数字签名的特点

  • 传统签名的基本特点:
    • 能与被签的文件在物理上不可分割
    • 签名者不能否认自己的签名
    • 签名能被伪造
    • 容易被验证
  • 数字签名是传统签名的数字化,基本要求:
    • 能与所签文件“绑定”
    • 签名者不能否认自己的签名
    • 签名不能被伪造
    • 容易被自动验证

数字签名的构成

  • 一个数字签名方案包括如下3个算法:
    • 密钥生成: 产生用户的公私钥
    • 签名算法: 产生消息的签名
    • 验证算法: 验收消息的签名是否是合法

数字签名安全需求

  • 数字签名方案为了实现安全认证,需要满足如下条件:
    • 必须相对容易生成该数字签名
    • 必须相对容易识别和验证该数字签名
    • 伪造该数字签名在计算上不可行,既包括对一个已有的数字签名构造新的消息,也包括对一个消息伪造一个数字签名

RSA签名算法

RSA签名算法

[[密码学04-公钥密码#RSA加密算法]]

密钥生成

  1. 选两个保密的大素数 pq,计算 n=p×q,ϕ(n)=(p1)(q1)
  2. 选一整数 e,满足 1<e<φ(n),且 gcd(φ(n),e)=1
  3. 计算 d,满足 d·e1modφ(n)
  4. {e,n} 为公钥, {d,n} 为私钥

签名算法

设消息为 mZn,对其签名为 smdmodn,消息 m 的签名为 s

验证算法

接收方在收到消息 m 和签名 s 后,验证 m?semodn

如果等式成立,则s是消息m的有效签名;反之,则是无效签名。

RSA签名的正确性

  • 因为 d·e1modφ(n)
  • 所以 semdem1+kφ(n)m1mkφ(n)mmodn
  • 其中 k 为某个整数

RSA签名算法---缺点

  • 对任意 yZn,任何人可计算 xyemodn, 因此任何人可伪造对随机消息 x 的签名。

  • 如果消息 x1x2 的签名分别为 y1y2,则知道 x1,y1,x2,y2 的人可伪造消息 x1x2 的签名 y1y2

  • 在RSA签名方案中,需签名的消息 xZn,所以每次只能对 log2n 位长的消息进行签名。 签名速度慢

  • 解决方法:引入 Hash 函数 ——[[密码学05-Hash函数]]

  • [!] RSA签名方案的安全性归约于大数分解问题

ElGamal签名算法

  • 1985年,EIGamal提出了一个基于离散对数问题的签名方案,后来称为EIGamal数字签名方案。
  • 1991年该数字签名方案的变形被美国国家标准局(NIST)确定为数字签名标准(DSS)
  • [i] 采用离散对数困难问题——[[密码学04-公钥密码#ElGamal公钥密码体制]]

ElGamal签名算法

密钥生成

  • [i] 选取大素数一般采用 Miller-Rabin素性测试(Miller-Rabin Primality Test)

这是一种概率性算法,它基于数论中的一些重要定理。该方法用于检查一个数是否为素数,它不会给出一个确定的结果,但可以给出一个错误率非常小的概率。

时间复杂度O(klog3n),其中 k 是测试次数,n 是待检查的数。

  1. 选取大素数 p,gZp 是一个本原元。 pg 公开;
  2. 随机选取整数 x1xp2,计算 y=gxmodp
  3. 公钥为 y,私钥为 x

签名算法

对于消息 m,首先随机选取整数 k,(1kp2) ,然后计算

r=gkmodps=(h(m)xr)k1modp1

m 的签名为(r,s),其中 h 为 Hash 函数

验证算法

接收方在收到消息 m 和签名 (r,s) 后,验证

yrss=gh(m)modp

  • 如果等式成立,则(r,s)是消息m的有效签名; 反之,则是无效签名

ElGamal签名的正确性

s=(h(m)xr)k1modp1sk+xr=h(m)modp1gh(m)=g(sk+xr)=gskgxr=yrrsmodp

  • [!] 与ELGamal签名方案有关的两个问题
    • 用ElGamal方案计算一个签名时,使用的随机数k能不能泄露?
    • 在签名验证过程中,验证者会使用公钥 y=gxmodp来验证签名的有效性。如果 k 泄露,签名的安全性就会受到威胁。原因如下:
      • 泄露 k:如果 k 被泄露,攻击者可以直接计算出私钥 x。因为通过签名 (r,s) 可以得到:
      • s=(h(m)xr)k1modp1
      • 假设攻击者知道 k,那么可以通过求解这个方程来获取私钥 x,从而能够伪造有效的签名。因此,泄露 k 会导致私钥泄露,从而完全破坏签名的安全性
    • 若Bob用相同的k值来签名不同的两份消息,Oscar能否攻破这个体制?
  • 如果 Bob 使用相同的随机数 kkk 来签署不同的消息 m1​ 和 m2,则会导致一个严重的安全漏洞。具体来说:
    • 假设 Bob 对消息 m1m_1m1​ 和 m2m_2m2​ 的签名分别为 (r1,s1)(r2,s2),并且两者使用相同的随机数 k(即 r1=r2=r
    • 由于 r=gkmodp,所以对于两份消息的签名,可以得到以下两个方程:
      • s1=k1(H(m1)xr)mod(p1)
      • s2=k1(H(m2)xr)mod(p1)
    • 由于 k 相同,可以对这两个方程做差,得到:
      • s1s2=k1(H(m1)H(m2))mod(p1)
    • 如果攻击者获得了两个签名 (r1,s1)(r2,s2),他们可以计算出 k 的值:
      • k=H(m1)H(m2)s1s2mod(p1)
    • 由于 k 已经被计算出,攻击者就能够恢复出私钥 x,从而完全破解签名系统

安全性讨论

  • [?] 如果ElGamal数字签名体制没有采用Hash函数对消息预处理,那么可以用何种方法来伪造合法签名?
  1. 重复消息攻击(Replay Attack)
    • 在没有哈希的情况下,消息本身可能具有可预测或简单的模式。
    • 例如,如果攻击者能够获取一个有效的签名 (r,s) 并且消息 m 是一个简单的数值或有明显规律的字符串,那么攻击者可以在不改变签名的情况下重新发送相同的消息和签名,造成消息“伪造”的效果。
      • 这种攻击效果不显著,因为它只是“重放”有效签名,并没有真正伪造新的合法签名,但它可能引起一些实际应用中的问题,比如消息篡改或无意的重发。
  2. 消息选择攻击(Chosen Message Attack)[[密码学01-基本概念#密码学基本概念#选择明文攻击]]
    • 攻击者可以通过选择消息 mk来伪造合法签名。具体过程如下:
      • 假设攻击者已经获得了某个签名 (r,s) 对于消息 m
      • 假设攻击者想伪造另一个消息 m 的签名。
      • 给定 r=gkmodp,攻击者可以选择新的消息 m,然后构造新的签名部分 s:s=(mxr)k1modp1
      • 如果攻击者能够选择一个特定的 m′m'm′,他就可以计算出与之匹配的签名 (r,s)。由于消息没有经过哈希处理,消息空间是直接可操作的,攻击者只需要针对目标消息找到一个合适的 k 即可。这样就能够伪造一个合法的签名 (r,s)对应于新消息 m
  3. 同余攻击(Modular Arithmetic Attack)
    • 如果消息 m 没有经过哈希处理,攻击者可以通过以下方式构造多个消息,使得它们在某些模 p1 或其他值下相同:
      • 假设攻击者获得了签名 (r,s) 对于某个消息 m
      • 攻击者可以选择 m=m+k(p1)这样的消息,利用 ElGamal 签名中的计算公式,因为 mmmod(p1),即使 m是不同的消息,签名 (r,s) 也可能是合法的。

因此,使用 哈希函数 对消息进行预处理是为了防止消息结构的可预测性,从而增强签名系统的安全性。如果没有哈希处理,签名系统的安全性将显著降低,易受到各种攻击。

DSS签名算法

1991年,数字签名标准(DSS)在ElGamal数字签名和Schnorr数字签名的基础上发展而来,被美国国家标准局(NIST)确定为数字签名标准。

DSS签名算法

密钥生成

  1. 512L1024L 是64的倍数,选取2L1<p<2L大素数, 其满足存在160比特的素数 q|p1
  2. 随机选取整数h,1<h<p1且使 g=hp1/qmodp>1
    • q,pg 公开;
  3. 随机选取整数 x(私钥),1xq1,计算 y=gxmodp
  4. 公钥为 y,私钥为 x

签名算法

对于消息 m,首先随机选取一个整数 k, 1kp2 ,然后计算

r=gkmodpmodqs=(h(m)+xr)k1modq

m 的签名为 (r,s),其中 h 为Hash函数SHA

验证算法

接收方在收到消息 m 和签名 (r,s) 后,计算

u1=h(m)s1modqu2=rs1modq

验证等式 gu1yu2modpmodq=?r

  • 如果等式成立,则 (r,s) 是消息 m 的有效签名;
  • 反之,则是无效签名。

DSS签名的正确性

u1xu2modq=(h(m)+xr)s1modq=q(1)gu1yu2modpmodq=gu1+xu2modpmodq(2)=gkmodpmodq(3)=r

ElGamal类签名算法

基于离散对数问题的数字签名方案

  • [[密码学06-数字签名#ElGamal签名算法]]、[[密码学06-数字签名#DSS签名算法]]、Schnorr签名方案都是基于离散对数困难问题的签名方案。
  • 秘钥产生方式的共同点
  • 签名方式类似性

ELGamal类的签名算法

密钥生成

  1. pq 是大素数,且q|p1
  2. 随机选取 q 阶元 g1<g<p1qpg 公开;
  3. 随机选取整数 x,1xq1,计算y=gxmodp
  4. 公钥为 y,私钥为 x

签名算法

  • 对于消息 m,计算签名如下
    1. 计算 m 的Hash值 h(m)
    2. 随机选取一个整数 k,1kq
      • r=gkmodp
      • 从等式 ak=b+cxmodq 中计算出 s
  • 其中方程的系数 a,b,c 有多种选择,{a,b,c}={r,s,h(m)}m 的签名为 (r,s)
  • 对于消息m,首先随机选取整数k,1kp2 ,然后计算:
    • r=gkmodps=(h(m)xr)k1mod(p1),
  • m 的签名为(r,s),其中h为Hash函数

验证算法

  • 接收方在收到消息m和签名(r,s)后,验证
    • bgcyramodp
  • 如果同余式成立,则(r,s)是消息m的有效签名;反之,则是无效签名。
±r ±s h(m)
±rh(m) ±s 1
±rh(m) h(m)±s 1
±h(m)r ±rs 1
±h(m)s ±rs 1
  • [i] 表中 r=rmodp

一些基于离散对数问题的签名方案

签名方程 验证方程
rs+h(m)xmodq rrgsyh(m)modp
rkh(m)+sxmodq rrgh(m)ysmodp
skr+h(m)xmodq rsgryh(m)modp
skh(m)+rxmodq rsgh(m)yrmodp
mks+rxmodq rmgsyrmodp
mkr+sxmodq rmgrysmodp

特殊性质的签名算法

盲签名

定义

盲签名(Blind Signature)是一种特殊类型的数字签名技术,它使得签名者能够对一份消息进行签名,而不需要知道该消息的具体内容。简单来说,盲签名允许签名者“盲目”地签署一份文档或消息,签署者在签署过程中无法看到消息的实际内容。这种技术主要用于保护签名者的隐私,并在特定情况下增强系统的安全性。

  • 盲签名是在发送者A和签名者B之间的双方协议。其基本思想如下:
    • A发送给B一段信息,B对它签名并送回A。
    • 从这个签名,A 能够计算 B 关于A预先所选消息 m 的签名。
    • 协议完成时,B既不知道消息 m 也不知道消息的签名
  • 盲签名的目的是防止 B 看到消息和签名,从而使 B 以后不能将所签消息和发送者 A 联系起来

盲签名的基本步骤

假设有三个参与者:消息持有者(通常是请求签名的人)、签名者(通常是一个可信的实体或机构,如银行或认证机构)和验证者(验证签名的实体)。

1. 盲化(Blind)

  • 消息持有者首先将要签名的消息 mmm 盲化。通常,消息持有者会选择一个随机数 rrr(盲化因子),并通过以下方式修改消息:

m=mrmodN

其中 N 是用于加密签名的模数(在RSA中,通常是一个大数 N=pq)。

这样,消息 m 变成了一个与原始消息 m 不同的消息,但其含义仍然与原始消息保持一致,因为该盲化因子 r 会在签名后去除。

2. 签名(Signing)

  • 消息持有者将盲化后的消息 m 发送给签名者。
  • 签名者对 m 进行签名,得到签名 sss,但签名者并不知道该消息的实际内容。签名过程通常是通过签署 m 来完成,如:

s=(m)dmodN

其中 d 是签名者的私钥,N 是 RSA 或其他公钥加密系统中的模数。

3. 去盲(Unblinding)

  • 消息持有者收到签名 s 后,通过去除盲化因子 r 来恢复原始的签名。
  • 具体来说,消息持有者将签名 s 与盲化因子 r 进行处理,得到原始消息 m 的签名 s,公式如下:

s=sr1modN

其中 r1r 在模 N 下的乘法逆元。

最终,消息持有者得到了针对原始消息 m 的有效签名 s,签名可以用来验证消息。

4. 验证(Verification)

  • 验证者可以使用签名 s 和签名者的公钥 e 对签名进行验证。验证过程与传统的数字签名验证类似:

m=semodN

如果计算结果符合预期(即 mm=mrmodN 一致),则签名是有效的。

应用

  • 发送者 A(客户)不希望签名者B(银行)能够将一条先验消息 m 及其签名 SB(m) 与协议的特定实例相联系。
  • 这个特性在电子现金应用中可能很重要,因为那里的消息也许表示A 所花的金钱数额。
  • 当m和 SB(m) 提交给 B 进行支付时,B 无法推断原先接收签名的是谁。这就是允许 A 的匿名性,从而 A 的消费模式不能被监测

盲签组件

  • 盲签名协议需要下列组件:
    • 签名者B 的一种数字签名机制。用SB(x)记 B对 x 的签名。
    • 函数 fg(只有发送者知道),满足 g(SB(f(m)))=SB(m)。f叫做盲化函数,g 叫做去盲函数,f(m) 叫做盲消息

Chaum盲签名协议

Chaum盲签名协议

  • 发送者A接收B关于盲消息的签名。
  • A 计算 B 关于 A 预先所选消息 m 的签名, 0mn1。B既没有消息m 也没有 m 相关签名的知识。
    • B的RSA公钥和私钥分别是 (n,e)dk 是 A 随机选择的秘密数,满足 0kn1gcd(n,k)=1
  • 协议步骤:
    • (盲化) A计算 m=mkemodn, 将它发送给B 。
    • (签名) B计算 s=(m)dmodn, 将它发送给A。
    • (去盲) A计算 s=k1smodn, s就是B关于m的签名

Chaum盲签名的正确性

  • 显然 sm 的签名,即 s=mdmodn
  • B既没有消息m也没有m相关签名s的知识。

不可否认的数字签名

定义

  • 不可否认的数字签名由Chaum等在1989年提出。

不可否认签名(Non-repudiation Signature)指的是一种数字签名,它确保签名者不能否认或否定自己在某个时刻对某个消息的签署行为。简而言之,它为签名提供了法律效力,即签名者不能在后期声称自己没有签署该消息。这是电子商务、法律文档和通信中非常重要的属性。

关键特性

  1. 签名者不可否认性
    • 一旦一个签名被生成并且发送给接收者,签名者无法否认其生成该签名的事实。签名者不能声称消息没有经过他们的签署或篡改。
  2. 消息完整性
    • 签名不仅保证签名者身份,还保证消息的内容未被篡改。接收者可以验证签名来确认消息内容在签名后没有被改变。
  3. 签名的唯一性和真实性
    • 每个签名都是唯一的,与消息内容和签名者的私钥密切相关。任何试图伪造签名或篡改消息的行为都会导致验证失败
  • [!] 不可否认签名没有签名者的合作,接收者无法验证签名
  • [i] 不可否认性的算法依旧依赖数学困难问题实现

应用

  • 实体A(客户)希望访问被实体B(银行)控制的某个安全区域。
    • 比如该安全区域可能是存放保险箱的房间。在许可访问之前,B要求A签署一份时间和日期的文件。
    • 如果A采用了不可否认签名,那么在验证过程中没有A的直接参与,(在以后的日期)B就不能向任何人证明A使用过安全区域中的设施。
  • 假定某大公司A 制作了一个软件包。
    • A 对软件包签名并将它卖给实体B,而 B 决定将其拷贝再卖给第三方C,那么没有A的合作 C 就无法验证该软件是否正版。
    • 当然,这种措施并不能阻止B用它自己的签名重新签署软件包,但因此B也就无法利用与A名气相关的市场利益。而且追踪B的欺诈行为也将很容易。

组成

一个不可否认签名方案有三部分组成:

  • 签名算法
  • 验证协议
  • 否认协议

验证

  • 签名者可以声称一个签名是伪造的, 在这种情况下,如果签名者拒绝参加验证,就可认为签名者有欺骗行为。 如果签名者参加验证,由否认协议就可推断出签名的真伪。
  • 否认协议需要做到以下两点
    • B能使A相信一个不合法的签名是伪造的。
    • B以很小的概率使A相信一个合法签名是伪造的。

不足与改进

  • 不可否认签名的一个不足之处是签名者有可能不在场或者拒绝合作,而导致签名无法被接收者验证。
  • Chaum提出“指定验证者签名”的概念,其中签名者指定某实体作为签名的验证者。
    • 一旦签名者不在场或者拒绝合作,验证者就有权力与接收者交互来检查签名。
    • 验证者不能产生签名者的签名

群签名

定义

  • 1991年,Chaum等提出群签名方案。
  • 该方案允许群里的某个成员以群的名义匿名地签发消息。满足下述三个条件:
    • 只有群中的成员才能代表群进行签名;
    • 签名的接收者能验证签名是哪一个群的一个合法签名,但不能分辨具体的签名者。
    • 一旦出现争端,可借助群成员或一个可信的机构能识别出签名者。

群签名的应用

  • 一个公司有几台计算机,每台都联在局域网上。
  • 公司的每个部门有其自己的打印机(也连在局域网上),并且只有本部门的人员才能允许使用其部门的打印机。因此,打印前必须确认用户在哪个部门工作。
  • 同时公司为了保密,不可以暴露用户的身份。然而,如果有人滥用打印机,主管者必须能找出是谁在滥用打印机

组成

  • 一个群签名方案由以下几个部分组成:
    1. 建立(setup) 一个用以产生群公钥和私钥的多项式概率算法。
    2. 加入(join) 一个用户和群管理员之间的交互式协议。执行该协议可以使用户成为群成员,群管理员得到群成员的秘密的成员管理密钥,并产生群成员的私钥和成员证书
    3. 签名(sign) 一个概率算法,当输入一个消息、一个群成员的私钥和一个群公钥后,输出对该消息的签名。
    4. 验证(verify) 给定一个消息的签名和一个群公钥后,判断该签名相对于该群公钥是否有效。
    5. 打开(open) 给定一个签名、群公钥和群私钥的条件下确定签名者的身份。

代理签名

  • 一个代理签名方案由以下几个部分组成:
    • 系统建立
      • 选定代理签名方案的系统参数,用户的密钥等。
    • 签名权力的委托
      • 原始签名者将自己的签名权力委托给代理签名者。
    • 代理签名的产生
      • 代理签名者代表原始签名者产生代理签名。
    • 代理签名的验证
      • 验证人验证代理签名的有效性。

SM2数字签名算法

详见[[现代密码学:SM2数字签名算法.pdf]]

  1. SM2是中国国家密码管理局颁布的中国商用公钥密码标准算法,它是一组椭圆曲线密码算法,其中包含加解密算法、数字签名算法。
  2. 2004年,由中国科学院软件研究所张振峰研究员主持研制完成
  3. 2010年12月,首次公开发布
  4. 2012年3月,成为中国商用密码标准(GM/T 0003-2012)
  5. 2016年8月,成为中国国家密码标准(GB/T 32918-2016)
  6. 2017年11月3日,在第55次ISO/IEC联合技术委员会信息安全技术分委员会(SC27)德国柏林会议上,含有我国SM2与SM9数字签名算法的ISO/IEC14888-3/AMD1《带附录的数字签名第3部分:基于离散对数的机制-补篇1》 获得一致通过,成为ISO/IEC国际标准,进入标准发布阶段
  • [!] 符号、基本参数、种子和曲线的产生与SM2加密算法一致——[[密码学04-公钥密码#SM2公钥加密算法]]
posted @   seveN1foR  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示