2010-06-25 67 views
2

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

我只是在.NET 2.0中使用RSACryptoServiceProvider。但是,当我拨打Decrypt时,它会显示CryptographicException,并显示消息Bad Key。关键是不坏(我可以Encrypt没有问题),但它似乎不会让我只用公钥解密。是什么赋予了?这一定是可以做到的。

回答

7

我认为公认的术语是签署。他们用用私钥,而你用用公钥验证。我承认我并不理解低级数学,但我的理解是签名实际上只是用私钥进行加密。使用RSACryptoServiceProvider的方法签名并验证。实际上,SignHash实际上是说,“用私钥对它进行加密”。

+0

*“但我的理解是签名实际上只是使用私钥进行加密”* - 嗯,是,不是。理论上是。然而,在实践中,您首先对输入进行散列,使用私钥对* hash *进行加密,然后将其附加到消息中,因为RSA在计算上非常昂贵。事实上,实际上,在加密时,您甚至不用公钥对输入进行加密:您需要对大型随机数进行加密,并将该数字用作快速对称加密算法(如AES)的密钥。 – 2010-06-25 22:25:43

+1

@BlueRaja,我实际上意识到这一点(散列和RSA仅用于交换随机会话密钥)。这就是为什么我引用'SignHash'的一部分。我的观点是“签署x”==“用私钥加密x”。无论x是散列还是真实消息,这都适用。 – 2010-06-25 22:36:38

+1

签名和加密的主要区别在于,当你*加密*时,你用随机数据填充(以防止明文猜测攻击);当*符号*时,您将填充具有预定义结构的数据(以防止选择余数的攻击)。在验证签名时,验证填充数据是否正确也很重要。 – caf 2010-06-26 13:43:42

0

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

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

AT_EXCHANGE键属性:

涡卷/解开=真

符号/验证=真

加密/解密=假

AT_SIGNATURE键属性:

包装/拆开包装=假

签名/验证=真

加密/解密=假

因此,基本上,当你exchaning数据,你基本上是执行包装/解包功能。这就是微软称之为AT_EXCHANGE的原因。这主要用于交换秘密/对称密钥,不用于交换海量数据。

所以你需要回去找出你选择哪个密码,然后标记/包裹你的dat。

+0

我不太确定我遵循...我是不做签名我只是想验证签名。即便如此,我真正想做的只是解密一些数据。从我正在收集的信息中可以看出,这听起来不像是使用.NET API的可能性。 – Dennis 2010-06-30 17:00:38

+0

我不理解你的评论。你在说>>我只是想验证签名<<但是你也在说,>>我真正想要解密一些数据<<你只想解密数据或者你想验证签名或者你想同时做这两件事?如果它是第三选择,那么看看Hybrid模型[http://en.wikipedia.org/wiki/Hybrid_cryptosystem]。 – Raj 2010-07-01 09:25:17

+0

我有一堆字节,我试图使用RSACryptoServiceProvider进行RSA解密,我拥有的是公钥。术语“签署”和“哈希”只是混淆了我的目标。 – Dennis 2010-07-02 13:26:38

0

根据Raj,您提供的钥匙可能未标记为交换。

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