375

加密某些数据与签署某些数据(使用 RSA)有什么区别?

它只是简单地颠倒了公钥-私钥的角色吗?

例如,我想使用我的私钥生成消息,所以只有我可能是发件人。我希望我的公钥用于阅读消息,我不在乎谁阅读了它们。我希望能够加密某些信息并将其用作我的软件的产品密钥。我只关心我是唯一可以生成这些的人。我想在我的软件中包含我的公钥来解密/读取密钥的签名。我不在乎谁可以读取密钥中的数据,我只关心我是唯一可以生成它们的可验证的人。

在这种情况下签名有用吗?

4

12 回答 12

556

加密时,您使用他们的公钥编写消息,而他们使用他们的私钥读取消息。

签名时,您使用您的私钥编写消息的签名,他们使用您的公钥检查它是否真的是您的。

我想使用我的私钥生成消息,所以只有我可能是发件人。

我希望我的公钥用于阅读消息,我不在乎谁阅读了它们

这是签名,它是用你的私钥完成的。

我希望能够加密某些信息并将其用作我的软件的产品密钥。

我只关心我是唯一可以生成这些的人。

如果您只需要自己了解它,则不需要弄乱钥匙来做到这一点。您可能只是生成随机数据并将其保存在数据库中。

但是,如果您想让人们知道密钥确实是您的,您需要生成随机数据,在其中保存一个数据库并使用您的密钥对其进行签名。

我想在我的软件中包含我的公钥来解密/读取密钥的签名。

您可能需要从 Verisign 或 Thawte 等商业提供商处为您的公钥购买证书,以便人们可以检查没有人伪造您的软件并用他们的公钥替换您的公钥。

于 2009-01-17T21:20:06.920 回答
173

在 RSA 加密中,当您生成密钥对时,您完全可以随意选择哪个作为公钥,哪个是私钥。如果你用一个加密,你可以用另一个解密——它可以双向工作。

因此,很容易了解如何使用接收者的公钥加密消息,以便接收者可以使用他们的私钥对其进行解密。

签名是签名者拥有与某个公钥匹配的私钥的证明。为此,使用该发件人的私钥对消息进行加密就足够了,并将加密版本与明文版本一起包括在内。要验证发件人,请解密加密版本,并检查它是否与明文相同。

当然,这意味着您的信息不是秘密。任何人都可以解密它,因为公钥是众所周知的。但是当他们这样做时,他们已经证明密文的创建者拥有相应的私钥。

但是,这意味着将传输的大小加倍 - 明文和密文一起(假设您希望对验证签名不感兴趣的人阅读消息)。因此,通常通过创建明文的哈希来创建签名。不能创建假散列很重要,因此使用了 SHA-2 等加密散列算法。

所以:

  • 要生成签名,请从明文中生成哈希,使用您的私钥对其进行加密,并将其与明文一起包含。
  • 要验证签名,请从明文中生成散列,使用发送者的公钥解密签名,检查两个散列是否相同。
于 2009-01-17T21:38:15.323 回答
45

建立安全通信有两个不同但密切相关的问题

  1. 加密数据,以便只有授权人员才能解密和读取它。
  2. 验证发件人的身份/身份验证。

这两个问题都可以使用公钥密码术优雅地解决。

一、数据的加解密

Alice 想向 Bob 发送一条任何人都无法阅读的消息。

  • Alice 使用 Bob 的公钥加密消息并将其发送过去。
  • Bob 收到消息并使用他的私钥对其进行解密。

请注意,如果 A 想向 B 发送消息,A 需要使用 B 的公钥(任何人都可以公开使用),并且 A 的公钥和私钥都不会出现在这里。

因此,如果您想向我发送消息,您应该知道并使用我提供给您的公钥,并且只有我才能解密该消息,因为我是唯一可以访问相应私钥的人。

二、验证发件人的身份(身份验证)

Alice 想再次向 Bob 发送消息。使用上述方法解决了加密数据的问题。

但是,如果我坐在 Alice 和 Bob 之间,向 Bob 介绍自己为“Alice”并将我自己的消息发送给 Bob,而不是转发 Alice 发送的消息,该怎么办。即使我无法解密和阅读 Alice 发送的原始消息(需要访问 Bob 的私钥),我也在劫持他们之间的整个对话。

