【问题标题】:Is it possible to encrypt with private key using .net RSACryptoServiceProvider?是否可以使用.net RSACryptoServiceProvider 使用私钥加密?
【发布时间】:2010-11-13 23:07:35
【问题描述】:

我知道 RSACryptoServiceProvider 可以用公钥加密,然后可以用私钥解密。

是否可以使用 RSACryptoServiceProvider 使用私钥加密并使用公钥解密?

【问题讨论】:

  • “使用私钥加密” 不是有效的加密操作。如果您尝试执行该操作,通常需要 Signature Scheme with Recovery

标签: .net cryptography rsa


【解决方案1】:

只是为了澄清一点:

RSA 可用于加密(确保 Eve 无法读取 Alice 发送给 Bob 的消息)或签名(确保如果 Alice 向 Bob 发送消息,Bob 知道发送消息的实际上是 Alice,并且不是夏娃假装爱丽丝)

RSA 生成一对密钥——一个公钥和一个私钥。 RSA 的设计目的是,如果您应用公钥然后应用私钥,反之亦然,您将收到相同的消息。而公钥可以从私钥推导出来,反之则不行。

为了使用 RSA 进行加密,Alice 使用 Bob 的公钥加密消息。阅读此消息的唯一方法是使用 Bob 的私钥,该私钥只有他拥有。因此 Eve 无法阅读该消息,因为他没有这把钥匙。另一方面,这不提供消息来源的身份验证。 Eve 还可以获取 Bob 的公钥(因为它是公开的)并向 Bob 发送消息,伪装成 Alice。

为了使用 RSA 进行签名,Alice 获取消息的散列,使用她自己的私钥加密散列,并将结果(这是签名)附加到消息中。当然,Eve 仍然可以使用 Alice 的公钥对其进行解密。但是,Bob 可以使用 Alice 的公钥解密签名并查看它是否匹配。如果是这样,它一定是使用 Alice 的私钥加密的,只有她拥有,所以它一定来自 Alice。


现在,我不熟悉 .NET 加密 API,所以我不确定它是否完全按照此处描述的方式工作。但是这个解释可能会帮助你理解你得到的一些答案。

【讨论】:

  • “应用公钥然后应用私钥,反之亦然”是什么意思?这里的“申请”是什么意思?
  • 如果 Alice 加密消息本身而不是哈希值会怎样?这不是更简单,还是存在安全漏洞?我说的当然是签名,而不是加密。
  • Nitpick -- RSA 不保证公钥不能从私钥派生。事实上,这通常是微不足道的。 See this answer.
  • @MaciejKrawczyk alice 用她的私钥签名。如果她签署了消息而不是消息的哈希值,那么 Eve 将能够使用公钥解密签名,从而获得消息
【解决方案2】:

编辑:我应该先说特定的 .NET RSACyrptoServiceProvider 可能不支持这个答案,因为货物崇拜“知识”认为这是不可能的,或者更务实的知识认为这很少有用练习。

原文:

每个声称没有这种东西的人要么不知道 RSA 是如何工作的,要么他们陷入了“签名”的困境。

用私钥加密是完全可能的,而且完全有意义。是的,这类似于签名,但这根本不是大多数现代图书馆所认为的签名。对他们来说,这意味着计算消息摘要或 HMAC,并使用私钥进行加密。将使用私钥加密比作签名,就像说将文档放在保险箱中并把密钥留在身边一样,是对文档进行签名的替身。

是的,它正在加密,因为它的操作相同。私钥加密的密文与公钥加密的密文一样难以辨认;需要两个密钥来解密密文。

有关 RSA 算法的参考,请参阅 http://fringe.davesource.com/Fringe/Crypt/RSA/Algorithm.html

【讨论】:

  • 我觉得这个答案很有趣......我不确定我是否会不同意密码学家和数学家的学术团体。
  • “是的,它正在加密,因为它的操作相同” 不,它没有加密,因为它不是相同的操作。模幂相同,但填充部分不同。没有通用库提供使用私钥的加密。我认为您正在做您指责他人的事情,这将签名与加密混淆了。
  • “使用私钥加密” 不是有效的加密操作。一个用公钥加密,用私钥解密。回到[未引用]论文并再次阅读定义。签名将被描述为类似于“将消息视为密文实例并执行解密操作[使用私钥]”。当人们想要“使用私钥加密”时,他们通常指的是“具有恢复功能的签名方案”
  • @blowdart 得到了正确的答案,但 Stack Overflow 的人群并不明智。他们拒绝了放在银盘上交给他们的正确答案......这就是像 Stack Overflow 这样的开发人员 2developer 答案网站上发生的情况。
  • 您可能想阅读 Bernstein 的 RSA signatures and Rabin–Williams signatures:the state of the art。它非常平易近人,并提供了 RSA 的背景信息和历史,包括攻击和对策。
