是否可以使用.net RSACryptoServiceProvider使用私钥加密?

时间:2009-07-25 06:51:48

标签: .net cryptography rsa

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

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

9 个答案:

答案 0 :(得分:56)

只是为了清理一下:

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,所以我不确定它是否与此处描述的完全相同。但是这个解释可能会帮助你理解你得到的一些答案。

答案 1 :(得分:18)

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

ORIGINAL:

每个人都声称没有这样的东西,或者不知道RSA是如何运作的,或者他们被困在“签约”的车辙中。

使用私钥加密是完全可能的,也是完全合理的。是的,这与签名相似,但这并不是大多数现代图书馆所采用的签名方式。对他们而言,这意味着计算消息摘要或HMAC,并使用私钥加密。使用私钥进行签名的加密加密与将文档粘贴在保险箱中并将密钥留在周围的说法一样有意义,这是签署文档的替代方法。

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

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:5)

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

虽然当关键角色被颠倒时(包括签名的工作方式)数学涉及是有意义的,但是当解密密钥是公知的并且是公开的时,加密隐私并没有多大意义。

答案 4 :(得分:1)

你可以做到这两点;使用public进行私有和decypt加密,OR,使用public进行加密,使用private进行解密。你不能加密,然后只用私钥解密,也不能单独使用公钥。

雷蒙斯钉了它;当解密密钥充分了解并公开时,用私钥加密并没有多大意义。

此外,您可以从私钥派生公钥,但反之亦然。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

您可以使用PrivateKey加密和解密。 PrivateKey infact包含Private和PublicKey。

理论上至少你可以用PublicKey加密并用PrivateKey解密,反之亦然。在VB.net中,我看到第一个案例工作,第二个案例抛出BadKey错误

答案 7 :(得分:0)

这是我理解的RSA签名。

伪代码:

第一位爱丽丝签名:

%%FONTLAB NAMETABLE: Database Name
0x0020 !visiblespace
0x0020 space
0x0021 exclam
0x0022 quotedbl
0x0023 numbersign
0x0024 dollar

然后Bob Eve ...(拥有alice_signature = encrypt(alice_message, alice_private_key) 的任何人)验证签名:

alice_public_key

确认:

decrypted_message = decrypt(alice_signature, alice_public_key)

答案 8 :(得分:-1)

公钥密码系统的安全性取决于sign()/ encrypt()函数是one-way function这一事实,因为如果没有公钥“陷阱 - 它将需要不可行的时间来解密它门”。

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