@landwatersun

Научно-образовательный IT-форум при КНИТУ-КАИ

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Применение NetworkStream, CryptoStream, StreamWriter/StreamReader


[+] Применение NetworkStream, CryptoStream, StreamWriter/StreamReader

Сообщений 11 страница 16 из 16

11

rozh написал(а):

байты, преобразованные в строку методом Encoding.UTF8.GetString() не могут быть преобразованы обратно в тот же набор байтов, т.е. этот метод портит данные

Полностью с тобой согласен, Роман! Цитирую текст из источника:

UTF-8 является хорошим и распространённым способом представления символов Юникода. Каждый символ кодируется последовательностью байтов в количество от одного до четырёх включительно. (Все символы с кодовыми точками меньше 65536 кодируются одним, двумя или тремя байтами.) Например, если декодер UTF-8 получает на вход два байта 0x41 0xC2, он может возвратить только первый символ (заглавную литеру «А»), однако для определения второй литеры ему нужен третий байт.

12

Роман, ты натолкнул меня на элегантное решение.

Сервер:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;

namespace Server
{
    static class Program
    {

        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"),5001);
            listener.Start();
            TcpClient tc = listener.AcceptTcpClient();
            NetworkStream stm = tc.GetStream();
            StreamReader r = new StreamReader(stm, Encoding.Default);
            string str = r.ReadToEnd();
            Console.WriteLine("Зашифрованные данные: " + str);
            Console.WriteLine("Расшифрованные данные: " + Decrypt(str));
            Console.WriteLine("Кодировка \"" + Encoding.Default.EncodingName + "\" рулит! :)");
        }

        public static string Decrypt(this string text)
        {
            SymmetricAlgorithm algorithm = DES.Create();
            ICryptoTransform transform = algorithm.CreateDecryptor(Encoding.ASCII.GetBytes("12345678"), Encoding.ASCII.GetBytes("12345678"));
            byte[] inputbuffer = Encoding.Default.GetBytes(text);
            byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
            return Encoding.Default.GetString(outputBuffer);
        }

    }
}


Клиент:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SymmetricAlgorithm des = new DESCryptoServiceProvider();
                des.Key = Encoding.ASCII.GetBytes("12345678");
                des.IV = Encoding.ASCII.GetBytes("12345678");
                ICryptoTransform encrypt = des.CreateEncryptor();

                TcpClient client = new TcpClient();
                client.Connect("localhost", 5001);
                NetworkStream stm = client.GetStream();
                CryptoStream cryptostream = new CryptoStream(stm, encrypt, CryptoStreamMode.Write);
                StreamWriter w = new StreamWriter(cryptostream, Encoding.Default);
                w.WriteLine("Hello world (Привет мир)!");
                w.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.WriteLine("Server has probably not started.");
            }
        }
    }
}


https://pp.vk.me/c626831/v626831045/339bc/rIXobGbkX24.jpg

13

landwatersun написал(а):

Роман, ты натолкнул меня на элегантное решение.

Сервер:

Клиент:


А зачем вообще создавать объект CryptoStream, если Вы всё равно его не используете? (используется стандартный StreamReader).
CryptoStream выполняет дешифрование автоматически, прозрачно для пользователя.

14

alex_spq написал(а):

А зачем вообще создавать объект CryptoStream, если Вы всё равно его не используете

Согласен, убрал лишнее в предыдущем посту.

Однако, если использовать сервер в редакции, где требуется отобразить только расшифрованные данные, применение CryptoStream в сочетании с остальными классами работы с потоками оправдано:

Сервер:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;

namespace Server
{
    static class Program
    {

        static void Main(string[] args)
        {
            SymmetricAlgorithm des = new DESCryptoServiceProvider();
            des.Key = Encoding.ASCII.GetBytes("12345678");
            des.IV = Encoding.ASCII.GetBytes("12345678");
            ICryptoTransform decrypt = des.CreateDecryptor();
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"),5001);
            listener.Start();
            TcpClient tc = listener.AcceptTcpClient();
            NetworkStream stm = tc.GetStream();
            CryptoStream cryptostream = new CryptoStream(stm, decrypt, CryptoStreamMode.Read);
            StreamReader r = new StreamReader(cryptostream, Encoding.Default);
            Console.WriteLine("Расшифрованные данные: " + r.ReadToEnd());
        }
    }
}

15

Сервер:

Код:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;

namespace Server
{
    class Program
    {
        static ICryptoTransform decrypt;
        static void Main(string[] args)
        {
            SymmetricAlgorithm des = new DESCryptoServiceProvider();
            decrypt = des.CreateDecryptor(Encoding.ASCII.GetBytes("12345678"), Encoding.ASCII.GetBytes("12345678"));
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001);
            listener.Start();
            TcpClient tc = listener.AcceptTcpClient();
            NetworkStream stm = tc.GetStream();
            StreamReader reader = new StreamReader(stm, Encoding.Default);
            string str = reader.ReadToEnd();
            Console.WriteLine("Зашифрованные данные: " + str);
            Console.WriteLine("Расшифрованные данные: " + Decrypt(str));
            Console.ReadKey();
        }
        public static string Decrypt(string text)
        {
            byte[] inputbuffer = Encoding.Default.GetBytes(text);
            byte[] outputBuffer = decrypt.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
            return Encoding.Default.GetString(outputBuffer);
        }
    }
}

Клиент:

Код:
using System;
using System.IO;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SymmetricAlgorithm des = new DESCryptoServiceProvider();
                var encrypt = des.CreateEncryptor(Encoding.ASCII.GetBytes("12345678"), Encoding.ASCII.GetBytes("12345678"));
                TcpClient client = new TcpClient();
                client.Connect("localhost", 5001);
                NetworkStream stm = client.GetStream();
                CryptoStream cryptostream = new CryptoStream(stm, encrypt, CryptoStreamMode.Write);
                StreamWriter w = new StreamWriter(cryptostream, Encoding.Default);
                w.WriteLine("Hello world (Привет мир)!");
                w.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.WriteLine("Server has probably not started.");
            }
        }
    }
}

16

Проект с оптимизированным кодом сервера в редакции, где отображаются зашифрованные и расшифрованные данные, можно скачать по ссылке (см. папку "Issue3").


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Применение NetworkStream, CryptoStream, StreamWriter/StreamReader