如果公钥不能用于解密由私钥加密的东西,那么数字签名如何工作?

信息安全 tls 公钥基础设施
2021-08-17 20:01:41

我正在学习 ssl/tls 协议用例中的非对称加密。

我可以理解公钥(如挂锁)可以加密(锁定)
某些东西,只有私钥可以解密(打开)它。

但我只是无法理解相反的方式。
公钥如何验证 CA 私钥加密的数字签名?

很多资料都说公钥不能用于解密
(这很好,如果假设公钥是挂锁,那么可以肯定,你无法解锁东西)。那么,在不能用来解密的情况下,如何使用公钥来验证数字签名呢?

我可以理解公钥/私钥用于客户端服务器验证。
一个服务器对一些秘密进行加密,并要求客户端解密,然后比较
结果,然后我就可以知道你是否是私钥的持有者。

但至于数字签名,就另当别论了,因为我认为在
数字签名中,它不包含发行人的私钥,对吧?
那么如何在没有私钥解密的情况下进行上述验证呢?

4个回答

试图用加密术语解释签名的整个概念是有缺陷的。它根本行不通。所以让我们解开整个事情,这需要一些形式主义。


形式上密码签名系统由三种算法组成:

  • KeyGen:将“安全参数”(例如,我们想要获得的密钥的长度)作为输入,并生成一个新的公钥/私钥对(K pK s)。

  • 签名:将消息m和私钥K s作为输入输出是一个签名s

  • 验证:将消息m、签名s和公钥K p作为输入;输出是一个布尔值(成功时为,如果签名无效则为假)。

如果算法按照宣传的方式运行(Sign使用KeyGen生成的密钥对生成Verify接受的签名),则称该系统是健全的。如果系统在计算上无法伪造,则称该系统是密码安全的:给定公钥K p,并且在不知道K s _ 的情况下,生成 a ( m , s ) 对使得验证( m , s , K p ) =真的该定义特别暗示私钥不应仅从公钥计算,否则伪造将很容易。

以上都没有说明算法是如何工作的。已经发明、描述和标准化了各种系统。


RSA是一种非常著名的非对称算法,但这是错误的,因为 RSA 不是一种算法。RSA 是称为陷门置换的内部操作的名称,从中派生出非对称加密系统签名系统。RSA 操作大致如下:

  • n是一个大整数,使得n = pq,其中pq是两个不同的大素数。pq的知识是“私钥”。e是某个(通常是小的)整数,称为“公共指数”;e必须与p-1q-1 互质。e的传统值是 3 和 65537。

  • 给定一个整数xn0n-1范围内的整数),RSA 前向运算正在计算x e mod nx被提升为指数en)。这很容易做到。碰巧这个操作是整数模n的排列(每个yn等于x e mod m恰好有一个x)。“神奇”的部分是,由于某种原因,没有人找到一种有效的方法来计算反向操作(得到xx e mod n ) 不知道pq这并不是因为缺乏尝试;2500 多年来,最优秀的人一直在研究整数因式分解当您知道pq 时,RSA 反向操作变得容易。pq的知识因此被称为陷门

