C# DSACryptoServiceProvider与RSACryptoServiceProvider
我似乎有误解 我需要用数字签名实现公钥/私钥加密(PKCS)。我在.NETFramework中发现了以下类C# DSACryptoServiceProvider与RSACryptoServiceProvider,c#,.net,encryption,C#,.net,Encryption,我似乎有误解 我需要用数字签名实现公钥/私钥加密(PKCS)。我在.NETFramework中发现了以下类 RSA加密服务提供商 DSACryptoServiceProvider 我想对文件进行加密,然后对其进行数字签名,在接收方验证签名,然后解密 类DSACryptoServiceProvider具有函数VerifySignature,该函数接受已签名值和未签名值 我这里的问题是先加密后签名还是先签名后加密 如果我发送加密密钥的未签名密钥(连同签名密钥),则任何第三方都可以解密您始终加密然后签
如果我发送加密密钥的未签名密钥(连同签名密钥),则任何第三方都可以解密您始终加密然后签名的文本。这样做意味着接收方可以检查加密数据在传输过程中没有被更改,而无需取消加密,这可能是一个漫长的过程。签名意味着:
请注意,这与数据的实际加密无关,您甚至可以对未加密的数据进行签名。还要注意,密钥的使用是反向的,通常使用接收方公钥进行加密。只是为了澄清一些可能的混淆(但可能很明显):
如果您没有用于对称加密(即邮件本身的加密)的共享密钥,那么您可能应该生成一个共享密钥,并使用收件人公钥对其进行加密,然后将其与签名邮件一起发送。我完全同意,但是如何使用具有函数VerifySignature(signedHash,unsignedHash)的DSACryptoServiceProvider实现这一点呢?这里的杂烩是什么?这是加密的密钥吗?那是错误的。如果您需要不可否认性,那么您必须对消息进行签名,然后对其进行加密。否则,对手可以生成其公钥/密钥对,从而解密签名的消息会得到对手选择的明文。哦,我不是说不要两者都做,但问题中根本没有提到否认,只是签名验证。事实上,如果您希望同时进行不可否认性和验证,那么您最终会同时进行这两项工作,尤其是在从其他系统转发消息或将消息转发到其他系统的系统中。谢谢,这是非常有用的信息,但到底要发送什么(从2到3)?是杂烩吗?(所以我们在散列上创建散列)?您发送签名(=加密散列)以及数据。您描述的签名流与RSA的工作方式不匹配,但与(EC)DSA不匹配。在(EC)DSA中,哈希用作生成和验证中的数字;在DSA验证期间,系统不会发出类似“预期哈希'hex'”的消息。不过,无可否认,RSA方法是最容易解释的。