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


295

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

它是否只是改变了公私钥的作用?

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

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

Answers:


439

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

签名时,您可以使用私钥来写消息的签名,然后他们可以使用公钥来检查消息是否真的是您的。

我想使用我的私钥生成消息,因此只有我可以成为发件人。

我希望使用我的公共密钥来阅读邮件,而且我不在乎谁会阅读邮件

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

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

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

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

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

我想将我的公共密钥包含在软件中,以解密/读取密钥的签名。

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


7
从技术上讲,当您说使用私钥来编写消息的签名时,是指使用我的私钥对消息的哈希进行加密了吗?
安迪·伊瓦涅斯

4
@AndyIbanez:加密的内容(摘要)还可能包含时间戳和一些随机的盐,但是是的,这就是要点。
Quassnoi

7
@Quassnoi实际上,当我们说“使用私钥签名”时,它的意思不是“加密”,而是“解密”。大致来说,签名消息与使用私钥解密和在接收者中使用公钥加密相同,这样哈希将变得相同并且可以进行比较。
约翰尼·威勒

5
@JohnnyWiller:如下@slim所述,加密和解密功能的数学核心相同。它们不是单独的功能,而是相同的功能f(key, message),例如f(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi

2
@Honey不,不是。生成密钥对是免费的。要使其他人相信签名确实是您的,就要付出代价。为此,您需要拥有自己的公共密钥,该公共密钥是您先前免费生成的,并由可能会或可能不会向您收取费用的授权机构签名。
Quassnoi

143

在RSA加密中,当您生成密钥对时,选择哪个作为公钥,哪个作为私钥是完全任意的。如果使用一个进行加密,则可以使用另一个进行解密-它可以双向执行。

因此,非常简单地了解如何使用接收者的公钥加密消息,以便接收者可以使用其私钥解密消息。

签名可以证明签名者具有与某些公钥匹配的私钥。为此,只需使用该发件人的私钥加密邮件即可,并在明文版本旁边包含加密版本即可。要验证发送者,请解密加密版本,并检查其是否与纯文本相同。

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

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

所以:

  • 要生成签名,请从纯文本中进行哈希处理,然后使用私钥对其进行加密,然后将其包括在纯文本中。
  • 要验证签名,请从纯文本中进行哈希处理,然后使用发送者的公钥对签名进行解密,并检查两个哈希是否相同。

8
@headcode 适用于非对称密钥。对称密钥不是成对出现的。
2015年

3
实际上,它仅适用于RSA密钥。例如,使用ECDSA密钥,您可以从私钥简单地生成公钥,私钥是标量,而公钥是坐标。
David Schwartz

5
如何使用PUBLIC密钥解密消息?消息不是仅使用私钥解密吗?
daremkd '16

3
5个源矛盾此答案12345
wha7ever

6
您称其为公开和私有并不是任意的。您可以从私钥中生成公钥,但是不能从公钥中生成私钥。那不是很大的不同吗?
格雷格·施密特

23

建立安全通信存在两个明显但密切相关的问题

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

使用公钥密码术可以很好地解决这两个问题。

一,数据加密解密

爱丽丝想向鲍勃发送一条消息,任何人都无法阅读。

  • 爱丽丝用鲍勃的公钥加密消息并发送出去。
  • 鲍勃接收到该消息,并使用其私钥对其进行解密。

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

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

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

爱丽丝想再次向鲍勃发送一条消息。使用以上方法解决了加密数据的问题。

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

鲍勃有没有办法确认他收到的消息实际上是爱丽丝发送的?

  • 爱丽丝用她的私钥在消息上签名并将其发送出去。(实际上,签名的是消息的哈希,例如SHA-256或SHA-512。)
  • 鲍勃收到它并使用爱丽丝的公钥对其进行验证。由于Alice的公钥成功验证了该消息,因此Bob可以得出结论,该消息已由Alice签名。

1
因此,当您在邮件上签名时,您是在签名实际邮件本身还是在加密邮件上签名?
FrostyStraw


16

签名会产生带有您的私钥的“哈希”,可以使用您的公钥进行验证。文本以明文形式发送。

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

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


在普通的非对称加密中,加密是使用收件人的公钥而不是您的私钥完成的。
mmcdole

您是否错过了这个问题,特别是关于RSA的问题,在RSA中,密钥的使用颠倒了,并且不会损害私钥。
David Schwartz

8

您正在准确描述公开密钥加密中如何以及为什么使用签名。请注意,签名(或加密)他人提供的空消息是非常危险的-这可能会攻击可能危害您密钥的算法。


1
使用SSL时,网络浏览器不加密任意数据吗?
伊恩·沃伯顿

2
@IanWarburton:但是他们没有为此使用非对称加密。实际的数据传输使用带有随机生成的会话密钥的对称加密。
Michael Borgwardt

1
@IanWarburton:不,因为攻击者都不会选择两者。危险在于对攻击者直接提供的内容进行加密或签名,因为这样做可以非常故意地泄露有关您的私钥的信息,甚至创建对您不打算签名的内容有效的签名。后者情况下如何工作的RSA细目这里:crypto.stackexchange.com/questions/35644/...
迈克尔博格瓦特

2
@IanWarburton:这就是RSA需要填充的原因,因此您永远不会只加密选定的消息:en.wikipedia.org/wiki/…-但这实际上是涉及私钥(如签名)的操作特别容易受到所选输入的攻击。
Michael Borgwardt

1
@IanWarburton我不是密码专家,但是据我了解,这不会造成任何问题。
Michael Borgwardt

8

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

加密意味着只有具有相应私钥的人才能读取它,但不签名就不能保证您位于加密对象的后面。


如果邮件被我的公共密钥解密,那么只有我可以发送它。(假设我的私钥没有受到破坏)
Dojo

5

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

加密可保护消息(“某些数据”)的机密性,而签名则提供不可否认性:即只有签名的实体才可以签名。功能上也有差异。继续阅读。

它是否只是改变了公私钥的作用?

绝对不。禁止使用相同的私钥来进行签名和解密(或者同样地,使用相同的公钥进行验证和加密),因为您不应混淆用途。这不是一个数学上的问题(RSA应该仍然是安全的),而是密钥管理的问题,例如,签名密钥在使用前应具有较短的生存期并包含更多保护。

对于同一封邮件,应使用发件人专用密钥进行签名,并使用收件人受信任的公用密钥进行加密。通常使用签名,然后加密,否则对手可以用自己的签名代替签名。同样,您应该使用接收者的私钥进行解密,并使用发送者的受信任公钥进行验证。

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

例如,我想使用我的私钥来生成消息,以便只有我才能成为发件人。

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

我希望使用我的公共密钥来阅读消息,而我不在乎是谁阅读它们。

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

签名通常不会影响消息的内容。该消息被认为与签名分开。此类签名正式被称为“带有附录的签名”,其中附录是消息。名称有点怪异,因为该消息比其上的签名更重要,但是,是的。只有很少的签名提供(部分)消息恢复;它们已不再使用,通常被认为已弃用。

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

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

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

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

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

例如,有Microsoft Authenticode。诸如iStore和Android应用商店之类的应用商店可能会或可能不会使用代码签名,但是它们可以确保您的应用未在商店中克隆或至少未克隆。毕竟,密码学并不总是解决方案。

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

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

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


“在过去,RSA签名生成通常被认为是“使用私钥加密”。但是,如上所述,操作有很大不同,后来的标准拼命尝试将加密和签名生成分开。-我不清楚。KeyPair可以是pk或sk,一个可以加密,另一个可以解密。如果我们对此表示同意,那么我们怎么能说签名和加密在任何有意义的方式上是不同的呢?既加密又只能用另一个密钥解密。我看过对签名函数的引用,这相关吗?
摩根

我在签名功能中唯一了解的区别是加密之前消息的哈希。
摩根

4

在您的方案中,您不会按照非对称加密的含义进行加密;我宁愿称其为“编码”。

因此,您可以将数据编码为某种二进制表示形式,然后使用私钥进行签名。如果您无法通过公共密钥验证签名,那么您将知道签名数据不是使用私有密钥生成的。(“验证”表示未签名的数据没有意义)


2

从功能上讲,您使用公用/专用密钥加密来确保只有收件人可以阅读您的消息。使用接收者的公钥对消息进行加密,然后解密使用的私钥。

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

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

搜索“ Bob”,“ Alice”和“ Mallory”以在互联网上找到介绍文章。


您可以评论我的用例吗?我想使用私钥进行加密,并使用公钥来允许任何人和所有人解密。
mmcdole

1
并非所有非对称加密都是基于质数的,这只是最著名的示例(RSA);还有其他方法,例如椭圆曲线密码学。
Michael Borgwardt

“先对消息进行加密,然后再使用接收者的公共密钥对其进行加密。” 该句子毫无意义,或者至少需要进一步解释。“先加密再加密” ???
马滕·博德威斯

你忘了特伦特!:)
Dojo

1

在提问者打算使用该解决方案进行软件许可的内容中回答此问题,要求是:

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

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

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

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

并导致将NaCl项目转换为C示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.