【问题标题】:Decrypt data using an RSA public key使用 RSA 公钥解密数据
【发布时间】:2011-03-08 11:54:42
【问题描述】:

首先,这不是错字,我想解密 使用 public 密钥。这样做的目的是挑战第三方以确保他们确实拥有与公钥对应的私钥。基本上,我会发送一些随机数据,他们会用他们的私钥对其进行加密,我会使用公钥对其进行解密,并将解密后的值与我发送的随机数据进行比较。我相信这是公钥加密中非常标准的程序,但由于某种原因,使用公钥解密似乎是禁忌。

我只是在 .NET 2.0 中使用RSACryptoServiceProvider。但是,当我调用 Decrypt 时,它会抛出带有消息 Bad KeyCryptographicException。密钥还不错(我可以Encrypt 没有问题),但似乎它不会让我只用公钥解密。是什么赋予了?这一定是可以做到的。

【问题讨论】:

    标签: .net-2.0 cryptography encryption public-key


    【解决方案1】:

    我认为公认的术语是签名。他们用私钥签名,而你用公钥验证。我承认我不理解底层数学,但我的理解是签名实际上只是用私钥加密。

    使用RSACryptoServiceProvider 的符号和验证方法系列。事实上,SignHash 实际上是说“用私钥加密”。

    【讨论】:

    • “但我的理解是签名实际上只是用私钥加密” - 是的,不是的。理论上是的。然而,在实践中,您首先对输入进行散列,用私钥加密 hash,然后将其附加到消息中,因为 RSA 在计算上非常昂贵。事实上,在实际加密时,您甚至不用公钥加密输入:您加密一个大随机数,并将该数字用作更快的对称加密算法(如 AES)的密钥。
    • @BlueRaja,我实际上意识到了这一点(散列和 RSA 仅用于交换随机会话密钥)。这就是我引用SignHash 的部分原因。我的观点是“签署 x”==“用私钥加密 x”。无论 x 是散列还是真实消息,这都适用。
    • 签名和加密之间的主要区别在于,当您加密时,您会填充随机数据(以防止明文猜测攻击);当您签名时,您会填充具有预定义结构的数据(以防止选择余数攻击)。在验证签名时,验证填充数据是否正确也很重要。
    • 好的,我正在与第 3 方合作,似乎没有涉及任何散列。他们只是期待一些随机字节,然后期待我解密他们返回的值并将其与随机字节进行比较。我不知道如何使用RSACryptoServiceProvider 执行此操作。我真的不明白为什么它不允许我只用公钥调用Decrypt,因为这是它在验证签名时在内部做的事情......
    【解决方案2】:

    这些 .Net 类应该是加密 API 的包装器。

    加密 API 中有两种类型的密钥。 Crypto API 是 PKCS#11 的封装。当您使用 Microsoft 加密服务提供商生成密钥对时,您将获得 AT_EXCHANGE 和 AT_SIGNATURE 密钥。每个密钥都是根据PKCS#11 标准中定义的一些属性生成的..

    AT_EXCHANGE 键属性:

    包装/解包=真

    签名/验证 = 真

    加密/解密 = 假

    AT_SIGNATURE 键属性:

    包装/解包 = 假

    签名/验证 = 真

    加密/解密 = 假

    所以基本上,当您交换数据时,您实际上是在执行包装/展开功能。这就是微软所说的 AT_EXCHANGE。这主要用于交换秘密/对称密钥,而不是用于交换大量数据。

    因此,您需要返回并找出您选择了哪个密钥来签名/包装您的数据。

    【讨论】:

    • 我不太确定我是否遵循...我没有进行签名我只是想验证签名。即便如此,我真正想做的只是解密一些数据。根据我从您所说的内容中收集到的信息,使用 .NET API 听起来不可能?
    • 我不明白你的评论。你说>>我只是想验证签名。>我真正想做的是解密一些数据en.wikipedia.org/wiki/Hybrid_cryptosystem].
    • 我有一堆字节,我正在尝试使用 RSACryptoServiceProvider 进行 RSA 解密,而我所拥有的只是公钥。 “签名”和“哈希”这两个词只是模糊了我的目标。
    • 简而言之,您正在尝试做不可能的事情。您无法使用公钥解密任何数据。拥有公钥,您可以验证使用私钥制作的数据签名(注意解密常见)或加密数据。拥有私钥,您可以签署一些数据(但不加密)并解密用公钥加密的数据。这就是非对称(也称为公钥)密码学的重点。
    【解决方案3】:

    根据 Raj,您获得的密钥可能没有标记为交换。

    询问提供公钥的一方是如何生成公钥的。如果使用 makecert.exe,他们需要指定“-sky Exchange”。如果没有这个,您只能使用密钥进行签名和身份验证,而不是加密/解密,这是您在此处实施的用例。

    【讨论】: