一、 数字签名的意义
在[[(九)消息认证与杂凑函数]]中,讲到了消息认证码(MAC)。虽然MAC能保证消息的完整性和来源认证,但它==无法防止通信双方的内部欺骗==。
- MAC的局限性:因为MAC依赖收发双方共享的同一个密钥。接收方B可以轻易伪造一条消息,用共享密钥生成MAC,然后声称这是发送方A发来的;同时,A也可以对自己确实发过的消息死不认账,因为B也能生成同样的MAC。
- 数字签名的核心思想:为了实现“不可否认性”,必须将签名者与某个只有他自己知道的(秘密)私钥绑定在一起。任何拥有公钥的人都能验证签名,但除了拥有私钥的签名者,谁也无法产生合法的签名。
[!faq] 如何确定你是你?
数字签名必须满足的基本要求:
- 可验证:接收者必须能核实签名确实来自发送方。
- 不可伪造:除发送者外,任何人(包括接收者)无法伪造签名。
- 不可重用:针对不同消息的签名必须是不同的(防止重放攻击)。
- 不可抵赖:发送者事后无法否认自己签发的消息,第三方也可借此解决纠纷。
[!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签名的核心是基于离散对数问题构造一个特殊的同余方程:
- 参数准备:大素数
,生成元 。私钥为 ,公钥为 。 - 签名过程(产生由两部分组成的签名
): - 选择随机数
(要求与 互素)。 - 计算
。 - 利用方程
求解出(即 )。
- 选择随机数
- 验证过程: 接收者验证等式:
是否成立。
(证明: )。
2. DSA (数字签名标准)
DSA 是美国NIST公布的标准,它是 ElGamal 和 Schnorr 签名的结合改良版,仅能用于签名,不能直接用于加密。
参数设置:
: 大素数(长度介于 512 到 1024 位)。
: 的一个素因子(长度 160 位)。(注:引入是为了大幅缩小签名长度和运算量)。
: (的阶为 )。 (其中 是满足 且使得 的任一整数)
私钥: 。公钥 。签名过程(引入了极其重要的随机参数
): - 选择随机数
( )。 - 计算
。(这是DSA的精髓,做了两次模运算) - 计算
。 签名为。
- 选择随机数
验证过程与正确性证明:
- 计算辅助变量:
。 - 计算
, 以及 。 - 计算
。 - ==检查
是否等于 ==。
数学推导验证:因为 ,所以 ,代入指数得,再 恰好就是
- 计算辅助变量:
DSA 的安全保障: 签名过程中的随机数
绝对不能重用或泄露,一旦攻击者知道了 ,或者发现你对两份不同文件使用了相同的 ,就能利用简单的同余方程组直接反解出私钥 。
四、 椭圆曲线与国密标准:ECC 与 SM2 签名
椭圆曲线签名(ECDSA / SM2)将离散对数的求解域从普通的有限域搬到了椭圆曲线群上,使得极短的密钥就能提供极高的安全性。
1. 椭圆曲线签名的基本框架
- 参数:有限域
,基点 (阶为 )。公钥 。 - 签名:选随机数
,计算点 。令 。再通过 算出。
2. 国密 SM2 签名流程解析
[!NOTE] 参见[[(十)公钥密码#2. 椭圆曲线密码体制 (ECC) 与 国密 SM2]]
SM2 是我国的密码标准,它的签名流程比标准的 ECDSA 更为严密,深度绑定了用户身份标识与曲线参数。
预处理(杂凑值
的计算): SM2 不仅对消息求 Hash,它先将用户的身份ID、曲线参数 和用户的公钥紧密拼接,算出一个前缀 。 最终待签名的摘要 。签名核心流程:
- 产生随机数
。 - 计算椭圆曲线倍点:
。 - 计算
。(若 或 ,必须重新选)。 - 计算
。(为私钥。若 必须重选)。 最终输出签名为 。
- 产生随机数
验证过程与数学证明: 接收方收到
,先验证其在有效范围内,然后计算摘要 。 计算 。 通过椭圆曲线点加法验证:计算点 ($PAd_A \cdot G R x_1’$,检查 是否等于。
底层代数证明(为什么算出来的点就是加密时的 ?):
(代入和 公钥的定义) (合并同类项)_
因为签名时 ,即 。将其代入上式: 两点完全吻合,证毕!
五、 密码系统中的组合:加密与签名的顺序问题
在实际通信中,我们通常既要保密(加密),又要认证(签名)。这两者的先后顺序决定了不同的安全和业务效果:
外部保密方式(先签名,后加密):
$E{PK_B}[M || S{SKA}(M)]$
发送方先对明文算签名,然后将“明文+签名”打包在一起,用接收方的公钥进行总体加密。 优势_:便于解决纠纷。接收者用自己的私钥解密后,可以直接将“明文和原始签名”提取出来。如果日后发生抵赖,接收方可以把这份明文和签名原封不动地提交给第三方(如法官),任何有发送方公钥的人都能当场验证其真实性。内部保密方式(先加密,后签名):
$S{SK_A}[E{PKB}(M)]$
发送方先将消息用对方公钥加密,然后对“密文”进行签名。 劣势_:不利于解决争议。因为第三方拿到的只能是密文的签名,如果无法解开密文,第三方就无法确认原消息到底是什么内容,从而无法判断这笔交易或信息的实质合法性。
[!faq]- 作业
[!NOTE]- 参考答案:
aaa

