我知道RSACryptoServiceProvider可以使用公钥加密,然后可以使用私钥解密。
是否可以使用私钥加密并使用RSACryptoServiceProvider使用公钥解密?
不,这不是任何公钥/私钥加密的工作方式。您只能使用公钥进行加密,并且只能使用私钥进行解密。
如果您想将私钥应用于邮件,也许您正在寻找signature而不是加密?这是一种不同的加密方案,也可以使用RSA密钥。
只是为了清理一下:
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的公钥解密签名,看看它是否匹配。如果是这样,它必须使用Alice的私钥加密,只有她拥有,所以它必须来自Alice。
现在,我不熟悉.NET加密API,所以我不确定它是否与此处描述的完全一致。但是这个解释可能会帮助您理解您获得的一些答案。
编辑:我应该在这个答案前面说,具体的.NET RSACyrptoServiceProvider
可能不会支持这一点,因为货物崇拜“知识”这是不可能的或更实用的知识,这在实践中很少有用。
原版的:
每个人都声称没有这样的东西,或者不知道RSA是如何工作的,或者他们被困在“签约”的车辙中。
用私钥加密是完全可能的,也是完全合理的。是的,这与签名相似,但这并不是大多数现代图书馆所采用的签名方式。对他们而言,这意味着计算消息摘要或HMAC,并使用私钥加密。使用私钥进行签名的加密加密与将文档粘贴在保险箱中并将密钥留在周围的说法一样有意义,这是签署文档的替代方法。
是的,它是加密的,因为它的操作相同。私钥加密密文与公钥加密密文一样难以辨认;一个人需要两个密钥才能解密密文。
有关RSA算法的参考,请参阅http://fringe.davesource.com/Fringe/Crypt/RSA/Algorithm.html。
使用私钥执行原始RSA操作通常称为解密操作(正如使用公钥执行它称为加密操作)。
访问此操作很有用 - 例如,实现框架不支持的操作。
操作存在:它是DecryptValue方法,由RSACryptoServiceProvider的基类:System.Security.Cryptography.RSA定义。不幸的是,RSACryptoServiceProvider不支持它(因为底层的win32-api,CryptoAPI不支持它)。但是,如果您可以获得RSA类的另一个.NET实现,那么您将能够执行此操作。
幸运的是没有。但是,您可以使用私钥进行签名,并使用公钥验证签名。
虽然数学涉及到关键角色被颠倒时是有意义的(这就是签名的工作方式),但当解密密钥是众所周知和公开时,加密隐私并没有多大意义。
你可以两个都做;使用public进行私有和decypt加密,OR,使用public进行加密,使用private进行解密。您不能加密,然后只用私钥解密,也不能单独使用公钥。
雷木思钉了它;当解密密钥是公知的并且公开时,用私钥加密没有多大意义。
此外,您可以从私钥派生公钥,但反之亦然。
您可以使用私钥加密和解密。 PrivateKey实际上包含Private和PublicKey。
从理论上讲,至少你可以用PublicKey加密并用PrivateKey解密,反之亦然。在VB.net中,我看到第一个案例工作,第二个案例抛出BadKey错误
这就是我理解的RSA签名。
伪代码:
第一个爱丽丝签名:
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
公钥密码系统的安全性取决于sign()/ encrypt()函数是one-way function的事实,因为在没有公钥“陷阱门”的情况下解密它需要不可行的时间。
此外,通常生成的密钥长度不同,尽管它们可能是。关于RSA的非对称密钥长度有很多论文。