Чтение и запись в TCP-сокет с использованием CryptoStream

c# sockets encryption rijndaelmanaged cryptostream

438 просмотра

1 ответ

7911 Репутация автора

Я пытаюсь зашифровать данные, которые отправляю по TCP-соединению, однако я не получаю никаких данных через мой CryptoStream.

Вот класс, в котором я настроил потоки:

public class SecureCommunication
{
    public SecureCommunication(TcpClient client, byte[] key, byte[] iv)
    {
        _client = client;

        _netStream = _client.GetStream();

        var rijndael = new RijndaelManaged();
        _cryptoReader = new CryptoStream(_netStream, 
            rijndael.CreateEncryptor(key, iv), CryptoStreamMode.Read);
        _cryptoWriter = new CryptoStream(_netStream, 
            rijndael.CreateEncryptor(key, iv), CryptoStreamMode.Write);

        _reader = new StreamReader(_cryptoReader);
        _writer = new StreamWriter(_cryptoWriter);
    }

    public string Receive()
    {
        return _reader.ReadLine();
    }

    public void Send(string buffer)
    {
        _writer.WriteLine(buffer);
        _writer.Flush();
    }

    ...

Ключ и вектор инициализации:

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

На моей тестовой клиентской программе я звоню

var client = new TcpClient("xxx.xxx.xxx.xxx", 12345);
var communication = new SecureTcpCommunication(client, key, iv);
communication.Send("Test message");

И на моем сервере я звоню:

var serverSocket = new TcpListener(IPAddress.Any, tcpPort);
var client = serverSocket.AcceptTcpClient();
var communication = new SecureTcpCommunication(client, key, iv);
Console.WriteLine($"Received message: {communication.Receive()}");

Однако приложение блокируется communication.Receiveи никогда не заканчивается. Что я здесь не так делаю? Я чувствую, что это что-то действительно простое ..

Автор: flakes Источник Размещён: 18.07.2016 02:50

Ответы (1)


0 плюса

11219 Репутация автора

В вашей функции отправки звоните _cryptoWriter.Flush()последним. _writer.Flush()не вызывает flush для инкапсулированного потока.

Автор: Todd Размещён: 22.03.2018 05:39
Вопросы из категории :
32x32