文章目录
- 数字签名简介
- RSA签名
-
- ["教科书式 RSA" 签名方案及其不安全性](#"教科书式 RSA" 签名方案及其不安全性)
-
- ["教科书式 RSA" 签名方案(重点)](#"教科书式 RSA" 签名方案(重点))
- ["教科书式 RSA" 签名方案的不安全性(重点)](#"教科书式 RSA" 签名方案的不安全性(重点))
- 先哈希再签名的解决范式(重点)
数字签名简介
- 为保证信息的完整性,在公钥情况下与消息鉴别码相对应的是数字签名。
- 数字签名方案允许持有公钥 p k pk pk的签名者S对消息进行签名,任何知晓 p k pk pk(且知道该公钥由S确立)的实体均可验证消息是否源自 S S S且未被篡改。
- 典型示例:某软件公司希望以可认证方式分发软件补丁,确保所有用户能识别补丁真实性,防止第三方伪造。为实现此目标,公司生成公钥 p k pk pk和私钥 s k sk sk,通过可信渠道分发 p k pk pk给客户,同时保密 s k sk sk(假设初始公钥分发已正确完成,所有客户持有有效 p k pk pk副本)。当发布补丁 m m m时,公司用 s k sk sk计算 m m m的数字签名 σ σ σ,将 ( m , σ ) (m,σ) (m,σ)发送给所有客户。每个客户利用 p k pk pk验证 σ σ σ是否为 m m m的有效签名,从而核实 m m m的真实性。由于所有用户使用同一公钥 p k pk pk,公司只需计算一次签名并发送给所有用户。
- 与消息鉴别码相比,两者均保障消息完整性(或真实性)。在公钥私钥加密环境中,消息完整性同样适用。当发送者需与多个接收者通信时,数字签名优于消息鉴别码,可简化密钥管理。使用数字签名时,发送者无需为每个潜在接收者分配不同秘密密钥,避免为每个密钥计算MAC标签,只需计算一个签名即可被所有接收者验证。
- 数字签名相比消息鉴别码的定性优势是可公开验证:若一个接收者验证某消息签名合法,其他接收此签名消息的接收者也能验证合法。而消息鉴别码无此特性,因签名者与每个接收者共享单独密钥,恶意发送者可为接收方 A A A计算正确 M A C MAC MAC标签,但为 B B B计算错误标签,导致A确认真实消息,却无法保证 B B B也如此。
- 数字签名具有:不可抵赖性。首先假定签名者S广泛公布自已的公钥,一旦 S S S对一个消息进行签名,则以后都不能对此否认。
数字签名的定义(重点)
定义12.1 数字签名方案由概率多项式时间算法组成的三元组 ( Gen , Sign , Vrfy ) (\text{Gen}, \text{Sign}, \text{Vrfy}) (Gen,Sign,Vrfy),满足以下条件:
-
密钥生成算法 Gen \text{Gen} Gen:
- 输入:安全参数 1 n 1^n 1n
- 输出:一对密钥 ( p k , s k ) (pk, sk) (pk,sk),分别称为公钥和私钥
- 假设 p k pk pk 和 s k sk sk 长度至少为 n n n,且 n n n 可以由 p k pk pk 和 s k sk sk 确定
-
签名算法 Sign \text{Sign} Sign:
- 输入:私钥 s k sk sk 和消息 m ∈ { 0 , 1 } ∗ m \in \{0,1\}^* m∈{0,1}∗
- 输出:签名 σ \sigma σ,表示为 σ ← Sign s k ( m ) \sigma \leftarrow \text{Sign}_{sk}(m) σ←Signsk(m)
-
验证算法 Vrfy \text{Vrfy} Vrfy:
- 输入:公钥 p k pk pk、消息 m m m 和签名 σ \sigma σ
- 输出:一位 b b b,当 b = 1 b=1 b=1 时表示签名有效, b = 0 b=0 b=0 时表示签名无效
- 表示为 b : = Vrfy p k ( m , σ ) b := \text{Vrfy}_{pk}(m, \sigma) b:=Vrfypk(m,σ)
此方案需要对于任意 n n n,所有由 Gen ( 1 n ) \text{Gen}(1^n) Gen(1n) 输出的 ( p k , s k ) (pk, sk) (pk,sk),以及任意 m ∈ { 0 , 1 } ∗ m \in \{0,1\}^* m∈{0,1}∗,必须满足:
Vrfy p k ( m , Sign p k ( m ) ) = 1 \text{Vrfy}{pk}(m, \text{Sign}{pk}(m)) = 1 Vrfypk(m,Signpk(m))=1
如果 ( Gen , Sign , Vrfy ) (\text{Gen}, \text{Sign}, \text{Vrfy}) (Gen,Sign,Vrfy) 对于所有由 Gen ( 1 n ) \text{Gen}(1^n) Gen(1n) 输出的 ( p k , s k ) (pk, sk) (pk,sk),算法 Sign s k \text{Sign}{sk} Signsk 只对消息 m ∈ { 0 , 1 } l ( n ) m \in \{0,1\}^{l(n)} m∈{0,1}l(n) 有定义(并且 Vrfy p k \text{Vrfy}{pk} Vrfypk 对于任意 m ∉ { 0 , 1 } l ( n ) m \notin \{0,1\}^{l(n)} m∈/{0,1}l(n) 输出都为 0),此时称 ( Gen , Sign , Vrfy ) (\text{Gen}, \text{Sign}, \text{Vrfy}) (Gen,Sign,Vrfy) 是一个消息长度为 l ( n ) l(n) l(n) 的数字签名方案。
数字签名的安全性(重点)
- 给定一个由签名者 S S S生成的公钥 p k pk pk,如果敌手输出一个消息 m m m和有效签名 σ \sigma σ,并且先前 S S S并没有给 m m m签名,称敌手输出一个"伪造"签名。数字签名的安全性意味着,即使敌手允许得到很多自己选择消息的签名,也不能输出一个伪造的签名。
数字签名方案的安全性定义
数字签名实验 Sig-forge A , Π ( n ) \text{Sig-forge}_{\mathcal{A},\Pi}(n) Sig-forgeA,Π(n):
设 Π = ( Gen , Sign , Vrfy ) \Pi = (\text{Gen}, \text{Sign}, \text{Vrfy}) Π=(Gen,Sign,Vrfy) 是一个数字签名方案,对于敌手 A \mathcal{A} A 和参数 n n n:
- 运行 Gen ( 1 n ) \text{Gen}(1^n) Gen(1n) 得到密钥 ( p k , s k ) (pk, sk) (pk,sk)。
- 将 p k pk pk 和访问"签名预言机" Sign ( ⋅ ) \text{Sign}(\cdot) Sign(⋅) 的权利给敌手 A \mathcal{A} A。(敌手选定的任意消息 m m m 返回一个签名 Sign s k ( m ) \text{Sign}_{sk}(m) Signsk(m)。)然后敌手输出 ( m , σ ) (m, \sigma) (m,σ)。设 Q \mathcal{Q} Q 表示 A \mathcal{A} A 在执行期间询问签名的消息的集合。
- 当且仅当 Vrfy p k ( m , σ ) = 1 \text{Vrfy}_{pk}(m, \sigma) = 1 Vrfypk(m,σ)=1 且 m ∉ Q m \notin \mathcal{Q} m∈/Q 时,实验输出定义为 1。
定义 12.2
一个签名方案 Π = ( Gen , Sign , Vrfy ) \Pi = (\text{Gen}, \text{Sign}, \text{Vrfy}) Π=(Gen,Sign,Vrfy) 如果对任意概率多项式时间敌手 A \mathcal{A} A 存在一个可忽略函数 negl \text{negl} negl,满足
Pr [ Sig-forge A , Π ( n ) = 1 ] ⩽ negl ( n ) \Pr[\text{Sig-forge}_{\mathcal{A},\Pi}(n) = 1] \leqslant \text{negl}(n) Pr[Sig-forgeA,Π(n)=1]⩽negl(n)
则此签名方案在适应性选择消息攻击下是存在性不可伪造的。
RSA签名
"教科书式 RSA" 签名方案及其不安全性
"教科书式 RSA" 签名方案(重点)
-
"教科书式 RSA"签名是不安全的。
-
设 GenRSA 是一个 PPT 算法,输入为 1 n 1^n 1n,输出为一个模 N N N,其为两个 n n n 位素数的乘积(例外的概率是可忽略的),以及两个满足 e d = 1 m o d ϕ ( N ) ed = 1 \mod \phi(N) ed=1modϕ(N) 的整数 e e e, d d d。
-
"教科书式 RSA"方案简单的运行 GenRSA 而产生密钥,输出 ⟨ N , e ⟩ \langle N, e \rangle ⟨N,e⟩ 作为公钥,输出 ⟨ N , d ⟩ \langle N, d \rangle ⟨N,d⟩ 作为私钥。为签名消息 m ∈ Z N ∗ m \in \mathbb{Z}_N^* m∈ZN∗,签名者计算 σ : = [ m d m o d N ] \sigma := [m^d \mod N] σ:=[mdmodN]。为验证 m m m 在公钥 ⟨ N , e ⟩ \langle N, e \rangle ⟨N,e⟩ 下的签名 σ \sigma σ,检查是否有 m = ? σ e m o d N m \stackrel{?}{=} \sigma^e \mod N m=?σemodN。参考构造方案 12.3。
构造方案 12.3 ("教科书式 RSA"签名方案)
设 GenRSA 如前所述,数字签名方案:
- Gen :输入 1 n 1^n 1n,运行 Gen ( 1 n ) \text{Gen}(1^n) Gen(1n) 得到 ⟨ N , e , d ⟩ \langle N, e, d \rangle ⟨N,e,d⟩。其中,公钥为 ⟨ N , e ⟩ \langle N, e \rangle ⟨N,e⟩,私钥为 ⟨ N , d ⟩ \langle N, d \rangle ⟨N,d⟩。
- Sign :输入私钥 s k = ⟨ N , d ⟩ sk = \langle N, d \rangle sk=⟨N,d⟩ 和消息 m ∈ Z N ∗ m \in \mathbb{Z}_N^* m∈ZN∗,计算签名 σ : = [ m d m o d N ] \sigma := [m^d \mod N] σ:=[mdmodN]。
- Vrfy :输入公钥 p k = ⟨ N , e ⟩ pk = \langle N, e \rangle pk=⟨N,e⟩,消息 m ∈ Z N ∗ m \in \mathbb{Z}_N^* m∈ZN∗,和签名 σ ∈ Z N ∗ \sigma \in \mathbb{Z}_N^* σ∈ZN∗。当且仅当 m = ? [ σ e m o d N ] m \stackrel{?}{=} [\sigma^e \mod N] m=?[σemodN] 时输出为 1。
很容易发现验证生成签名的合法总是可以成功的,这是因为
σ e = ( m d ) e = m [ e d m o d ϕ ( N ) ] = m 1 = m m o d N \sigma^e = (m^d)^e = m^{[ed \mod \phi(N)]} = m^1 = m \mod N σe=(md)e=m[edmodϕ(N)]=m1=mmodN
然而,教科书式 RSA 签名方案是不安全的。
"教科书式 RSA" 签名方案的不安全性(重点)
- 无消息攻击:即使没有得到任何合法签名者的任何签名,只要基于公钥,就可以伪造"教科书式RSA"签名方案的签名。
- 对任意消息伪造签名: 敌手通过获取两条同一签名者的有效签名( σ 1 \sigma_1 σ1、 σ 2 \sigma_2 σ2),构造伪造签名。具体步骤为:选择随机消息 m 1 ∈ Z N ∗ m_1 \in \mathbb{Z}_N^* m1∈ZN∗,计算 m 2 : = [ m / m 1 m o d N ] m_2 := [m/m_1 \mod N] m2:=[m/m1modN],获取 m 1 m_1 m1 和 m 2 m_2 m2 的签名 σ 1 \sigma_1 σ1、 σ 2 \sigma_2 σ2,声明 σ : = [ σ 1 ⋅ σ 2 m o d N ] \sigma := [\sigma_1 \cdot \sigma_2 \mod N] σ:=[σ1⋅σ2modN] 为目标消息 m m m 的有效签名。验证时, σ e = ( m 1 d ⋅ m 2 d ) e = m 1 m 2 = m m o d N \sigma^e = (m_1^d \cdot m_2^d)^e = m_1 m_2 = m \mod N σe=(m1d⋅m2d)e=m1m2=mmodN,因 m ≠ m 1 m \neq m_1 m=m1 且 m ≠ m 2 m \neq m_2 m=m2(概率可忽略),故构成伪造。该攻击可一般化:若敌手获得 q q q 个消息的有效签名,可通过选择 M M M 子集的乘积伪造 2 q − q − 1 2^q - q - 1 2q−q−1 个消息。
先哈希再签名的解决范式(重点)
构造方案 12.4
设 Π = ( Gen , Sign , Vrfy ) \Pi = (\text{Gen}, \text{Sign}, \text{Vrfy}) Π=(Gen,Sign,Vrfy) 与 Π H = ( Gen H , H ) \Pi_H = (\text{Gen}_H, H) ΠH=(GenH,H) 为前面文中介绍的方案。构造一个对任意长度消息的签名方案 Π ′ \Pi' Π′:
- Gen' :输入 1 n 1^n 1n,运行 Gen S ( 1 n ) \text{Gen}_S(1^n) GenS(1n) 得到 ( p k , s k ) (pk, sk) (pk,sk),并且运行 Gen H ( 1 n ) \text{Gen}_H(1^n) GenH(1n) 得到 s s s。其中,公钥为 p k ′ = ⟨ p k , s ⟩ pk' = \langle pk, s \rangle pk′=⟨pk,s⟩,私钥为 s k ′ = ⟨ s k , s ⟩ sk' = \langle sk, s \rangle sk′=⟨sk,s⟩。
- Sign' :输入私钥 ⟨ s k , s ⟩ \langle sk, s \rangle ⟨sk,s⟩ 和消息 m ∈ { 0 , 1 } ∗ m \in \{0,1\}^* m∈{0,1}∗,计算 σ ′ ← Sign s k ( H s ( m ) ) \sigma' \leftarrow \text{Sign}_{sk}(H^s(m)) σ′←Signsk(Hs(m))。
- Vrfy' :输入公钥 ⟨ p k , s ⟩ \langle pk, s \rangle ⟨pk,s⟩,消息 m ∈ { 0 , 1 } ∗ m \in \{0,1\}^* m∈{0,1}∗ 和一个签名 σ \sigma σ,当且仅当 Vrfy p k ( H s ( m ) , σ ) = 1 \text{Vrfy}_{pk}(H^s(m), \sigma) = 1 Vrfypk(Hs(m),σ)=1 时输出 1。
定理 12.5
如果 Π \Pi Π 在适应性选择消息攻击下是存在性不可伪造的,且 Π H \Pi_H ΠH 是抗碰撞的,则构造方案 12.4 在适应性选择消息攻击下是存在性不可伪造的。