【密码学】(十一)数字签名

  • ~3.23K 字
  1. 1. 一、 数字签名的意义
  2. 2. 二、 基于大整数分解体系:RSA 数字签名技术
  3. 3. 三、 基于离散对数体系:DSA 与 ElGamal 签名
    1. 3.1. 1. ElGamal 签名算法
    2. 3.2. 2. DSA (数字签名标准)
  4. 4. 四、 椭圆曲线与国密标准:ECC 与 SM2 签名
    1. 4.1. 1. 椭圆曲线签名的基本框架
    2. 4.2. 2. 国密 SM2 签名流程解析
  5. 5. 五、 密码系统中的组合:加密与签名的顺序问题

一、 数字签名的意义

在[[(九)消息认证与杂凑函数]]中,讲到了消息认证码(MAC)。虽然MAC能保证消息的完整性和来源认证,但它==无法防止通信双方的内部欺骗==。

  • MAC的局限性:因为MAC依赖收发双方共享的同一个密钥。接收方B可以轻易伪造一条消息,用共享密钥生成MAC,然后声称这是发送方A发来的;同时,A也可以对自己确实发过的消息死不认账,因为B也能生成同样的MAC。
  • 数字签名的核心思想:为了实现“不可否认性”,必须将签名者与某个只有他自己知道的(秘密)私钥绑定在一起。任何拥有公钥的人都能验证签名,但除了拥有私钥的签名者,谁也无法产生合法的签名。

[!faq] 如何确定你是你?
数字签名必须满足的基本要求:

  1. 可验证:接收者必须能核实签名确实来自发送方。
  2. 不可伪造:除发送者外,任何人(包括接收者)无法伪造签名。
  3. 不可重用:针对不同消息的签名必须是不同的(防止重放攻击)。
  4. 不可抵赖:发送者事后无法否认自己签发的消息,第三方也可借此解决纠纷。

[!summary] 总结数字签名和消息认证:

  • MDC:这是不是原来的消息?——检测篡改
  • MAC:是不是我们自己人发的?——检测篡改+认证身份
  • 数字签名:是不是某个特定的人发的?——检测篡改+认证身份+不可否认身份
    1
    2
    3
    4
    5
    MDC
    ↓ 增加密钥
    MAC
    ↓ 公私钥替代共享密钥
    Digital Signature

[!example] 数字签名的例子
适合公开发布或者一对多的场景:
eg:微软发布软件/Linux发布镜像

(注:攻击者对签名的破译主要分为:完全破译(拿到私钥)、一致伪造(能伪造所有消息的签名)、选择性伪造和存在性伪造(哪怕只成功伪造出一条无意义消息的签名,也算攻击成功)。)

二、 基于大整数分解体系:RSA 数字签名技术