【解决方案3】:

使用私钥执行原始 RSA 操作通常称为解密操作(就像使用公钥执行它称为加密操作一样)。

访问此操作很有用 - 例如实现框架不支持的操作。

操作存在:它是DecryptValue-方法,由RSACryptoServiceProvider的基类定义:System.Security.Cryptography.RSA。不幸的是,RSACryptoServiceProvider 不支持它(因为底层的 win32-api CryptoAPI 不支持它)。但是,如果您能获得 RSA 类的另一个 .NET 实现,您将能够做到。

【讨论】:

    【解决方案4】:

    幸好没有。但是,您可以使用私钥签名并使用公钥验证签名。

    虽然当密钥角色颠倒时数学涉及到(这就是签名的工作方式)是有意义的,但当解密密钥众所周知且公开时,为了隐私而加密就没有多大意义了。

    【讨论】:

    • 那么当数学被反转时,反函数将需要更长的时间才能完成,这是一个不可行的长时间。
    • 通过“反转数学”我的意思是数学并不关心算法中的 e 和 d 是否被交换。这就是签名的作用:使用私钥(私有指数“d”)加密消息哈希摘要。显然我并不是说计算方向可以颠倒。
    【解决方案5】:

    没有。这不是任何公钥/私钥加密的工作方式。只能用公钥加密,只能用私钥解密。

    如果您想将私钥应用于消息,也许您正在寻找signature,而不是加密?这是一种不同的加密方案,也可以使用 RSA 密钥。

    【讨论】:

    • 谢谢!我想做序列号来保护我的软件,如果RSA不能用私钥加密,怎么办?
    • 其实用私钥加密是有它的用处的。您可以加密和发布某些内容,“公共”可以使用您的 public 密钥解密消息,因此知道加密文件来自您。它用作签名/身份验证的基本形式。旧的基于 dos 的 PGP 允许这样做。
    • 克雷格你在谈论签名,这是完全不同的事情。签名不是加密(尽管它是密码学)。即使这样,也只能使用私钥生成签名,但要使用公钥进行检查。
    • 澄清一下,如果您使用的是 RSA,从数学上讲,是的,您可以使用您的私钥进行加密,而私钥只能由公钥解密。但是,就工作流程而言,这样做通常并没有多大意义(除非在特定用例中作为创建数字签名的一部分)。
    • @davidhood2 不,这个答案是正确的。当然可以使用私钥应用 RSA 求幂,但是您所做的不是加密。
    【解决方案6】:

    两者都可以;用私有加密和用公共解密,或者,用公共加密和用私有解密。你不能只用私钥加密然后解密,你也不能单独用公钥做同样的事情。

    莱姆斯成功了;当解密密钥众所周知且公开时,使用私钥加密没有多大意义。

    此外,您可以从私钥派生公钥,但反之则不行。

    【讨论】:

    • 我觉得这个答案也很有趣......我不确定我是否会不同意密码学家和数学家的学术团体。
    • 是的,即使我想知道在应该知道公钥时使用私钥加密的意义。除非,它的公钥(即使)名为“public”;并没有真正向所有人公开,而只是向相关方公开。
    【解决方案7】:

    这就是我理解的 RSA 签名。

    伪代码:

    首先 Alice 做了一个签名:

    alice_signature = encrypt(alice_message, alice_private_key)
    

    然后 Bob Eve...(任何拥有alice_public_key 的人)验证签名:

    decrypted_message = decrypt(alice_signature, alice_public_key)
    

    确认:

    if(received_message_from_alice == decrypted_message)
      the signature proved the message is from alice
    

    【讨论】:

      【解决方案8】:

      您可以使用 PrivateKey 进行加密和解密。 PrivateKey 实际上包含 Private 和 PublicKey。

      理论上,至少您可以使用 PublicKey 加密并使用 PrivateKey 解密,反之亦然。在 VB.net 中,我看到第一种情况有效,第二种情况抛出 BadKey 错误

      【讨论】:

      • 我必须使用 PrivateKey 加密并使用 PublicKey 解密。经过一天的失败尝试后,我了解到RSACryptoServiceProvider.Encrypt 始终使用 PublicKey,即使 RSACryptoServiceProvider 对象是从 PrivateKey 创建的。另一方面,我不能使用Sign,因为它需要哈希算法,但我想加密没有哈希的数据。换句话说,问题出在 .Net 实现中。
      【解决方案9】:

      公钥密码系统的安全性在于 sign()/encrypt() 函数是 one-way function,因为在没有公钥“陷阱门”的情况下解密它需要很长时间。 .

      此外,通常生成的密钥长度不同,尽管它们可能相同。有很多关于 RSA 的非对称密钥长度的论文。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 2023-03-24
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多