首先,这不是拼写错误,我想使用 public 键解密。这样做的目的是向第三方提出质疑,以确保他们确实拥有与公钥对应的私钥。基本上,我会发送一些随机数据,他们会使用私钥对其进行加密,我会使用公钥对其进行解密,并将解密后的值与我发送的随机数据进行比较。我相信这是一个非常标准的公钥加密程序,但由于某种原因,用公钥解密似乎是禁忌。
我只是在.NET 2.0中使用RSACryptoServiceProvider
。但是,当我致电Decrypt
时,会抛出CryptographicException
消息Bad Key
。关键不错(我可以Encrypt
没有问题),但似乎它不会让我只用公钥解密。是什么赋予了?必须这样做。
答案 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”。如果没有这个,你只能使用密钥进行签名和身份验证,而不是加密/解密,这是你在这里实现的用例。