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

问题描述 投票:223回答:11

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

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

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

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

encryption rsa signing license-key
11个回答
358
投票

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

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

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

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

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

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

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

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

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

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

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


2
投票

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

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

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

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

对于同一消息,您应使用发件人私钥进行签名,并使用接收者信任的公钥进行加密。通常使用sign-then-encrypt,否则攻击者可以用自己的签名替换签名。同样,您应该使用接收方的私钥进行解密,并使用发送方的可信公钥进行验证。

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

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

那是不可否认的财产,可以通过签署来实现。

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

所有人都应该知道公钥。如果您希望每个人都阅读邮件,那么您根本就不加密它们。

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

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

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

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

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

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

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

保持代码不被克隆/更改是非常困难的,如果你这样做,你就会坚定地处于DRM领域。

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

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


1
投票

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

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

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

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

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

并且导致NaCl项目到C的例子


104
投票

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

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

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

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

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

所以:

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

19
投票

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

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


15
投票

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

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

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


10
投票

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

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

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

I.数据的加密和解密

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

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

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

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

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

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

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

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

  • Alice用她的私钥对消息进行签名并将其发送出去。 (实际上,签名的是消息的散列,例如SHA-256或SHA-512。)
  • Bob收到它并使用Alice的公钥对其进行验证。由于Alice的公钥成功验证了该消息,因此Bob可以断定该消息已由Alice签名。

8
投票

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

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


6
投票

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


3
投票

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

因此,您将数据编码为一些二进制表示,然后使用您的私钥进行签名。如果您无法通过公钥验证签名,则表示您的私钥不会生成签名数据。 (“验证”表示无符号数据无意义)


2
投票

在功能上,您使用公钥/私钥加密来确保只有接收者才能读取您的消息。消息被加密,然后使用接收器的公钥加密。

签名用于让接收者知道您创建了消息,并且在传输过程中没有更改。使用您自己的私钥完成邮件签名。

至于使用的算法:这个involes素数。我会在谷歌搜索更好的解释。

© www.soinside.com 2019 - 2024. All rights reserved.