加密和签名非对称加密有什么区别?

mmc*_*ole 252 encryption signing rsa license-key

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

它是否简单地颠倒了公钥 - 私钥的作用?

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

在这种情况下签名是否有用?

Qua*_*noi 389

加密时,您使用他们的公钥来写消息,他们使用他们的私钥来读取它.

签名时,您使用私钥来编写邮件的签名,并使用您的公钥来检查它是否真的属于您.

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

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

这是签名,它是使用您的私钥完成的.

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

我只关心我是唯一能够产生这些的人.

如果你只需要自己知道,你不需要乱用键来做到这一点.您可以只生成随机数据并将其保存在数据库中.

但是,如果您希望人们知道密钥确实是您的,那么您需要生成随机数据,并在其中保存数据库并使用密钥对其进行签名.

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

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

  • 从技术上讲,当你说私钥用于编写邮件的签名时,你是说用我的私钥加密了邮件的哈希值? (6认同)
  • @Quassnoi事实上,当我们说'用私钥签名'时,它意味着不是'加密',而是意味着'解密'.签名消息粗略地说与使用私钥解密相同,并且在接收器中使用公钥加密,这样散列将变得相同并且可以进行比较. (5认同)
  • @AndyIbanez:加密的内容(*digest*)也可能包含时间戳和一些随机盐,但是,这就是它的要点. (3认同)
  • @JohnnyWiller:正如@slim在下面提到的,加密和解密函数的数学核心是相同的.它们不是单独的函数,它们是相同的函数`f(key,message)`,这样`f(private,f(public,message))=== f(public,f(private,message))== =消息` (3认同)
  • 最后一段提到使用证书颁发机构来检查应用程序中嵌入的密钥的完整性,只有当应用程序基于 Web 时才有意义,因为所有主要证书颁发机构的公钥都嵌入在浏览器中。在网络浏览器之外(例如在下载的应用程序中),依赖证书颁发机构是没有意义的,因为您将拥有相同的 pb 来验证这些公钥是否也没有被欺诈性的密钥替换。回到原点... (2认同)
  • @亲爱的,不,不是。生成密钥对是免费的。要让其他人相信签名确实是你的,就要付出代价。为此,您需要拥有自己的公钥,该公钥是您之前免费生成的,并由可能会或可能不会向您收取费用的机构签名。 (2认同)

sli*_*lim 113

在RSA加密中,当您生成密钥对时,您选择哪一个是公钥,哪个是私钥完全是任意的.如果你用一个加密,你可以用另一个解密 - 它可以在两个方向上工作.

因此,看到如何使用接收方的公钥加密消息非常简单,以便接收方可以使用其私钥对其进行解密.

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

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

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

所以:

  • 要生成签名,请从明文创建哈希,使用您的私钥加密,将其包含在明文旁边.
  • 要验证签名,请从明文创建哈希,使用发件人的公钥解密签名,检查两个哈希值是否相同.

  • @headcode it*only*适用于非对称密钥.对称键不成对出现. (7认同)
  • 与此答案相矛盾的 5 个来源 [1](/sf/ask/549342041/ #comment-70017023)、[2](https://www.gnupg.org/gph/en/manual/x135.html)、[3](https://security.stackexchange.com/questions/9260/sha -rsa-and-the-relation-between-them#answer-9265), [4](https://security.stackexchange.com/questions/68822/trying-to-understand-rsa-and-its-terminology/ 68836#answer-68836), [5](https://cs.stackexchange.com/questions/59675/can-a-public-key-be-used-to-decrypt-a-message-encrypted-by-the -对应-pri) (5认同)
  • 您称其为公开和私有并不是任意的。您可以从私钥中生成公钥,但不能从公钥中生成私钥。这不是很大的不同吗? (5认同)
  • 如何使用PUBLIC密钥解密消息?消息不是仅使用私钥解密吗? (3认同)
  • 实际上,它仅适用于RSA密钥。例如,使用ECDSA密钥,您可以从私钥简单地生成公钥,私钥是标量,而公钥是坐标。 (2认同)
  • @daremkd这取决于您使用哪种加密方案。如果是RSA,则可以使用其中一个进行加密,也可以使用另一个进行解密。 (2认同)

Joh*_*lan 20

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

签名是使用您的私钥签名的邮件的哈希值.


Dou*_*rie 16

签名正在使用您的私钥生成"哈希",可以使用您的公钥进行验证.文本以明文形式发送.

加密使用接收者的公钥来加密数据; 解码是用他们的私钥完成的.

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


Siv*_*ash 16

在建立安全通信方面存在两个截然不同但密切相关的问题

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

使用公钥加密可以优雅地解决这两个问题.

I.数据的加密和解密

Alice希望向Bob发送一条消息,没有人能够阅读.

  • Alice用消息加密消息__CODE__并将其发送出去
  • Bob接收消息并使用他的消息对其进行解密 __CODE__

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

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

II.验证发件人的身份(身份验证)

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

但是,如果我坐在爱丽丝和鲍勃之间,将自己介绍给鲍勃并将自己的消息发送给鲍勃,而不是转发爱丽丝发送的消息,那么该怎么办?即使我无法解密和读取Alice发送的原始消息(需要访问Bob的私钥),我正在劫持他们之间的整个对话.

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

  • Alice用__CODE__(Alice的私钥)签署消息并将其发送出去
  • Bob收到它并使用解密__CODE__.由于Alice的公钥成功解密了该消息,因此Bob可以断定该消息已使用Alice签名

实际上,上述两种方法一起使用以及某种形式的散列(SHA,MD5)来实现加密和真实性.

  • 因此,当您签署消息时,您是签署实际消息本身还是加密消息? (2认同)
  • @FrostyStraw 您通常会对从消息创建的哈希进行签名,通常称为消息摘要(MD)。请参阅 sivaprakash 答案的“...在实践中,签名的内容”部分 (2认同)
  • @AyoubBoumzebra 任何有权访问 Alice 公钥的人都只能确认该消息是否来自 Alice。他们无法读取该消息,因为 Alice 使用 Bob 的公钥加密了该消息,因此只有 Bob 可以使用他的私钥解密该消息并成功读取它。 (2认同)

rja*_*lor 8

签名表示您确实是签名对象的来源或证实.但是,每个人都可以阅读该对象.

加密意味着只有具有相应私钥的人才能读取它,但没有签名就不能保证你是加密对象的后面.


Ger*_*and 7

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

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

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

在 Internet 上搜索“Bob”、“Alice”和“Mallory”以查找介绍文章。


Mic*_*rdt 7

您正在准确描述在公钥加密中使用签名的方式和原因.请注意,签署(或加密)其他人提供的aritrary消息非常危险 - 这样可以攻击可能危及您密钥的算法.

  • @IanWarburton:但他们不使用非对称加密。实际的数据传输使用带有随机生成的会话密钥的对称加密。 (2认同)
  • @IanWarburton:这就是 RSA 需要填充的原因,因此您永远不会只加密选定的消息:https://en.wikipedia.org/wiki/RSA_(cryptosystem)#Attacks_against_plain_RSA - 但这实际上是涉及私钥的操作(例如签名) )特别容易受到所选输入的影响。 (2认同)

Maa*_*wes 6

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

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

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

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

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

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

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

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

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

公钥应该被认为是所有人都知道的。如果您希望每个人都阅读这些消息,那么您只需不要对它们进行加密。

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

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

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

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

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

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

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

从被克隆/改变保持你的代码在所有的要困难得多,而你会是结结实实的DRM领土,如果你走那条路。

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

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