Bob 有没有办法确认他收到的消息实际上是由 Alice 发送的?

  • Alice 用她的私钥对消息进行签名并将其发送过去。(实际上,签名的是消息的哈希,例如 SHA-256 或 SHA-512。)
  • Bob 收到它并使用 Alice 的公钥验证它。由于 Alice 的公钥成功验证了该消息,Bob 可以得出该消息已被 Alice 签名的结论。
于 2018-01-12T21:31:03.360 回答
23

是的,可以将签名数据视为给它自己的蜡印,其他人没有。这样做是为了实现完整性和不可否认性。加密使其他人无法看到数据。这样做是为了实现保密。参见维基百科http://en.wikipedia.org/wiki/Information_security#Key_concepts

签名是使用您的私钥签名的消息的哈希值。

于 2009-01-17T21:19:15.910 回答
20

签名是用你的私钥产生一个“哈希”,可以用你的公钥来验证。文本以明文形式发送。

加密使用接收者的公钥对数据进行加密;解码是用他们的私钥完成的。

因此,密钥的使用不会被逆转(否则您的私钥将不再​​是私有的!)。

于 2009-01-17T21:11:03.523 回答
9

您正在准确描述在公钥加密中使用签名的方式和原因。请注意,对他人提供的任意消息进行签名(或加密)是非常危险的——这允许对可能危及您的密钥的算法进行攻击。

于 2009-01-17T21:20:26.563 回答
8

在功能上,您使用公钥/私钥加密来确保只有接收者可以阅读您的消息。消息使用接收者的公钥加密,并使用接收者的私钥解密。

您可以使用签名让接收者知道您创建了消息并且在传输过程中它没有更改。消息签名是使用您自己的私钥完成的。接收者可以使用你的公钥来检查消息是否被篡改。

至于使用的算法:涉及单向函数,请参见例如 wikipedia。此类算法中的第一个使用大素数,但此后发明了更多的单向函数。

搜索“Bob”、“Alice”和“Mallory”以查找互联网上的介绍文章。

于 2009-01-17T21:16:06.743 回答
8

签名表明您确实是签名对象的来源或担保人。但是,每个人都可以阅读该对象。

加密意味着只有拥有相应私钥的人才能读取它,但没有签名就不能保证你在加密对象的背后。

于 2009-01-17T23:08:38.480 回答
7

加密某些数据与签署某些数据(使用 RSA)有什么区别?

加密保留了消息(“某些数据”)的机密性,而签名提供了不可否认性:即只有签署它的实体才能签署它。也存在功能差异;继续阅读。

它只是简单地颠倒了公钥-私钥的角色吗?

绝对不。不赞成使用相同的私钥进行签名和解密(或者同样地,使用相同的公钥进行验证和加密),因为您不应该混合使用目的。这不是一个数学问题(RSA 应该仍然是安全的),而是一个密钥管理问题,例如,签名密钥的寿命应该更短,并且在使用之前包含更多保护。

对于同一条消息,您应该使用发送方私钥进行签名,使用接收方信任的公钥进行加密。通常使用签名然后加密,否则对手可以用他自己的签名替换。同样,您应该使用接收方的私钥进行解密,使用发送方的可信公钥进行验证。

此外,您应该了解签名生成不使用“使用私钥加密”。尽管所有 RSA 操作都基于模幂运算,但填充方案对于签名生成是完全不同的。此外,在 RSA 的所有实际应用中,公钥具有与 RSA 私钥完全不同的属性。

例如,我想使用我的私钥生成消息,所以只有我可能是发件人。

那是不可否认性,可以通过签名来实现。

我希望我的公钥用于阅读消息,我不在乎谁阅读了它们。

公钥应该被认为是众所周知的。如果您希望每个人都阅读这些消息,那么您根本不加密它们。

签名通常不会影响消息的内容。消息被认为与签名分开。正式地,此类签名被称为“带有附件的签名”,其中附件是消息。这是一个有点奇怪的名字,因为消息被认为比签名更重要,但是是的。只有少数签名提供(部分)消息恢复;它们不再使用太多,通常被认为已弃用。

请注意,诸如 CMS 之类的签名协议可能会部署包含消息和签名的容器格式。在这种情况下,您首先需要从容器中取出 - 仍未加密的 - 消息,就像从普通的 .zip 存档中解压缩文件一样。因此,消息可能会被隐藏起来,并且在这种情况下不能直接使用。

我希望能够加密某些信息并将其用作我的软件的产品密钥。我只关心我是唯一可以生成这些的人。

