2

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

我只是RSACryptoServiceProvider在 .NET 2.0 中使用。但是,当我调用Decrypt它时会抛出一个CryptographicExceptionwith message Bad Key。密钥还不错(我可以Encrypt毫无问题),但似乎它不会让我只用公钥解密。是什么赋予了?这必须是可以做到的。

4

3 回答 3

7

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

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

于 2010-06-25T22:05:29.733 回答
0

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

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

AT_EXCHANGE 键属性:

包装/展开=真

签名/验证 = 真

加密/解密 = 假

AT_SIGNATURE 键属性:

包装/展开=假

签名/验证 = 真

加密/解密 = 假

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

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

于 2010-06-30T16:02:29.493 回答
0

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

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

于 2012-06-05T22:34:38.423 回答