使用RSA公钥解密数据

时间:2010-06-25 22:04:17

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

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

我只是在.NET 2.0中使用RSACryptoServiceProvider。但是,当我致电Decrypt时,会抛出CryptographicException消息Bad Key。关键不错(我可以Encrypt没有问题),但似乎它不会让我只用公钥解密。是什么赋予了?必须这样做。

3 个答案:

答案 0 :(得分:7)

我认为公认的术语是签署。他们使用私钥签名,并使用公钥验证。我承认我并不理解低级数学,但我理解签名实际上只是用私钥加密。

使用RSACryptoServiceProvider的签名并验证方法系列。事实上,SignHash实际上是说“用私钥加密它。”

答案 1 :(得分:0)

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

加密API中有两种类型的密钥。 Crypto API是PKCS#11的包装器。使用Microsoft加密服务提供程序生成密钥对时,将获得AT_EXCHANGE和AT_SIGNATURE密钥。每个密钥都是基于PKCS#11 standard ..

中定义的某些属性生成的

AT_EXCHANGE键属性:

wrap / unwrap = true

sign / verify = true

加密/解密=假

AT_SIGNATURE键属性:

wrap / unwrap = false

sign / verify = true

加密/解密=假

所以基本上,当你交换数据时,你实际上是在执行包装/解包功能。这就是微软称之为AT_EXCHANGE的东西。这主要用于交换密钥/对称密钥,而不是用于交换大量数据。

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

答案 2 :(得分:0)

Per Raj,您提供的钥匙可能没有标记为交换。

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