加密用于实现机密性。过去 RSA 签名生成通常被认为是“用私钥加密”。但是,操作与上面解释的完全不同,后来的标准拼命尝试将加密和签名生成分开。

我想在我的软件中包含我的公钥来解密/读取密钥的签名。我不在乎谁可以读取密钥中的数据,我只关心我是唯一可以生成它们的可验证的人。

是的,这称为建立对公钥的信任。但是,保护您的程序代码与保护消息有很大不同。您可以执行代码签名,但是您需要一些东西来检查代码之外的签名。有提供此功能的操作系统。

例如,有 Microsoft Authenticode。像 iStore 和 Android 应用程序商店这样的应用程序商店可能会也可能不会使用代码签名,但它们提供了一些保证,即您的应用程序不会被克隆或至少不会在商店中被克隆。毕竟,密码学并不总是解决方案。

完全防止您的代码被克隆/更改要困难得多,如果您这样做,您将坚定地处于 DRM 领域。

在这种情况下签名有用吗?

是的,一点没错。如果对公钥有信任,它当然可以帮助确保消息仅由您签名。它是否有助于验证您的应用程序代码/集成公钥完全取决于您希望在其中运行代码的环境。

于 2019-03-16T14:55:38.213 回答
4

在您的场景中,您没有按照非对称加密的含义进行加密;我宁愿称它为“编码”。

所以你将你的数据编码成一些二进制表示,然后你用你的私钥签名。如果您无法通过公钥验证签名,则您知道签名数据不是使用您的私钥生成的。(“验证”表示无符号数据没有意义)

于 2009-01-17T22:13:34.537 回答
1

在提问者意图使用软件许可解决方案的内容中回答这个问题,要求是:

  1. 没有第 3 方可以通过反编译应用程序生成许可证密钥
  2. 软件密钥的内容不需要是安全的
  3. 软件密钥不是人类可读的

数字签名将解决这个问题,因为可以使用私钥对生成密钥的原始数据进行签名,这使得它不可读,但如果逆向工程则可以解码。但是私钥是安全的,这意味着没有人能够为您的软件制作许可证(这就是重点)。

请记住,您无法阻止技术人员移除您产品上的软件锁。因此,如果他们必须破解每个发布的版本。但是您真的不希望他们能够为您的产品生成可以为所有版本共享的新密钥。

Python PyNaCl 文档有一个“数字签名”示例,可以满足此目的。http://pynacl.readthedocs.org/en/latest/signing/

并导致 NaCl 项目到 C 示例

于 2016-03-10T11:38:59.640 回答
0

加密某些数据与签署某些数据(使用 RSA)有什么区别?

RSA 仅仅是唯一一个天真地支持公钥加密和数字签名的公钥密码系统。

这通常会使初学者感到困惑,因为各种消息来源/讲师说

  • RSA解密是RSA签名。
    • 不它不是!

困惑来自教科书 RSA

  • 教科书 RSA 加密;

    消息m并计算c = m^e mod n加密和m = c^d mod n解密。

  • 教科书 RSA 签名;

    消息m并计算sg = m^d mod n验证和m == sg^e mod n签名验证。

两者都不安全也没有在现实生活中使用!

它只是简单地颠倒了公钥-私钥的角色吗?

不它不是!

加密

对于 RSA 加密,必须使用 RSASSA-PKCS1-v1_5 填充或Optimal Asymmetric Encryption Padding (OAEP)。这些填充对消息有开销。例如,PKCS1-v1_5 定义为

它有这样的EM结构

EM = 0x00 || 0x02 || PS || 0x00 || M.

那么它们是什么?

所以它有一个特殊的消息结构来保证安全,最近(2018 年)被证明是安全的。填充至少有 11 字节的开销。

签名

签名的正确术语是签名和验证。对于安全签名,RSA 需要 RSA-PSS(概率签名方案)。结构有点复杂,一张图说明大部分

在此处输入图像描述

一旦您对消息进行哈希处理并正确填充,您就可以使用您的私钥签署您的填充消息!

对于验证,使用签名消息上的公钥并使用填充规则进行验证。

更喜欢 OAEP,因为 RSASSA-PKCS1-v1_5 难以正确实施,并且这些不正确的实施在一年中引起了许多攻击,尽管这已被证明是安全的。


让我们以康奈尔大学页面结束所有内容;

于 2021-05-25T17:55:09.243 回答