Помогите зашифровать данные. С#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by leshax, 17 Dec 2011.

  1. leshax

    leshax New Member

    Joined:
    26 Sep 2008
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Что дано. Две работающие функции:


    Code:
    TcpClient clientSocket;

    Посылает объект:
    Code:
     public void SendObject(object obj)
            {
                IFormatter formatter = new BinaryFormatter();
                NetworkStream strm = clientSocket.GetStream();
                formatter.Serialize(strm, obj);
                strm.Flush();      
              
            }
    Принимает объект:
    Code:
            public object GetObject()
            {
                NetworkStream strm = clientSocket.GetStream();
                IFormatter formatter = new BinaryFormatter();
                object message = (object)formatter.Deserialize(strm);
                strm.Flush();
                return message;
    
              
            } 

    Как сделать чтобы объект объект был зашифрован? Вот что делал я. Должно работать, но не работает :D .

    Code:
     public void SendEncryptedObject( object obj)
            {
                
                DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
                cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                CryptoStream crStream = new CryptoStream(clientSocket.GetStream(),
                    cryptic.CreateEncryptor(), CryptoStreamMode.Write);
                using (crStream)
                {
    
                    IFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(crStream, obj);
                }
                
                
            }
            public object GetEncryptedObject()
            {
                DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
                cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                object message;
                CryptoStream crStream = new CryptoStream(clientSocket.GetStream(),
                           cryptic.CreateDecryptor(), CryptoStreamMode.Read);
                    using (crStream)
                    {
                        IFormatter formatter = new BinaryFormatter();
                        message = (object)formatter.Deserialize(crStream);
                    }
                
                return message;
    
            }
    Thrown: "The operation is not allowed on non-connected sockets." (System.InvalidOperationException) Exception Message = "The operation is not allowed on non-connected sockets.", Exception Type = "System.InvalidOperationException"


    Весь класс:

    Code:
    public  class Message
        {
            TcpClient clientSocket;
            
            public Message()
            {
    
            }
    
            public Message(TcpClient c)
            {
                clientSocket = c;
            }
            public void Connect()
            {
                
                
                    if (clientSocket != null)
                        clientSocket.Close();
    
                    clientSocket = new TcpClient();
                    clientSocket.Connect("127.0.0.1", 8881);
    
                    
                    SendObject(new SystemInfo());
            }
            public void Disconnect()
            {
                if (clientSocket != null)
                    clientSocket.Close();
            }
    
            public void SendObject(object obj)
            {
                IFormatter formatter = new BinaryFormatter();
                NetworkStream strm = clientSocket.GetStream();
                formatter.Serialize(strm, obj);
                strm.Flush();      
              
            }
            public object GetObject()
            {
                NetworkStream strm = clientSocket.GetStream();
                IFormatter formatter = new BinaryFormatter();
                object message = (object)formatter.Deserialize(strm);
                strm.Flush();
                return message;
    
              
            } 
                    
            public void SendEncryptedObject( object obj)
            {
                
                DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
                cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                CryptoStream crStream = new CryptoStream(clientSocket.GetStream(),
                    cryptic.CreateEncryptor(), CryptoStreamMode.Write);
                using (crStream)
                {
    
                    IFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(crStream, obj);
                }
                
                
            }
            public object GetEncryptedObject()
            {
                DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
                cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH");
                object message;
                CryptoStream crStream = new CryptoStream(clientSocket.GetStream(),
                           cryptic.CreateDecryptor(), CryptoStreamMode.Read);
                    using (crStream)
                    {
                        IFormatter formatter = new BinaryFormatter();
                        message = (object)formatter.Deserialize(crStream);
                    }
                
                return message;
    
            }
        }
     
    #1 leshax, 17 Dec 2011
    Last edited: 17 Dec 2011
  2. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Указал бы на какой строчке Exception выбрасывается, верней где именно.
    Хотя исходя из ошибки и так все понятно, либо CryptoStream закрывает сокет и ты пытаешься его использовать(привет using), либо нет конекта(например сервер закрыл сокет) и GetStream() выбрасывает Exception(по моему опыту скажу что именно на GetStream() выбрасывается Exception с таким сообщениям).
    И да если юзаеш CryptoStream возможно еще надо будет делать FlushFinalBlock().