RSA不仅能用于加密([[(十)公钥密码#三、 基于大整数分解体系:RSA 算法]]),其算法原理也能完美倒置过来用于数字签名。

1. 签名与验证过程

  • 密钥生成:与RSA加密完全一致。计算 。选 互素,计算逆元 满足 公钥为 ,私钥为
  • 签名过程(用私钥):设消息为 (实际应用中必须是消息的Hash值),签名者用私钥 对其进行签名运算:
  • 验证过程(用公钥):接收方收到消息 和签名 后,用公钥 验证: 如果计算出的 等于收到的 ,则签名有效。

2. RSA签名的漏洞:存在性伪造 (Blind Forgery)

  • 攻击原理:因为加解密算法同用,攻击者可以先随便捏造一个签名 ,然后用公钥去“解密”它(计算 )。接着攻击者把这组 发出去,声称这是持有私钥的人对消息 的签名。验证者一算,确实吻合!
  • 防御解决方案绝对不对一段未知属性的数据直接用私钥签名! 实际应用中,签名之前必须先用单向Hash函数对消息进行处理,即对 进行签名。因为攻击者无法找到一个有意义的原文 使得它的Hash值恰好等于逆推出来的 ,从而彻底杜绝了这类伪造。

三、 基于离散对数体系:DSA 与 ElGamal 签名

1. ElGamal 签名算法

[!NOTE] 参见[[(十)公钥密码#1. ElGamal 算法(有限域乘法群上的对数)]]

ElGamal签名的核心是基于离散对数问题构造一个特殊的同余方程:

  • 参数准备:大素数 ,生成元 。私钥为 ,公钥为
  • 签名过程(产生由两部分组成的签名 ):
    1. 选择随机数 (要求 互素)。
    2. 计算
    3. 利用方程 求解出 (即 )。
  • 验证过程: 接收者验证等式: 是否成立。
    (证明: )

2. DSA (数字签名标准)

DSA 是美国NIST公布的标准,它是 ElGamal 和 Schnorr 签名的结合改良版,仅能用于签名,不能直接用于加密。

  • 参数设置
    : 大素数(长度介于 512 到 1024 位)。
    : 的一个素因子(长度 160 位)。(注:引入 是为了大幅缩小签名长度和运算量)
    : 的阶为 )。 (其中是满足 且使得 的任一整数)
    私钥 : 。公钥

  • 签名过程(引入了极其重要的随机参数 ):

    1. 选择随机数 ( )。
    2. 计算 (这是DSA的精髓,做了两次模运算)
    3. 计算 。 签名为
  • 验证过程正确性证明

    1. 计算辅助变量:
    2. 计算 , 以及
    3. 计算
    4. ==检查 是否等于 ==
      数学推导验证:因为 ,所以 ,代入指数得 ,再 恰好就是
  • DSA 的安全保障: 签名过程中的随机数 绝对不能重用或泄露,一旦攻击者知道了 ,或者发现你对两份不同文件使用了相同的 ,就能利用简单的同余方程组直接反解出私钥

四、 椭圆曲线与国密标准:ECC 与 SM2 签名

椭圆曲线签名(ECDSA / SM2)将离散对数的求解域从普通的有限域搬到了椭圆曲线群上,使得极短的密钥就能提供极高的安全性。

1. 椭圆曲线签名的基本框架

  • 参数:有限域 ,基点 (阶为 )。公钥
  • 签名:选随机数 ,计算点 。令 。再通过 算出

2. 国密 SM2 签名流程解析

[!NOTE] 参见[[(十)公钥密码#2. 椭圆曲线密码体制 (ECC) 与 国密 SM2]]

SM2 是我国的密码标准,它的签名流程比标准的 ECDSA 更为严密,深度绑定了用户身份标识与曲线参数

  • 预处理(杂凑值 的计算): SM2 不仅对消息求 Hash,它先将用户的身份ID、曲线参数 和用户的公钥紧密拼接,算出一个前缀 。 最终待签名的摘要

  • 签名核心流程

    1. 产生随机数
    2. 计算椭圆曲线倍点:
    3. 计算 。(若 ,必须重新选 )。
    4. 计算 。( 为私钥。若 必须重选 )。 最终输出签名为
  • 验证过程与数学证明: 接收方收到 ,先验证其在有效范围内,然后计算摘要 。 计算 。 通过椭圆曲线点加法验证:计算点 ($PAd_A \cdot GRx_1’$,检查 是否等于
    底层代数证明(为什么算出来的点 就是加密时的 ?)
    (代入 和 公钥的定义) (合并同类项)_
    因为签名时 ,即 。将其代入上式: 两点完全吻合,证毕!

五、 密码系统中的组合:加密与签名的顺序问题

在实际通信中,我们通常既要保密(加密),又要认证(签名)。这两者的先后顺序决定了不同的安全和业务效果:

  1. 外部保密方式(先签名,后加密)
    $E{PK_B}[M || S{SKA}(M)]$
    发送方先对明文算签名,然后将“明文+签名”打包在一起,用接收方的公钥进行总体加密。
    优势_:便于解决纠纷。接收者用自己的私钥解密后,可以直接将“明文和原始签名”提取出来。如果日后发生抵赖,接收方可以把这份明文和签名原封不动地提交给第三方(如法官),任何有发送方公钥的人都能当场验证其真实性。

  2. 内部保密方式(先加密,后签名)
    $S{SK_A}[E{PKB}(M)]$
    发送方先将消息用对方公钥加密,然后对“密文”进行签名。
    劣势_:不利于解决争议。因为第三方拿到的只能是密文的签名,如果无法解开密文,第三方就无法确认原消息到底是什么内容,从而无法判断这笔交易或信息的实质合法性。

[!faq]- 作业

[!NOTE]- 参考答案:
aaa