19

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

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

4

9 回答 9

72

只是为了澄清一点:

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

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

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

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


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

于 2009-07-27T17:59:32.617 回答
19

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

原来的:

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

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

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

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

于 2012-05-28T03:36:28.173 回答
6

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

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

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

于 2009-07-25T12:51:33.640 回答
5

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

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

于 2009-07-25T07:05:43.950 回答
3

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

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

于 2009-07-25T07:02:41.603 回答
1

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

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

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

于 2015-09-21T13:26:25.753 回答
1

这就是我所理解的 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
于 2019-07-10T04:40:38.583 回答
0

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

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

于 2015-03-18T11:53:37.340 回答
-1

公钥密码系统的安全性依赖于这样一个事实:sign()/encrypt() 函数是一种单向函数,因为在没有公钥“陷阱门”的情况下解密它需要不可行的时间。

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

于 2009-07-25T07:11:57.573 回答