Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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# C语言中的数字签名#_C#_Cryptography_Digital Signature - Fatal编程技术网

C# C语言中的数字签名#

C# C语言中的数字签名#,c#,cryptography,digital-signature,C#,Cryptography,Digital Signature,所以我有一个服务器和一个客户端。 我在安全方面有一个任务/问题。 服务器和客户端之间的对话: 客户:给我配置文件,服务器! 服务器:发送带有数字签名的配置文件 客户端:接收数据 那么,我应该选择什么方法呢 生成私钥和公钥(服务器端) 将私钥保存在xml文件(TIP1)中 客户端将使用公钥(与私钥一起生成)进行传播 之后,客户端将向服务器发送请求时: 1.服务器从xml文件(TIP1)获取私钥并发送配置文件+数字签名(通过私钥加密) 2.客户端接收来自服务器的响应,并通过公钥验证数字签名 我如何在

所以我有一个服务器和一个客户端。 我在安全方面有一个任务/问题。 服务器和客户端之间的对话: 客户:给我配置文件,服务器! 服务器:发送带有数字签名的配置文件 客户端:接收数据

那么,我应该选择什么方法呢

  • 生成私钥和公钥(服务器端)
  • 将私钥保存在xml文件(TIP1)中
  • 客户端将使用公钥(与私钥一起生成)进行传播
  • 之后,客户端将向服务器发送请求时: 1.服务器从xml文件(TIP1)获取私钥并发送配置文件+数字签名(通过私钥加密) 2.客户端接收来自服务器的响应,并通过公钥验证数字签名

    我如何在C#中实现这个想法? 密钥(私人和公共)我将由特殊程序生成。所以私钥将保存在xml文件中

    另外

    我写了一些可能做我想要的工作的课程:

    public class Cryptography
    {
        private const string CONTAINER_NAME = "MyContainer";
    
        private static RSACryptoServiceProvider rsa;
        private static MD5 md5;
    
        private static void AssignParameter()
        {           
            CspParameters cspParams;
            cspParams = new CspParameters();
            cspParams.KeyContainerName = CONTAINER_NAME;
            cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
    
            rsa = new RSACryptoServiceProvider(cspParams);
        }
    
        static Cryptography()
        {
            md5 = MD5.Create();
        }
    
        public static byte[] CreateSignature(byte[] data, string pathToKey)
        {
            AssignParameter();
    
            StreamReader reader = new StreamReader(pathToKey);
            string privateKeyXML = reader.ReadToEnd();
            rsa.FromXmlString(privateKeyXML);
            reader.Close();
    
            RSAPKCS1SignatureFormatter RSAform = new RSAPKCS1SignatureFormatter(rsa);
            RSAform.SetHashAlgorithm("MD5");
    
            byte[] hashData = md5.ComputeHash(data);
    
            return RSAform.CreateSignature(hashData);
        }
    
        public static bool VerifySignature(byte[] originalData, byte[] data, string pathToKey)
        {
            StreamReader reader = new StreamReader(pathToKey);
            string publicKeyXML = reader.ReadToEnd();
            rsa.FromXmlString(publicKeyXML);
            reader.Close();
    
            RSAPKCS1SignatureDeformatter RSAdeform = new RSAPKCS1SignatureDeformatter(rsa);
            RSAdeform.SetHashAlgorithm("MD5");
    
            byte[] hashOriginalData = md5.ComputeHash(originalData);
    
            return RSAdeform.VerifySignature(hashOriginalData, data);
        }
    
        public static void AssignNewKey()
        {
            AssignParameter();
    
            StreamWriter writer = new StreamWriter(@"D:\cryptography\privatekey.xml");
            string privatePrivateKeyXML = rsa.ToXmlString(true);
            writer.Write(privatePrivateKeyXML);
            writer.Close();
    
            writer = new StreamWriter(@"D:\cryptography\publickey.xml");
            string publicOnlyKeyXML = rsa.ToXmlString(false);
            writer.Write(publicOnlyKeyXML);
            writer.Close();
    
        }
    
    }
    

    你觉得怎么样?

    与其重新发明轮子,你可以简单地使用WCF的传输或消息安全性,然后使用它-当然,除非你出于任何原因不能使用WCF。

    我有理由需要使用密钥并处理它。然后你应该在问题中概述这些原因。在软件需求中,我只能使用.NET2