-
本节学习公钥密码学中用于保护信息完整性和真实性的数字签名。
-
目录:数字签名定义、RSA签名、来自离散对数问题的数字签名、一次签名方案、证书与公钥基础设施。
-
数字签名概览
- 数字签名(Digital signature)是一个数学方案用来证明一个数字消息的真实性/完整性。
- 数字签名允许一个签名者(Signer)$S$ 用其自己的私钥来“签名”(sign)一个消息,并且任何知道
$S$ 的公钥的人可以验证(verify)其真实性/完整性。 - 与MAC相比,数字签名是:
- 公开可验证的(publicily verifiable);
- 可转移的(transferable);
- 不可抵赖(non-repudiation);
- 但速度慢。
- 问题:数字签名和手写签名的却别是什么?
- 数字签名不是公钥加密的逆。
-
数字签名方案词法
- 签名
$\sigma$ , 比特$b$ 表示有效($\mathsf{valid}$ )如果$b=1$ ; 无效($\mathsf{invalid}$)如果$b=0$ 。 - 密钥生成算法(Key-generation):$(pk,sk) \gets \mathsf{Gen}(1^n), |pk|,|sk| \ge n$。
- 签名(Signing)算法:$\sigma \gets \mathsf{Sign}_{sk}(m)$。
- 验证(Verification)算法:$b:= \mathsf{Vrfy}_{pk}(m,\sigma)$。
- 基本正确性要求: $\mathsf{Vrfy}{pk}(m,\mathsf{Sign}{sk}(m)) = 1$。
- 签名
-
定义签名安全
- 安全数字签名定义与安全MAC类似,敌手难以伪造一个“新消息”的签名。
- 签名实验
$\mathsf{Sigforge}_{\mathcal{A},\Pi }(n)$ :- 挑战者生成密钥对
$(pk,sk) \gets \mathsf{Gen}(1^n)$ 。 - 敌手
$\mathcal{A}$ 给予输入$1^n$ 以及对签名预言机的访问$\mathsf{Sign}_{sk}(\cdot)$ ,然后输出$(m,\sigma)$ 。$\mathcal{Q}$ 是对预言机的查询的集合。 - 实验成功 $\mathsf{Sigforge}{\mathcal{A},\Pi }(n)=1 \iff$ $\mathsf{Vrfy}{pk}(m,\sigma)=1$
$\land$ $m \notin \mathcal{Q}$ .
- 挑战者生成密钥对
- 一个签名方案
$\Pi$ 是在适应性选择消息攻击下的存在性不可伪造(existentially unforgeable under an adaptive CMA),如果$\forall$ PPT$\mathcal{A}$ ,$\exists$ $\mathsf{negl}$ 使得: $ \Pr [\mathsf{Sigforge}_{\mathcal{A},\Pi }(n)=1] \le \mathsf{negl}(n).$ - 问题:在MAC和数字签名中敌手能力的差别是什么?如果敌手不限制算力为PPT会如何?
-
“书本上RSA”的不安全性
- 构造:
-
$\mathsf{Gen}$ : on input$1^n$ run$\mathsf{GenRSA}(1^n)$ to obtain$N,e,d$ .$pk = \langle N,e \rangle$ and$sk = \langle N,d \rangle$ . -
$\mathsf{Sign}$ : on input$sk$ and$m \in \mathbb{Z}^*_N$ ,$\sigma:= [m^d \bmod N]$ . -
$\mathsf{Vrfy}$ : on input$pk$ and$m \in \mathbb{Z}^*_N$ ,$m \overset{?}{=} [\sigma^e \bmod N]$ .
-
- 无消息攻击(no-message attack):
- 选择一个任意
$\sigma \in \mathbb{Z}^*_N$ 并且计算$m := [\sigma^e \bmod N]$ 。输出伪造签名$(m,\sigma)$ 。 - 例子:$pk = \left<15, 3\right>,\ \sigma = 2,\ m = ?\ m^{d} = ?$
- 选择一个任意
- 任意消息攻击(Forging a signature on an arbitrary message):为了伪造
$m$ 的签名,选择一个随机的$m_1$ ,令$m_2 := [m/m_1 \bmod N]$ ,查询预言机获得消息$m_1, m_2$ 的签名$\sigma_1, \sigma_2$ 。- 问题:$\sigma := [\underline{\qquad} \bmod N]$ 是
$m$ 的一个有效签名。
- 问题:$\sigma := [\underline{\qquad} \bmod N]$ 是
- 构造:
-
哈希(Hashed)RSA签名
- 思路:用哈希函数来打破消息和签名之间的的强代数关系
- RSA-FDH 签名方案:随机预言机作为一个全域哈希(Full Domain Hash,FDH)),其定义域大小为 RSA 的模数
$N-1$ 。(PKCS #1 v2.1) - 目前实际使用哈希RSA数字签名方案:
-
$\mathsf{Gen}$ : 一个哈希函数$H : {0,1}^* \to \mathbb{Z}_N^*$ 作为公钥的一部分。 -
$\mathsf{Sign}$ :$\sigma := [H(m)^d \bmod N]$ . -
$\mathsf{Vrfy}$ :$\sigma^e \overset{?}{=} H(m) \bmod N$ .
-
- 如果
$H$ 无法有效求逆,那么无消息攻击和伪造任意消息的签名都是难的。 - 无消息攻击:敌手无法求逆
- 任意消息攻击:$\sigma_2$ 与$\sigma$没有关系
- 不安全性:没有已知函数
$H$ 使得哈希RSA签名是安全的。
-
Schnorr签名概览
- Schnorr签名展现了签名,身份识别和零知识证明之间的联系
- 该方案是Schnorr身份识别协议的非交互版本,而后者是一个对离散对数问题的解的交互式零知识证明
- 安全:在ROM下和离散对数难题假设下,将Fiat-Shamir变换应用于Schnorr身份识别协议
- 应用于多重签名,门限签名和盲签名,这些技术被广泛应用于密码学货币
-
Schnorr身份认证方案
- 证明者公开地证明其知道一个离散对数问题的解,通过一个三轮的西格玛协议
- 证明者持有一个离散对数问题$g^x = y$的私钥部分$x$,生成$k \gets \mathbb{Z}_q$;
$I := g^k$ ,并将$I$发送给验证者。- 注:这个$k$就是 $\mathsf{st}$, 后面用来隐藏私钥$x$;
- 验证者生成
$r \gets \mathbb{Z}_q$ ,并将$r$发送给证明者。- 注:随机的$r$不能被预测,并且在$I$之后产生;
- 证明者生成
$s := [rx + k \mod q]$ ,并将$s$发送给证明者。- 注:用$x$生成应答,并用$k$隐藏$x$;
- 验证者验证$\mathcal{V}(pk, r, s) = g^s \cdot y^{-r} \overset{?}{=} I$。注:$g^s \cdot y^{-r} = g^{rx+k} g^{-rx} = g^k$
- 证明者持有一个离散对数问题$g^x = y$的私钥部分$x$,生成$k \gets \mathbb{Z}_q$;
- 问题:为什么一个更简单的协议不安全?
- 证明者公开地证明其知道一个离散对数问题的解,通过一个三轮的西格玛协议
-
Schnorr身份认证方案证明
- 定理:如果离散对数是难的,那么Schnorr身份认证方案是安全的。
- 思路:如果攻击身份认证方案的敌手可以成功使得
$g^s \cdot y^{-r} = I$ ,那么离散对数问题可以被解决。 - 证明:将求$y$的逆的算法
$\mathcal{A}'$ 规约到攻击Schnorr方案的$\mathcal{A}$:-
$\mathcal{A}'$ 作为验证者并运行$\mathcal{A}$ 作为证明者,$\mathcal{A}'$回答$\mathcal{A}$的查询。 - 当
$\mathcal{A}$ 输出$I$ ,$\mathcal{A}'$ 选择$r_1 \in \mathbb{Z}_q$ 并且发送给$\mathcal{A}$ ,后者以$s_1$ 应答。 - 再一次运行
$\mathcal{A}$ ,将$r_2 \in \mathbb{Z}_q$ 发送给$\mathcal{A}$ ,后者其应答$s_2$ 。 - 如果
$g^{s_1} \cdot h^{-r_1} = I$ 并且$g^{s_2} \cdot h^{-r_2} = I$ 并且$r_1 \neq r_2$ 那么输出$x = [ (s_1 - s_2)\cdot (r_1 - r_2)^{-1} \mod q]$ ,否则输出空。
-
-
Schnorr签名方案
- 根据Fiat-shamir变换,可以用Schnorr身份认证方案来构造数字签名方案,签名者自己运行身份识别协议
-
$\mathsf{Gen}$ :$(\mathcal{G}, q, g) \gets \mathcal{G}(1^n)$ 。选择$x \in \mathbb{Z}_q$ 并且令$y := g^x$ 。私钥为$x$ 而公钥为$(\mathcal{G}, q, g, y)$ 。一个函数$H : {0,1}^* \to \mathbb{Z}_q$ 。 -
$\mathsf{Sign}$ : 输入$x$ 和$m \in {0,1}^*$ ,执行以下操作- 计算
$I := g^k$ , 其中一个均匀的$k \in \mathbb{Z}_q$ ; - 计算
$r := H(I, m)$ ; - 计算
$s := [ rx + k \mod q]$ ; - 输出签名
$(r, s)$ 。
- 计算
-
$\mathsf{Vrfy}$ : 计算$I := g^s \cdot y^{-r}$ 并且输出$1 \iff H(I, m) \overset{?}{=} r$ 。
-
- 根据Fiat-shamir变换,可以用Schnorr身份认证方案来构造数字签名方案,签名者自己运行身份识别协议
-
DSS/DSA(数字签名标准/算法)
- NIST从1994年到2013年颁布的数字签名标准(Digital Signature Standard,DSS) 使用数字签名算法(Digital Signature Algorithm,DSA),该算法是一个ElGamal签名方案的变体。DSS中还包括椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm,ECDSA)和 RSA签名算法。
- 这两种算法基于相同的算法抽象:基于身份认证方案的签名方案。
- 构造:
-
$\mathsf{Gen}$ :$(\mathbb{G},q,g) \gets \mathcal{G}$ . 两个哈希函数$H, F : {0,1}^* \to \mathbb{Z}_q$ . -
$x \gets \mathbb{Z}_q$ 和$y:= g^x $ . -
$pk = \langle \mathbb{G},q,g,y,H,F\rangle$ .$sk=\langle \mathbb{G},q,g,x,H,F\rangle$ . -
$\mathsf{Sign}$ :$k\gets \mathbb{Z}^*_q$ 并且$r:= F(g^k) $ ,$s:= (H(m)+xr)\cdot k^{-1}$ . 输出$(r,s)$ . -
$\mathsf{Vrfy}$ : 输出$1 \iff r \overset{?}{=} F(g^{H(m)\cdot s^{-1}}y^{r\cdot s^{-1}}).$
-
- DSA中验证的正确性?
-
DSS/DSA安全性
- 不安全性:DSS的安全性依赖于离散对数问题的难解性,尚未有基于离散对数假设的DSS安全性证明。
-
$k$ 的熵、保密和唯一性是安全性的关键。 - 情况1:如果$k$是可预测的,那么$x$将泄漏,因为$s:= (H(m)+xr)\cdot k^{-1}$中只有$x$是未知的。
- 情况2:如果同一个$k$被用于同一私钥下的两个不同签名,那么$k$和$x$都将泄漏。问题:如何做?
- 该攻击曾在2010年用于对Sony PlayStation (PS3) 提取私钥。
-
一次签名(OTS)
-
下面学习不基于数论假设,而是基于哈希函数来构造安全的数字签名方案。
-
一次签名(One-Time Signature,OTS): 在一种较弱的攻击场景下,一个秘密只用于一个消息签名。
-
模拟一次签名场景,敌手最多只允许查询一次签名预言机,之后需要给出新消息和签名。
-
OTS实验
$\mathsf{Sigforge}_{\mathcal{A},\Pi }^{\text{1-time}}(n)$ :-
$(pk,sk) \gets \mathsf{Gen}(1^n)$ . -
$\mathcal{A}$ 输入$1^n$ 和对$\mathsf{Sign}_{sk}(\cdot)$ 的一次查询$m'$ ,并且输出$(m,\sigma)$ ,$m \neq m'$ 。 - $\mathsf{Sigforge}{\mathcal{A},\Pi }^{\text{1-time}}(n)=1 \iff \mathsf{Vrfy}{pk}(m,\sigma)=1$.
-
-
一个签名方案
$\Pi$ 在单个消息攻击下是存在性不可伪造的,如果$\forall$ PPT$\mathcal{A}$ ,$\exists$$\mathsf{negl}$ 使得:$ \Pr [\mathsf{Sigforge}_{\mathcal{A},\Pi }^{\text{1-time}}(n)=1] \le \mathsf{negl}(n).$
-
-
Lamport的OTS (1979)
- 思路:从单向函数构造OTS;每个比特为一个映射 。
- 构造:
-
$f$ 是一个OWF。抗碰撞哈希函数也是属于OWF。 -
$\mathsf{Gen}$ : 输入$1^n$ ,对于$i \in {1,\dotsc, \ell}$ :- 选择随机的两个函数输入
$x_{i,0}, x_{i,1} \gets {0,1}^n$ ; - 计算
$y_{i,0} := f(x_{i,0})$ 和$y_{i,1} := f(x_{i,1})$ 。 - 构成2个2xn的矩阵,$x_{i,j}$构成的矩阵是私钥,$y_{i,j}$构成的矩阵是公钥。
- 选择随机的两个函数输入
-
$\mathsf{Sign}$ :$m = m_1\cdots m_{\ell}$ , 输出$\sigma = (x_{1,m_1},\dotsc,x_{\ell,m_{\ell}})$ 。根据消息中每个比特的值(0或1)来选择$x_{i,j}$,得到的一个向量为签名。 -
$\mathsf{Vrfy}$ :$\sigma = (x_1,\dotsc,x_{\ell})$ ,输出$1 \iff$ 对于所有$i$ ,$f(x_i) = y_{i,m_i}$。对消息的每个比特
-
- 定理:如果
$f$ 是 OWF,$\Pi$ 是长度为$\ell$ 的消息的OTS。
-
Lamport的OTS例子
- 略
-
Lamport的OTS安全性证明
- 思路:如果
$m \neq m'$ ,那么 $\exists i^, m_{i} = b^* \neq m'{i*}$。因此,为了伪造一个消息至少要对一个$y{i^,b^}$求逆。 - 证明:将对$y$求逆的
$\mathcal{I}$ 算法规约到攻击$\Pi$ 的$\mathcal{A}$ 算法:-
$\mathcal{I}$ 算法构造$pk$ :选择$i^* \gets {1,\dotsc,\ell}$ 并且$b^* \gets {0,1}$ ,令 $y_{i^,b^} := y$。对于$i \neq i^*$ $y_{i,b} := f(x_{i,b})$ ;- 在公钥中随机选择一个位置$(i^,b^)$,将待求逆的$y$放在该位置;对于其它位置,正常构造公私钥对。
-
$\mathcal{A}$ 算法查询$m'$ :如果 $m_{i_}' = b^$,则停止。否则,返回 $ \sigma = (x_{1,m'1},\dots,x{\ell,m'_{\ell}})$;- 如果$\mathcal{A}$ 的查询正好落在位置$(i^,b^)$,而该位置的$x_{i^,b^}$本应该是$y$对应的$x$,是未知的,终止实验。否则,正常返回签名。
- 当
$\mathcal{A}$ 输出$(m,\sigma)$ ,$\sigma=(x_1,\dotsc,x_{\ell})$,如果$\mathcal{A}$ 在 $(i^,b^)$输出了一个伪造的值,并且有 $\mathsf{Vrfy}{pk}(m,\sigma)=1$ 且 $m{i^} =b^ \neq m'{i^*}$,那么输出 $x{i^,b^}$;- 通过验证并且在$y$对应位置上输出签名,说明
$\mathcal{A}$ 输出的签名满足$f(x_{i,m_i}) = y_{i,m_i}$ 。
- 通过验证并且在$y$对应位置上输出签名,说明
- $ \Pr[\mathcal{I};; \text{succeeds} ] \ge \frac{1}{2\ell}\Pr[\mathcal{A};; \text{succeeds}] $
- 这是因为位置正好在特定位置满足条件的概率是$\frac{1}{2\ell}$.
-
- 思路:如果
-
有状态签名方案
- 思路:为了对任意数量的消息签名,可以从旧状态中获得新的密钥并以此来实现和OTS一样的效果
- 定义:有状态签名方案(Stateful signature scheme)
- 密钥生成算法:$(pk,sk,s_0) \gets \mathsf{Gen}(1^n)$。
$s_0$ 是初始状态。 - 签名算法:$(\sigma,s_i) \gets \mathsf{Sign}{sk,s{i-1}}(m)$。
- 验证算法:$b:= \mathsf{Vrfy}_{pk}(m,\sigma)$.
- 密钥生成算法:$(pk,sk,s_0) \gets \mathsf{Gen}(1^n)$。
- 一个简单的有状态OTS签名方案:独立产生
$(pk_i,sk_i)$ ,令$pk := (pk_1,\dotsc,pk_{\ell})$ 并且$sk := (sk_1,\dotsc,sk_{\ell})$ 。 从状态$1$ 开始,用$sk_s$ 签第$s$ 个消息,用$pk_s$ 来验证,并且更新状态到$s+1$ 。- 安全性:每个密钥只签了一个消息。
- 弱点:消息数量上届
$\ell$ 必须事先确定。
-
链式签名
- 思路:按需随时产生密钥并且对密钥链签名,解决消息数量有上限的问题。
- 最初使用一个公钥
$pk_1$ ,用$sk_i$ 来对每个当前消息$m_i$ 和下一个公钥$pk_{i+1}$ 签名 : $\sigma_i \gets \mathsf{Sign}{sk_i}(m_i| pk{i+1}),$ 输出$\langle pk_{i+1},\sigma_i \rangle$ , 并且用$pk_i$ 验证$\sigma_i$ ,签名$(pk_{i+1},\sigma_i,{m_j,pk_{j+1},\sigma_j}^{i-1}_{j=1})$ 。 - 弱点:仍然有状态,包括之前签过的所有消息,效率低,需要揭示之前所有消息才能验证当前消息。
-
树式签名
- 思路:减少所需维护状态,构造一个密钥树,树上的一个分支是为每个消息生成一个密钥链并且对这个链签名。
- 根据按消息中的比特构造一个二叉树,根为
$\varepsilon$ (空串),叶子为消息$m$ ,并且内部节点为密钥对$(pk_w,sk_w)$ ,其中$w$ 是$m$ 的前缀。 - 每个节点
$pk_w$ 负责对其子节点公钥$pk_{w0}| pk_{w1}$ 或消息$w$ 来签名。
-
无状态签名
- 思路:用确定的随机性来模拟树的状态。
- 使用PRF
$F$ 和两个密钥$k,k'$ 来产生$pk_w,sk_w$ :- 计算
$r_w := F_k(w)$ 。 - 计算
$(pk_w,sk_w) := \mathsf{Gen}(1^n;r_w)$ , 用$r_w$ 作为随机硬币。 -
$k'$ 用于产生$r_w'$ ,后者在产生签名$\sigma_w$ 时使用。
- 计算
- 如果 OWF 存在,那么
$\exists$ OTS (对于任意长度消息)。 - 定理:如果 OWF 存在,那么
$\exists$ (无状态) 安全签名方案。
-
证书
- 从之前的方案中可以观察到,一种安全地分发公钥的方法是对该公钥做一个数字签名。
- 对一个公钥的数字签名被称为,数字证书(Certificate);专门签发数字证书的机构被称为,证书权威机构(Certificate Authority,CA),CA是一个可信的第三方,其公钥($pk_C$)被所有相信CA的主体所持有。
- 一个数字证书 $ \mathsf{cert}{C\to B} \overset{\text{def}}{=} \mathsf{Sign}{sk_C}(\text{`Bob's key is } pk_B\text{'})$,表示 CA 用其私钥($sk_C$)给一个主体 Bob 签发的数字证书,其中消息内容包括:主体的身份(Bob)和该主体所持的公钥($pk_B$)。其本质是绑定一个身份和一个公钥。
- Bob 将自己的公钥提交给 CA,然后收到证书,最后将自己的公钥和证书一起发送给通信的另一个方。
- 一个问题是 CA 的公钥是如何分发的?通常随应用程序一起分发,例如浏览器中内置了全世界约170个左右的CA的公钥。在DNSSEC中,递归服务器软件中内置了DNS根的公钥。
- 另一个问题:CA如何知道收到的公钥是否是Bob的?需要采用其它渠道,例如一个CA “Let's Encrypt” 通过证明域名的所有权来识别证书申请者的身份。
-
公钥基础设施(PKI)
- 单一 CA: 被所有人信任。
- 优点:简单
- 缺点:单点失效
- 多重CA:被所有人信任。
- 优点:鲁棒
- 缺点:水桶定律
- 授权与证书链(Delegation,certificate chains):信任可以被传递。
- 优点:减轻根 CA 的负担
- 缺点:难以管理,水桶定律
- 信任网(Web of trust):没有信任的中心,例如,PGP。
- 优点:可靠,草根级
- 缺点:难以管理,难以对信任作出保证
- 单一 CA: 被所有人信任。
-
TLS 1.3 握手协议
- 目的:客户端与认证的服务器之间产生密钥
- 要求:客户端具有可信第三方的公钥,服务器具有由可信第三方发布的服务器公钥证书
- 协议主要步骤包括:
- 双方发送Hello消息,交换随机参数,各自DHKE公钥,同时也对所用的密码学套件和协议版本号进行协商;
- 分别根据交换信息根据DHKE生成共享秘密,进一步根据共享秘密和所有消息的哈希值派生出共享密钥
- 以下的消息都用上一步生成的对称密钥加密
- server端发送公钥证书,和用该公钥对应私钥来签名之前传递的消息(trans),以证明自己是证书的持有者;发送Finished结束消息,其中包含之前所有消息的HMAC;根据发送的所有消息和共享密钥生成应用密钥
- client验证证书和签名,并生成应用密钥
-
无效化证书
-
当私钥泄漏发生时,需要更换公私钥对,并将之前旧的公钥证书无效化。
-
过期法(Expiration):在证书中包含一个过期时间,待过期后自动作废。
$\mathsf{cert}{C \to B} \overset{\text{def}}{=} \mathsf{Sign}{sk_C}(\text{`bob's key is}; pk_B \text{'},; \text{date}). $
-
撤销/召回法(Revocation): 显式地撤销证书。
$\mathsf{cert}{C \to B} \overset{\text{def}}{=} \mathsf{Sign}{sk_C}(\text{`bob's key is}; pk_B \text{'},; \text{###}). $
其中的 ### 表示证书的序列号。
累积撤销:CA 产生证书撤销列表(Certificate revocation list,CRL)包含所有被撤销证书的序列号,并且带着当前日期一起签名。
-
-
独占所有权(Exclusive Ownership)
- 独占所有权:给定任意公钥的签名,没有敌手能够使得该签名可以被另一个不同的公钥验证。
- 重复签名公钥选择攻击:
- 一个签名由Bob的公钥验证有效,是否意味着Bob永其私钥产生了该签名?
- 不能。例如,Bob的用密钥对$(e=1, d=1)$ 和
$N = \sigma - m$ 。可以通过验证,$\sigma^e \mod N = \sigma \mod (\sigma - m) = m$。 - 该攻击被用来在域名的所有权上欺骗Let‘s Encrypt系统。
- 防御:在验证之前检查公钥。
-
签名加密(Signcryption)
- 一群人相互直接通信,每个人生成两对密钥:$(ek, dk)$表示加密公钥和解密私钥;$(vk, sk)$表示验证公钥和签名私钥。大家知道彼此的两个公钥。当一个发送者$S$向接收者$R$发送一个消息$m$时,如何在CCA攻击下同时保证通信的机密性(其他人不能知道消息$m$)和完整性(接受者$R$确信消息来自发送者$S$)?
- 提示:下面的问题的关键在于“完整性”,即是否能能够伪装为其他人发送消息。
- “先加密后认证”:消息 $\left< S, c \leftarrow \mathsf{Enc}{ek_R}(m), \mathsf{Sign}{sk_S}(c) \right>$ 是否安全?
- 注:消息中包含发送者身份是必要的,因为接收者需要用发送者的验证公钥来验证签名;消息中不包含接收者身份,因为接收者默认收到的消息都是发给自己的(直接通信,不存在中转)。
- 完整性有问题,发送者被伪造。因为敌手$A$可以去掉签名部分,替换成自己的身份和签名,$\left< A, c \leftarrow \mathsf{Enc}{ek_R}(m), \mathsf{Sign}{sk_A}(c) \right>$ 。
- “先认证再加密”:先签名,$\sigma \leftarrow \mathsf{Sign}{sk_S}(m)$,然后发送消息 $\left< S, \mathsf{Enc}{ek_R}(m| \sigma) \right>$ 是否安全?
- 完整性有问题,发送者被伪造。因为敌手$A$可以解密后重新用另一个人$R'$的加密公钥加密(不改变签名部分)后发送给$R'$,使得$R'$误认为是$S$给他发的消息。
- 正确的方法是将身份应作为消息的一部分:签名中包含接收者身份 $\sigma \leftarrow \mathsf{Sign}{sk_S}(m | R)$ ;加密消息中包含发送者身份 $\left< S, \mathsf{Enc}{ek_R}(S| m | \sigma) \right>$。接收者解密后,提取发送者身份和接受者身份并验证。
- 这里的关键之一是签名将消息,发送者,接收者绑定在一起
- 当将身份和消息一起加密时,先加密后认证的方法也可以保证安全。
-
总结
- 数字签名提供了公开可验证的真实性和完整性
- 签名与只有某人知道的某物有关,这件事是可以公开验证的
- 签名用来将对一个公钥的信任转化为对其签名数据的信任