0

I'm trying to implement encryption on my client - server application, but since I implemented it I can't communicate between the applications.

Server:

private void CommsHandler(object client)
    {

        TcpClient tcpClient = (TcpClient)client;

        StreamWriter writer;
        StreamReader reader;
        using (RijndaelManaged myRijindel = new RijndaelManaged())
        {
            myRijindel.GenerateKey();
            myRijindel.GenerateIV();
            ICryptoTransform encryptor = myRijindel.CreateEncryptor(myRijindel.Key, myRijindel.IV);

            byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,  
                0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
            byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,  
               0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};  

            CryptoStream secureStreamRead = new CryptoStream(tcpClient.GetStream(), myRijindel.CreateDecryptor(Key,IV), CryptoStreamMode.Read);
            CryptoStream secureStreamWrite = new CryptoStream(tcpClient.GetStream(), myRijindel.CreateEncryptor(Key, IV), CryptoStreamMode.Write);

            reader = new StreamReader(secureStreamRead);
            writer = new StreamWriter(secureStreamWrite);
        }

        NetworkStream network = tcpClient.GetStream();


        char[] buffer = new char[4096];

        while (true)
        {
            try
            {
                reader.Read(buffer, 0, buffer.Length);
            }
            catch (Exception)
            {
                InsertLog(2, "Communication with client closed");
                break;
            }
            string message = new string(buffer);
            Debug.Write(message);

            doJob(message, writer, network);

            for (int i = 0; i < buffer.Length; i++)
            {
                buffer[i] = (char)0;
            }
        }

        tcpClient.Close();
    }

Client:

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        client.Connect(textBox1.Text, Convert.ToInt16(textBox2.Text));


        using (RijndaelManaged myRijindel = new RijndaelManaged())
        {
            myRijindel.GenerateKey();
            myRijindel.GenerateIV();
            ICryptoTransform encryptor = myRijindel.CreateEncryptor(myRijindel.Key, myRijindel.IV);

            byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,  
                0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
            byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,  
                0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};

            CryptoStream secureStreamRead = new CryptoStream(client.GetStream(), myRijindel.CreateDecryptor(Key, IV), CryptoStreamMode.Read);
            CryptoStream secureStreamWrite = new CryptoStream(client.GetStream(), myRijindel.CreateEncryptor(Key, IV), CryptoStreamMode.Write);

            reader = new StreamReader(secureStreamRead);
            writer = new StreamWriter(secureStreamWrite);
        }

        network = client.GetStream();
        connected = true;
        MessageBox.Show("Connected successfully", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Could not connect to server:" + Environment.NewLine + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Is there anything wrong with my implementation? Especially on the StreamWriter and StreamReader parts. Or is the problem elsewhere?

4

1 に答える 1

2

using ブロックは、常にブロックの最後で IDisposable.Dispose() を呼び出します。

だからあなたが言うなら:

using (RijndaelManaged myRijindel = new RijndaelManaged())
{
    ...
}

ブロックを終了すると、暗号プロバイダーは閉じられます。それはあなたの問題の一部だと思います。

于 2013-02-06T19:37:27.923 に答える