现在我们有了这个陷门置换,我们可以设计一个签名算法,其工作方式如下:

  • KeyGen:给定目标长度k ,产生两个长度约为k / 2 位的随机素数pq,使得p-1q-1都与先验选择的e相对素数(例如e = 3),并且n = pq的长度为k位。公钥是(ne),私钥是(pqe)。

  • 符号:获取消息m,用一些散列函数(例如 SHA-256)对其进行散列,并将散列输出(在 SHA-256 的情况下为 256 位序列)“转换”为整数yn该转换就是填充的内容,因为标准方法(如PKCS#1中所述)正在写入带有一些额外字节的散列输出,然后将结果解释为整数(在 PKCS 的情况下采用大端约定#1)。一旦散列消息通过填充转换为整数y,私钥所有者应用陷门(反向 RSA 操作)来计算x使得x e = y modn(这样的x存在并且是唯一的,因为 RSA 操作是一个排列)。签名s是该整数x的字节编码。

  • 验证:给定签名s,将其解码回整数xn,然后计算y = x en如果此值y等于h ( m ) 的填充(消息m的哈希),则接受签名(返回值为true)。

RSA 加密是另一种独特的系统,它也建立在 RSA 陷门排列之上。加密是通过将整数x提高到指数en来完成的;由于知道私钥(pq因子) ,解密是通过反转该操作来完成的。由于这样的系统只处理大整数,我们想要加密和解密字节,那么在某些时候也必须进行某种转换,因此涉及到填充过程。至关重要的是,加密填充的安全要求与签名填充的安全要求截然不同。例如,加密填充必须包含大量随机性,而签名填充必须包含大量确定性。在实践中,这两种填充系统是完全不同的。

当人们查看 RSA 签名和 RSA 加密时,他们发现将签名描述为一种加密是合适的。如果你看一下,RSA 前向操作(提高到指数e)是为 RSA 加密完成的,也用于 RSA 签名验证。类似地,对 RSA 解密和 RSA 签名生成执行相反的操作。此外,如果天才是为了让其他人感到困惑,那么作为天才的一击,一些人注意到 RSA 逆运算在数学上可以表示为“将整数提高到某个幂模n",就像正向操作(但指数不同)。因此他们开始将反向操作称为“加密”。此时,RSA加密,RSA解密,RSA签名生成和RSA签名验证都称为“加密” . 由于一些奇怪的心理原因(我责怪后迪斯科流行音乐的有害影响),许多人仍然认为通过首先给它们相同的名称来解释四种不同的操作在教学上是合理的。


我们描述了 RSA;让我们看看另一种完全不同的算法,称为DSADSA 不使用陷门排列。在 DSA 中,我们以一个大素数(传统上称为p)和另一个较小素数(称为q)为模进行计算,这样p-1q的倍数。pq是众所周知的。

DSA 中有一个单向操作。给定一个整数gp (严格来说,在p的一个特定子集称为q阶子群)和一个整数xq,每个人都可以计算g x mod p然而,g x mod p中恢复x在计算上是不可行的。

虽然这在某种程度上看起来像 RSA,但有一些关键的区别:

  • 这里,操作是将g提高到指数x,其中实际输入是x(指数),因为g是一个固定的常规值。

  • 这不是一个排列,因为x是一个模q的整数,而g x mod p是一个模p的整数,这是一个完全不同的集合。

  • 这当然不是活板门:没有允许恢复x的“秘密知识” ,除非您已经知道x的确切值。

但是,可以在该操作上构建签名算法。它看起来像这样:

  • KeyGenpqg整数已经固定,并且可能被所有人共享。要生成新的私钥,请生成一个介于 1 和q -1之间的随机整数x 。公钥是y = g x mod p

  • 签到

    • 给定消息m,对其进行散列,然后将散列值转换为整数hq
    • 在 1 和q-1之间生成一个新的、新鲜的、使用后丢弃的随机整数k
    • 计算r = g k mod p mod q(取幂以p为模,然后结果进一步以q为模)。
    • 计算s = ( h + xr ) / k mod q签名是 ( r , s )。
  • 验证

    • 哈希消息m以重新计算h
    • 计算w = 1 / s mod q
    • 计算u 1 = hw mod q
    • 计算u 2 = rw mod q
    • 计算v = g u 1 y u 2 mod p mod q
    • 如果v = r,则签名有效;否则,它不是。

现在祝你好运,试图将其描述为某种“加密”。如果您发现这里加密的内容不清楚,那是因为这里没有加密任何内容。这不是加密。


然而,有一个挥手的概念描述签名,它可以与 RSA、DSA 和许多其他签名算法一起使用。您可以将签名视为一种特定类型的身份验证。

身份验证中,一个人(证明者)向另一个人(验证者)展示他的身份证明者通过执行一些只有该人才能执行的操作来做到这一点,但是以这样一种方式,验证者可以确信他见证了真实的事物。例如,一个非常基本的身份验证系统称为“显示密码”:证明者和验证者都知道一个共享秘密(“密码”);证明者通过说出密码向验证者展示他的身份。

对于签名,我们想要一些更复杂的东西:

  • 签名是异步的。签字人行动一次;验证是在之后进行的,可能在其他地方进行,并且没有签名者的任何进一步积极帮助。
  • 验证者不需要知道任何秘密。签名应该让每个人都信服。
  • 签字人不得泄露任何秘密。他的私钥不应该被消费(是的,我知道有一些签名方案可以与消费一起工作;我们不要去那里)。
  • 签名应该特定于给定的消息m

身份验证方案的一个相当通用的结构是基于挑战:验证者向证明者发送一个挑战,证明者只能通过他对他的秘密的了解才能回答。

如果您查看 RSA,那么您可以看到它是一种基于质询的身份验证机制。挑战是散列和填充的消息。签名者通过对该挑战应用 RSA 反向操作来证明他对私钥的掌握程度,这是只有他才能做到的事情;但是每个人都可以应用 RSA 前向操作来查看挑战确实得到了很好的解决。

如果您查看 DSA,您可以再次看到基于质询的身份验证机制。签名者首先通过发布r来提交秘密值k那么挑战是(再次)消息h与承诺r相结合;签名者只能通过使用他的私钥x来回答这个挑战。在 DSA 中,签名者拥有永久私钥x,生成一次性私有值k,并展示他对x/k mod q的了解。(这不会泄露关于x的信息,因为k只使用一次。)


总结:签名算法不是加密算法,对基于加密的签名的解释充其量只能是完全混乱的。更好的解释是表明签名算法实际上是一种特定类型的身份验证机制,签名者通过该机制证明他对私钥的了解,以响应涉及签名消息的综合挑战。

只要对所述挑战进行了充分明确的说明,以证明它不会对签名者有利,那么这种身份验证对旁观者来说是令人信服的。在 RSA 中,它是确定性散列和填充的结果(并且填充注意避免 RSA 反向操作变得容易的值)。在 DSA 中,挑战是根据签名者的先前承诺计算的。

事实上,任何零知识认证系统都可以通过使其非交互性变成签名机制:由于 ZK 系统通过承诺、挑战和对这些挑战的响应来工作,您可以让签名者计算他的所有承诺,并将它们全部散列与要签名的消息一起,并使用哈希值作为挑战。这并不意味着 ZK 证明潜伏在所有签名算法中;但是,如果您发现 DSA 看起来有点像,那么,这是有充分理由的。

最好将数字签名与加密完全解耦来理解。签名算法通常由两个操作组成,SIGN 和 VERIFY。SIGN 接收消息和私钥,并生成称为“签名”的数据块;VERIFY 接受消息、SIGN 生成的签名和公钥,并输出该签名是否是该消息的有效签名。

这是一个不涉及任何类似加密的签名机制的示例;它被称为数字签名算法:

  • 签名者首先选择一些参数:一个一个散列p函数H一个q最多. 这些参数可以在不同用户之间共享;事实上,对于密切相关的 ECDSA,只有一个参数可供选择,几乎每个人都使用。Hgg^q = 1 (mod p)g^k != 1 (mod p)0 < k < qqg1
  • 签名者的私钥由一个整数组成x < q他们的公钥是y = g^x (mod p).
  • 签署消息,他们会执行以下操作:
    • 创建一个k介于1和之间的随机数q-1k必须是随机的,并且对于您使用相同密钥签名的每条消息都必须不同。计算r = (g^k (mod p)) (mod q)
    • 计算s = k^{-1} (H(m)+xr) (mod q)签名是(r,s)
    • 如果rors为零,请选择不同的k并重新开始。
  • 验证,请执行以下操作:
    • 计算w = s^{-1} (mod q)
    • 计算u = (w)(H(m)) (mod q)v = (w)(r) (mod q)
    • 计算t = ((g^u)(y^v) (mod p)) (mod q)
    • 当且仅当签名有效t=r

如您所见,这看起来并不完全像加密。提取t需要已经知道r(它应该等于)。它之所以有效,是因为签名者知道x可以创建两个数字rs具有一定的关系,可以由知道的人验证g^xr除了已经签名中之外,您无法从签名中得到任何东西此算法(与教科书 RSA 或带有 PKCS 1.5 签名填充的 RSA 不同)不会为您提供签名中消息的哈希值。验证将哈希作为输入,然后将其输入到复杂的计算中,以查看其他两个事物是否相等。

这就是验证的全部内容。签名会产生一堆声称与特定消息有某种关系的数据。这种关系不需要像“将此操作应用于签名,您将获得消息的哈希值”那么简单;它可能是一个相当复杂的事情,就像在 DSA 中一样。

数字签名包括两个步骤:

a) 消息摘要评估评估摘要的主要目的是确保消息保持不变;这称为消息完整性。

