关于rsa:加密和签名非对称加密有什么区别?

What is the difference between encrypting and signing in asymmetric encryption?

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

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

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

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


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

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

I want to use my private key to generate messages so only I can possibly be the sender.

I want my public key to be used to read the messages and I do not care who reads them

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

I want to be able to encrypt certain information and use it as a product-key for my software.

I only care that I am the only one who can generate these.

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

但是,如果你想让人们知道这些密钥实际上是你的,你需要生成随机数据,在其中保存一个数据库,然后用你的密钥签名。

I would like to include my public key in my software to decrypt/read the signature of the key

您可能需要从像Verisign或Thawte这样的商业供应商那里购买您的公钥证书,这样人们就可以检查是否没有人伪造您的软件,并用他们的公钥替换您的公钥。


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

所以,很容易看到如何用接收者的公钥加密消息,这样接收者就可以用他们的私钥解密消息。

签名是签名者拥有与某个公钥匹配的私钥的证明。要做到这一点,只需使用发送者的私钥加密消息,并将加密版本与纯文本版本一起包含。要验证发送者,请解密加密版本,并检查它是否与明文相同。

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

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

所以:

  • 要生成签名,请从纯文本中创建一个哈希,用您的私钥加密它,并将它与纯文本一起包含。
  • 要验证签名,请从明文中创建哈希,使用发送者的公钥解密签名,检查两个哈希是否相同。


是的,把签署数据看作是给你自己的蜡章,其他人都没有。这样做是为了实现完整性和不可抵赖性。加密使其他人看不到数据。这样做是为了达到保密性。参见维基百科http://en.wikipedia.org/wiki/information安全关键概念

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


签名正在用您的私钥生成一个"哈希",可以用您的公钥验证它。文本以明文发送。

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

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


在建立一个安全的通信中,有两个明显但密切相关的问题

  • 加密数据,以便只有授权人员才能解密和读取数据。
  • 验证发送者的身份/验证。
  • 这两个问题都可以通过公钥密码技术优雅地解决。

    一、数据的加密和解密

    爱丽丝想给鲍勃发一封信,没人能读。

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

    Note that if A wants to send a message to B, A needs to use the Public
    key of B (which is publicly available to anyone) and neither public
    nor private key of A comes into picture here.

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

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

    爱丽丝想再给鲍勃发个信。利用上述方法解决了数据加密问题。

    但如果我坐在爱丽丝和鲍勃之间,把自己介绍成"爱丽丝"给鲍勃,把我自己的信息发送给鲍勃,而不是转发爱丽丝发送的信息,那该怎么办呢?即使我无法解密和阅读爱丽丝发送的原始信息(这需要访问鲍勃的私钥),我还是劫持了他们之间的整个对话。

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

    • 艾丽斯用她的私人钥匙在电文上签名,然后把它寄过来。(实际上,签名是消息的散列,例如sha-256或sha-512。)
    • Bob接收并使用Alice的公钥验证它。由于Alice的公钥成功地验证了消息,Bob可以断定消息已经由Alice签名。


    签名表示您确实是已签名对象的源或凭证。不过,每个人都能读到这个物体。

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


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


    在您的场景中,您不使用非对称加密的含义进行加密;我宁愿称之为"编码"。

    因此,您将数据编码成某种二进制表示,然后用您的私钥签名。如果您无法通过公钥验证签名,那么您知道签名数据不是用您的私钥生成的。("验证"意味着未签名的数据没有意义)


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

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

    至于所使用的算法:这将调用素数。我会在谷歌上搜索更好的解释。


    What is the difference between encrypting some data vs signing some data (using RSA)?

    加密保护了消息("某些数据")的机密性,而签名提供了不可抵赖性:即只有签署它的实体才能签署它。还有功能上的差异;继续读。

    Does it simply reverse the role of the public-private keys?

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

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

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

    For example, I want to use my private key to generate messages so only I can possibly be the sender.

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

    I want my public key to be used to read the messages and I do not care who reads them.

    公钥应该被所有人都知道。如果你想让每个人都阅读这些信息,那么你就不必加密它们。

    签名通常不会影响消息的内容。该消息被认为是独立于签名的。官方称这种签名为"带附录的签名",其中附录是信息。这是一个有点奇怪的名字,因为消息被认为比它上面的签名更重要,但是是的。只有少数签名提供(部分)消息恢复;它们不再被大量使用,通常被视为已弃用。

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

    I want to be able to encrypt certain information and use it as a product-key for my software. I only care that I am the only one who can generate these.

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

    I would like to include my public key in my software to decrypt/read the signature of the key. I do not care who can read the data in the key, I only care that I am the only verifiable one who can generate them.

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

    例如,有Microsoft验证码。IStore和Android应用程序商店等应用程序商店可能会或可能不会使用代码签名,但它们提供了一些保证,即您的应用程序没有被克隆,或者至少没有在商店内被克隆。密码术终究不是解决办法。

    完全避免代码被克隆/修改要困难得多,如果你这样做的话,你就可以在DRM领域稳扎稳打了。

    Is signing useful in this scenario?

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


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

  • 没有第三方可以通过反编译应用程序生成许可证密钥。
  • 软件密钥的内容不需要安全
  • 软件密钥不可读
  • 数字签名将解决这个问题,因为原始数据使密钥可以用一个私人密钥签名,这使它不可读,但如果反向工程,可以解码。但是私钥是安全的,这意味着没有人能够为您的软件制作许可证(这就是重点)。

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

    Pythonpynacl文档中有一个"数字签名"的示例,它将符合目的。http://pynacl.readthedocs.org/en/latest/signing/

    以及导致氯化钠项目C的例子