我知道 RSACryptoServiceProvider 可以用公钥加密,然后可以用私钥解密。
是否可以使用 RSACryptoServiceProvider 使用私钥加密并使用公钥解密?
我知道 RSACryptoServiceProvider 可以用公钥加密,然后可以用私钥解密。
是否可以使用 RSACryptoServiceProvider 使用私钥加密并使用公钥解密?
只是为了澄清一点:
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,所以我不确定它是否完全按照这里的描述工作。但是这个解释可能会帮助你理解你得到的一些答案。
编辑:我应该先说特定的.NETRSACyrptoServiceProvider
可能不支持这个答案,因为货物崇拜“知识”这是不可能的,或者更实用的知识是这在实践中很少有用。
原来的:
每个声称不存在这样的东西的人要么不知道 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 实现,那么您将能够做到。
幸好没有。但是,您可以使用私钥签名并使用公钥验证签名。
虽然当密钥角色颠倒(这就是签名的工作方式)时涉及的数学是有意义的,但当解密密钥众所周知且公开时,为隐私加密就没有多大意义。
不,这不是任何公钥/私钥加密的工作方式。只能用公钥加密,只能用私钥解密。
如果您想将私钥应用于消息,也许您正在寻找签名,而不是加密?这是一种不同的加密方案,也可以使用 RSA 密钥。
你可以两者都做;用私有加密和用公共解密,或者,用公共加密和用私有解密。你不能只用私钥加密然后解密,也不能单独用公钥做同样的事情。
莱姆斯成功了。当解密密钥众所周知且公开时,使用私钥加密没有多大意义。
此外,您可以从私钥派生公钥,但反之则不行。
这就是我所理解的 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
您可以使用 PrivateKey 进行加密和解密。PrivateKey 实际上包含 Private 和 PublicKey。
从理论上讲,至少您可以使用 PublicKey 加密并使用 PrivateKey 解密,反之亦然。在 VB.net 中,我看到第一种情况有效,第二种情况抛出 BadKey 错误
公钥密码系统的安全性依赖于这样一个事实:sign()/encrypt() 函数是一种单向函数,因为在没有公钥“陷阱门”的情况下解密它需要不可行的时间。
此外,通常生成的密钥长度不同,尽管它们可能相同。有很多关于 RSA 的非对称密钥长度的论文。