Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DSACryptoServiceProvider与RSACryptoServiceProvider_C#_.net_Encryption - Fatal编程技术网

C# DSACryptoServiceProvider与RSACryptoServiceProvider

C# DSACryptoServiceProvider与RSACryptoServiceProvider,c#,.net,encryption,C#,.net,Encryption,我似乎有误解 我需要用数字签名实现公钥/私钥加密(PKCS)。我在.NETFramework中发现了以下类 RSA加密服务提供商 DSACryptoServiceProvider 我想对文件进行加密,然后对其进行数字签名,在接收方验证签名,然后解密 类DSACryptoServiceProvider具有函数VerifySignature,该函数接受已签名值和未签名值 我这里的问题是先加密后签名还是先签名后加密 如果我发送加密密钥的未签名密钥(连同签名密钥),则任何第三方都可以解密您始终加密然后签

我似乎有误解

我需要用数字签名实现公钥/私钥加密(PKCS)。我在.NETFramework中发现了以下类

  • RSA加密服务提供商
  • DSACryptoServiceProvider
  • 我想对文件进行加密,然后对其进行数字签名,在接收方验证签名,然后解密

    类DSACryptoServiceProvider具有函数VerifySignature,该函数接受已签名值和未签名值

    我这里的问题是先加密后签名还是先签名后加密


    如果我发送加密密钥的未签名密钥(连同签名密钥),则任何第三方都可以解密您始终加密然后签名的文本。这样做意味着接收方可以检查加密数据在传输过程中没有被更改,而无需取消加密,这可能是一个漫长的过程。

    签名意味着:

  • 发送方在发送前根据数据计算哈希值

  • 发送方使用发送方私钥加密该散列

  • 接收方根据接收到的数据计算哈希值

  • 接收方使用发送方公钥解密发送方签名

  • 接收方比较本地计算的散列和解密的签名

  • 我想VerifySignature()执行步骤4)和5)

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


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

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

  • 您不会使用非对称算法对消息本身进行加密,像AES这样的算法可能更合适
  • 您发送加密的消息和散列(散列是加密的)。收件人自己生成哈希,并检查它是否与您发送的哈希匹配(他们已使用发件人公钥解密)

  • 如果您没有用于对称加密(即邮件本身的加密)的共享密钥,那么您可能应该生成一个共享密钥,并使用收件人公钥对其进行加密,然后将其与签名邮件一起发送。

    我完全同意,但是如何使用具有函数VerifySignature(signedHash,unsignedHash)的DSACryptoServiceProvider实现这一点呢?这里的杂烩是什么?这是加密的密钥吗?那是错误的。如果您需要不可否认性,那么您必须对消息进行签名,然后对其进行加密。否则,对手可以生成其公钥/密钥对,从而解密签名的消息会得到对手选择的明文。哦,我不是说不要两者都做,但问题中根本没有提到否认,只是签名验证。事实上,如果您希望同时进行不可否认性和验证,那么您最终会同时进行这两项工作,尤其是在从其他系统转发消息或将消息转发到其他系统的系统中。谢谢,这是非常有用的信息,但到底要发送什么(从2到3)?是杂烩吗?(所以我们在散列上创建散列)?您发送签名(=加密散列)以及数据。您描述的签名流与RSA的工作方式不匹配,但与(EC)DSA不匹配。在(EC)DSA中,哈希用作生成和验证中的数字;在DSA验证期间,系统不会发出类似“预期哈希'hex'”的消息。不过,无可否认,RSA方法是最容易解释的。