b) 摘要签名签名实际上是使用发行者的私钥进行的加密。签名中还包括发行者使用的散列算法名称。发行者的公钥也附加到签名中。这样做可以让任何人使用发行者的公钥和散列算法解密和验证签名。鉴于公钥加密和散列算法的特性,接收者有证据证明:

i)发行人的私钥对摘要进行了加密;

ii)消息受到保护,不会被任何更改。

与实体或个人的公钥一起,数字证书包含有关用于创建签名的算法、识别的个人或实体、验证主题数据并颁发证书的 CA 的数字签名、公钥的用途等信息加密、签名和证书签名,以及证书被视为有效的日期范围。

解密和验证消息签名的步骤

 解密和验证消息签名的步骤

在此处输入图像描述

但是,数字签名必然不止这种类型:

一些数字签名算法:

  1. 基于 RSA 的签名方案,例如 RSA-PSS
  2. DSA 及其椭圆曲线变体 ECDSA
  3. 作为DSA前身的ElGamal签名方案,以及Schnorr签名和Pointcheval-Stern签名算法的变体
  4. 拉宾签名算法
  5. 基于配对的方案(例如 BLS)允许用户验证签名者的真实性。该方案使用双线性对进行验证,签名是一些椭圆曲线中的群元素
  6. 不可否认的签名 - 它有两个显着的特点: 验证过程是交互式的,因此在没有签名者参与的情况下无法验证签名。 拒绝协议,这是一种允许验证者区分两种情况的加密协议:(a)签名无效;(b) 签名者的反应不恰当。
  7. 聚合签名 - 支持聚合的签名方案:给定来自 n 个用户的 n 条消息上的 n 个签名,可以将所有这些签名聚合成一个签名,其大小在用户数量中是恒定的。这个单一签名将使验证者相信 n 个用户确实签署了 n 个原始消息。
  8. 具有高效协议的签名 - 是促进高效加密协议(如零知识证明或安全计算)的签名方案。

对于 RSA 加密,公钥和私钥都可以用于加密或解密。它们之间的唯一区别是您将一个密钥保密,而您宣传另一个密钥。

您的文字所指的是,当您加密要发送给某人的消息时,您使用他们的公钥对其进行加密。当然,您不能使用他们的私钥,因为它是私有的。这可以保护消息,因为只有他们拥有自己的私钥。

但是这两个密钥都适用于加密操作。因此对于数字签名,作者使用他们的私钥加密他们的哈希,然后你通过使用他们的公钥解密来验证。

这不适用于所有非对称加密算法。