DSACryptoServiceProvider与RSACryptoServiceProvider

时间:2009-07-29 12:00:57

标签: c# .net encryption

我似乎在这里有误解。

我需要使用数字签名实现公钥/私钥加密(PKCS)。我在.Net框架中找到了以下类。

  1. 的RSACryptoServiceProvider
  2. DSACryptoServiceProvider
  3. 我想加密文件然后对它们进行数字签名,并在接收方验证签名然后解密。

    DSACryptoServiceProvider类具有VerifySignature函数,它接受带符号的有符号值和未签名的值!

    我的问题是,是加密然后签名还是签名然后加密?

    如果我发送加密密钥的未签名密钥(连同签名密钥),那么任何第三方都可以解密文本

3 个答案:

答案 0 :(得分:2)

签名意味着:

  1. 发送者在发送

  2. 之前根据数据计算哈希值
  3. 发件人使用发件人私钥加密该哈希

  4. Receiver根据收到的数据计算哈希值

  5. 接收方使用发件人公钥解密发件人签名

  6. Receiver会比较本地计算的哈希值和解密的签名

  7. 我认为VerifySignature()执行步骤4)和5)

    在步骤1)和3)中,您可以为加密或未加密的数据创建哈希值,只要发送方和接收方完全相同,就可以选择。

    请注意,这与数据的实际加密无关,您甚至可以签署未加密的数据。另请注意,密钥的使用是相反的,通常使用接收方公钥进行加密。

答案 1 :(得分:0)

你总是加密然后签名。这样做意味着接收方可以检查加密数据在传输过程中是否没有被更改而不必解密,这可能是一个漫长的过程。

答案 2 :(得分:0)

只是澄清一些可能的混淆(但也许很明显):

  1. 您不使用非对称算法加密消息本身 - 像AES这样的东西可能更合适。
  2. 您发送加密邮件和哈希值(哈希值已加密)。收件人自己生成哈希并检查它是否与您发送的哈希匹配(他们使用发件人公钥解密)。
  3. 如果您没有用于对称加密的共享密钥(即邮件本身的加密),那么您可能应生成一个密钥并使用收件人公钥对其进行加密,并将其与签名邮件一起发送。