Skip to content

Latest commit

 

History

History
338 lines (255 loc) · 26.1 KB

9 数字签名.md

File metadata and controls

338 lines (255 loc) · 26.1 KB

9 数字签名

  1. 本节学习公钥密码学中用于保护信息完整性和真实性的数字签名。

  2. 目录:数字签名定义、RSA签名、来自离散对数问题的数字签名、一次签名方案、证书与公钥基础设施。

  3. 数字签名概览

    • 数字签名(Digital signature)是一个数学方案用来证明一个数字消息的真实性/完整性。
    • 数字签名允许一个签名者(Signer)$S$ 用其自己的私钥来“签名”(sign)一个消息,并且任何知道 $S$ 的公钥的人可以验证(verify)其真实性/完整性。
    • 与MAC相比,数字签名是:
      • 公开可验证的(publicily verifiable);
      • 可转移的(transferable);
      • 不可抵赖(non-repudiation);
      • 但速度慢。
    • 问题:数字签名和手写签名的却别是什么?
    • 数字签名不是公钥加密的逆。
  4. 数字签名方案词法

    • 签名 $\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$。
  5. 定义签名安全

    • 安全数字签名定义与安全MAC类似,敌手难以伪造一个“新消息”的签名。
    • 签名实验 $\mathsf{Sigforge}_{\mathcal{A},\Pi }(n)$:
      1. 挑战者生成密钥对 $(pk,sk) \gets \mathsf{Gen}(1^n)$
      2. 敌手 $\mathcal{A}$ 给予输入 $1^n$ 以及对签名预言机的访问 $\mathsf{Sign}_{sk}(\cdot)$,然后输出 $(m,\sigma)$$\mathcal{Q}$ 是对预言机的查询的集合。
      3. 实验成功 $\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会如何?
  6. “书本上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$ 的一个有效签名。
  7. 哈希(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签名是安全的。
  8. Schnorr签名概览

    • Schnorr签名展现了签名,身份识别和零知识证明之间的联系
    • 该方案是Schnorr身份识别协议的非交互版本,而后者是一个对离散对数问题的解的交互式零知识证明
    • 安全:在ROM下和离散对数难题假设下,将Fiat-Shamir变换应用于Schnorr身份识别协议
    • 应用于多重签名,门限签名和盲签名,这些技术被广泛应用于密码学货币
  9. Schnorr身份认证方案

    • 证明者公开地证明其知道一个离散对数问题的解,通过一个三轮的西格玛协议
      1. 证明者持有一个离散对数问题$g^x = y$的私钥部分$x$,生成$k \gets \mathbb{Z}_q$; $I := g^k$,并将$I$发送给验证者。
        • 注:这个$k$就是 $\mathsf{st}$, 后面用来隐藏私钥$x$;
      2. 验证者生成 $r \gets \mathbb{Z}_q$,并将$r$发送给证明者。
        • 注:随机的$r$不能被预测,并且在$I$之后产生;
      3. 证明者生成 $s := [rx + k \mod q]$,并将$s$发送给证明者。
        • 注:用$x$生成应答,并用$k$隐藏$x$;
      4. 验证者验证$\mathcal{V}(pk, r, s) = g^s \cdot y^{-r} \overset{?}{=} I$。注:$g^s \cdot y^{-r} = g^{rx+k} g^{-rx} = g^k$
    • 问题:为什么一个更简单的协议不安全?
  10. 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]$,否则输出空。
  11. 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$
  12. 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中验证的正确性?
  13. DSS/DSA安全性

    • 不安全性:DSS的安全性依赖于离散对数问题的难解性,尚未有基于离散对数假设的DSS安全性证明。
    • $k$ 的熵、保密和唯一性是安全性的关键。
    • 情况1:如果$k$是可预测的,那么$x$将泄漏,因为$s:= (H(m)+xr)\cdot k^{-1}$中只有$x$是未知的。
    • 情况2:如果同一个$k$被用于同一私钥下的两个不同签名,那么$k$和$x$都将泄漏。问题:如何做?
      • 该攻击曾在2010年用于对Sony PlayStation (PS3) 提取私钥。
  14. 一次签名(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).$

  15. 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。
  16. Lamport的OTS例子

  17. 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}$
      • $ \Pr[\mathcal{I};; \text{succeeds} ] \ge \frac{1}{2\ell}\Pr[\mathcal{A};; \text{succeeds}] $
        • 这是因为位置正好在特定位置满足条件的概率是$\frac{1}{2\ell}$.
  18. 有状态签名方案

    • 思路:为了对任意数量的消息签名,可以从旧状态中获得新的密钥并以此来实现和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)$.
    • 一个简单的有状态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$ 必须事先确定。
  19. 链式签名

    • 思路:按需随时产生密钥并且对密钥链签名,解决消息数量有上限的问题。
    • 最初使用一个公钥 $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})$
    • 弱点:仍然有状态,包括之前签过的所有消息,效率低,需要揭示之前所有消息才能验证当前消息。
  20. 树式签名

    • 思路:减少所需维护状态,构造一个密钥树,树上的一个分支是为每个消息生成一个密钥链并且对这个链签名。
    • 根据按消息中的比特构造一个二叉树,根为 $\varepsilon$ (空串),叶子为消息 $m$,并且内部节点为密钥对 $(pk_w,sk_w)$,其中 $w$$m$ 的前缀。
    • 每个节点 $pk_w$ 负责对其子节点公钥 $pk_{w0}| pk_{w1}$ 或消息 $w$ 来签名。
  21. 无状态签名

    • 思路:用确定的随机性来模拟树的状态。
    • 使用PRF $F$ 和两个密钥 $k,k'$ 来产生 $pk_w,sk_w$
      1. 计算 $r_w := F_k(w)$
      2. 计算 $(pk_w,sk_w) := \mathsf{Gen}(1^n;r_w)$, 用 $r_w$ 作为随机硬币。
      3. $k'$ 用于产生 $r_w'$ ,后者在产生签名 $\sigma_w$ 时使用。
    • 如果 OWF 存在,那么 $\exists$ OTS (对于任意长度消息)。
    • 定理:如果 OWF 存在,那么 $\exists$ (无状态) 安全签名方案。
  22. 证书

    • 从之前的方案中可以观察到,一种安全地分发公钥的方法是对该公钥做一个数字签名。
    • 对一个公钥的数字签名被称为,数字证书(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” 通过证明域名的所有权来识别证书申请者的身份。
  23. 公钥基础设施(PKI)

    • 单一 CA: 被所有人信任。
      • 优点:简单
      • 缺点:单点失效
    • 多重CA:被所有人信任。
      • 优点:鲁棒
      • 缺点:水桶定律
    • 授权与证书链(Delegation,certificate chains):信任可以被传递。
      • 优点:减轻根 CA 的负担
      • 缺点:难以管理,水桶定律
    • 信任网(Web of trust):没有信任的中心,例如,PGP。
      • 优点:可靠,草根级
      • 缺点:难以管理,难以对信任作出保证
  24. TLS 1.3 握手协议

    • 目的:客户端与认证的服务器之间产生密钥
    • 要求:客户端具有可信第三方的公钥,服务器具有由可信第三方发布的服务器公钥证书
    • 协议主要步骤包括:
      • 双方发送Hello消息,交换随机参数,各自DHKE公钥,同时也对所用的密码学套件和协议版本号进行协商;
      • 分别根据交换信息根据DHKE生成共享秘密,进一步根据共享秘密和所有消息的哈希值派生出共享密钥
      • 以下的消息都用上一步生成的对称密钥加密
      • server端发送公钥证书,和用该公钥对应私钥来签名之前传递的消息(trans),以证明自己是证书的持有者;发送Finished结束消息,其中包含之前所有消息的HMAC;根据发送的所有消息和共享密钥生成应用密钥
      • client验证证书和签名,并生成应用密钥
  25. 无效化证书

    • 当私钥泄漏发生时,需要更换公私钥对,并将之前旧的公钥证书无效化。

    • 过期法(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)包含所有被撤销证书的序列号,并且带着当前日期一起签名。

  26. 独占所有权(Exclusive Ownership)

    • 独占所有权:给定任意公钥的签名,没有敌手能够使得该签名可以被另一个不同的公钥验证。
    • 重复签名公钥选择攻击:
      • 一个签名由Bob的公钥验证有效,是否意味着Bob永其私钥产生了该签名?
      • 不能。例如,Bob的用密钥对$(e=1, d=1)$ 和 $N = \sigma - m$。可以通过验证,$\sigma^e \mod N = \sigma \mod (\sigma - m) = m$。
      • 该攻击被用来在域名的所有权上欺骗Let‘s Encrypt系统。
      • 防御:在验证之前检查公钥。
  27. 签名加密(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>$。接收者解密后,提取发送者身份和接受者身份并验证。
      • 这里的关键之一是签名将消息,发送者,接收者绑定在一起
    • 当将身份和消息一起加密时,先加密后认证的方法也可以保证安全。
  28. 总结

    • 数字签名提供了公开可验证的真实性和完整性
    • 签名与只有某人知道的某物有关,这件事是可以公开验证的
    • 签名用来将对一个公钥的信任转化为对其签名数据的信任