Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444

Чат. А может ну его?

14.10.2017, 15:12. Показов 793. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пришла идея.Должна работать.Пишем...
Свое ноу-хау я сравниваю с туннелями , которое строятся из сигментов , которые я перевожу по сети. А теперь конкретней :
Сообщения передаются с клиента - на - клиент , по протоколу TCP. В классе клиента есть TcpListener и TcpClient. Прослушиватель принимает любые входящие сигменты. Клиент , отправляет сигменты на прослушиватели , причем все время переменная перезаписывается , т.к. меняются получатели. А как же я узнаю айпишки собеседника ? Через сервер. А как убеждаюсь в том что, это адрес именно того , кто мне нужен? Люди встречаются , и говорят идентификационные данные : Имя туннеля + фраза . Эти данные хешируются и отправляются на сервер вместе со своим айпи. Когда я хочу найти адресата , отправляю запрос с необходимыми хешами , если такие данные есть , то мне отправляется айпи.
Далее идет установка подключения :
С помощью асимметричного шифрования , я передаю ключ для симметричного шифроваия Rijndael. Отправляю по установленому каналу в зашифрованном виде , Не хешированные имя + фраза. Далее в базе собеседников сохраняется свзяка туннель + айпи . И если далее на прослушиватель поступает сигмент с данного айпи , я знаю из какого туннеля достать ключи для расшифровки.
Также , айпи может меняться - тогда происходит отправка идентификационного сигмента , происходит перебор расшифровки ключами с разных тунелей , когда ключ найден из сигмента извлекается новый адрес. И вообще это ужасная хрень , просто неимоверно. Далее я хотел по паттерну MVVM написать графический интерфейс WPF...
Но я застрял ... И вообще , сообщения есть только на получателе и отправителе , можно отправлять их только когда оба в сети , кому это нужно?
Кликните здесь для просмотра всего текста
Я написал классы шифровки :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.IO;
using System.Security.Cryptography;
using static System.Text.Encoding;
using System.Threading.Tasks;
// ReSharper disable InconsistentNaming
namespace TCPChat.Cryptography
{
    // ReSharper disable once InconsistentNaming
    //RSA
    public abstract class RSACipher
    {
        RSACryptoServiceProvider _rsaProvider;
        Task _init;
 
        protected RSACryptoServiceProvider RSA
        {
            get
            {
                if (!_init.IsCompleted)
                    _init.Wait();
                return _rsaProvider;
            }
        }
 
        protected abstract void InitRSA(out RSACryptoServiceProvider rsa);
 
        protected async void InitializationRSA()
        {
            await (_init = Task.Factory.StartNew(() => InitRSA(out _rsaProvider)));
        }
    }
 
    // ReSharper disable once InconsistentNaming
    public class RSAEncrypt : RSACipher
    {
        public RSAParameters PublicKey { get; }
 
        protected override void InitRSA(out RSACryptoServiceProvider rsa)
        {
            rsa = new RSACryptoServiceProvider();
            rsa.ImportParameters(PublicKey);
        }
 
        public RSAEncrypt(RSAParameters publicKey)
        {
            PublicKey = publicKey;
            InitializationRSA();
        }
 
        public byte[] Encrypt(byte[] date) => RSA.Encrypt(date,false);
    }
 
    // ReSharper disable once InconsistentNaming
    public class RSADecryptor : RSACipher
    {
        protected override void InitRSA(out RSACryptoServiceProvider rsa) => rsa = new RSACryptoServiceProvider(4096);
 
        public RSADecryptor()
        {
            InitializationRSA();
        }
 
        public RSAParameters GetPublicKey() => RSA.ExportParameters(false);
 
        public byte[] Decrypt(byte[] encryptDate) => RSA.Decrypt(encryptDate,false);
    }
    
    //Rijndael
    public class Rijndael
    {
        public byte[] Key { get; private set; }
        public byte[] Iv { get; private set; }
        readonly RijndaelManaged _rij = new RijndaelManaged();
        ICryptoTransform _decryptor;
        ICryptoTransform _encryptor;
 
        void Initialization()
        {
            Key = _rij.Key;
            Iv = _rij.IV;
            _decryptor = _rij.CreateDecryptor();
            _encryptor = _rij.CreateEncryptor();
        }
        
        public Rijndael()
        {
            _rij.GenerateKey();
            _rij.GenerateIV();
            Initialization();
        }
 
        public Rijndael(byte[] key, byte[] iv)
        {
            _rij.Key = key;
            _rij.IV = iv;
            Initialization();
        }
        
        public byte[] Encrypt(byte[] data)
        {
            var result = new MemoryStream();
            using (var cryptoStream = new CryptoStream(result, _encryptor, CryptoStreamMode.Write))
                    cryptoStream.Write(data,0,data.Length);
            return result.ToArray();
        }
 
        public byte[] Decrypt(byte[] date)
        {
            var streamDate = new MemoryStream(date);
            var result = new MemoryStream();
            using (var cryptoStream = new CryptoStream(streamDate, _decryptor, CryptoStreamMode.Read))
                cryptoStream.CopyTo(result);
            return result.ToArray();
        }
    }
Классы для взаимодействия с сервером :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System.IO;
using System.Net;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using TCPChat.Cryptography;
using System;
using System.Web;
using System.Web.Management;
using static System.Text.Encoding;
using Convert = System.Convert;
 
namespace TCPChat
{
    class Ping 
    {
        public Encoding ConvertEncoding { get; set; } = UTF8;
 
        public byte[] Bytes => ConvertEncoding.GetBytes(ToString());
 
        public string this[string name]
        {
            set { _date.Add(name, value); }
        }
 
        public  byte[] this[string name , bool s]
        {
            set {_date.Add(name,Convert.ToBase64String(value));}
        }
 
        NameValueCollection _date = HttpUtility.ParseQueryString("");
            
        public Ping(){}
 
        public override string ToString() => _date.ToString();
  
    }
 
    class ServerException : Exception
    {
        public byte ErrorCode { get; }
        public ServerException(int errorCode, string message = "Ошибка взаимодействия с сервером.") : base(message)
        {
            ErrorCode = Convert.ToByte(errorCode);
        }
    }
    
    public static class Server
    {
        const string Adress = "http://localhost/228666/";
 
        static WebRequest CreateRequest(NameValueCollection ping)
        {
            var result =  WebRequest.Create($"{Adress}?{ping}");
            result.Method = "GET";
            //Write date
            return result;
        }
 
        static NameValueCollection CreatePing(string name, string sword)
        {
            var result = HttpUtility.ParseQueryString("");
            result["name"] = Convert.ToBase64String(name.ComputeHash());
            result["sword"] = Convert.ToBase64String(sword.ComputeHash());
            return result;
        }
 
        static NameValueCollection CreatePing(string name, string sword, string ip)
        {
            var result = CreatePing(name, sword);
            result["ip"] = ip;
            return result;
        }
 
        static string CheckResponse(WebRequest request)
        {
            using (var responseStream = request.GetResponse().GetResponseStream())
            using (var reader = new StreamReader(responseStream, UTF8))
            {
                string response = reader.ReadToEnd();
                int responseCode = response[0];
                if (responseCode == 0) return response.Remove(0,1);
                throw new ServerException(responseCode, response);
            }
        }
        
        public static void SendPing(string name, string sword, string ip)
        {
            var ping = CreatePing(name, sword, ip);
            var request = CreateRequest(ping);
            CheckResponse(request);
        }
 
        public static IPAddress SearchPing(string name, string sword)
        {
            var ping = CreatePing(name, sword);
            var request = CreateRequest(ping);
                    return IPAddress.Parse(CheckResponse(request));
        }
    }
}
Пишу клиент-клиент часть :
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.IO;
using System.Net;
using TCPChat.Cryptography;
using static System.Text.Encoding;
using System.Net.Sockets;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace TCPChat
{
    [Serializable]
    public class ProtectedData
    {
        public string this[string name]
        {
            set
            {
                _data.Add(name, _encryptor.Encrypt(UTF8.GetBytes(value)));
            }
        }
        readonly Dictionary<string, byte[]> _data;
        [NonSerialized] readonly Cryptography.Rijndael _encryptor;
        
        public ProtectedData(byte[] key, byte[] iv, int count)
        {
            _encryptor = new Cryptography.Rijndael( key , iv);
            _data = new Dictionary<string, byte[]>(count);
        }
 
        public Dictionary<string,string> Decrypt(byte[] key,byte[] iv)
        {
            var _decryptor = new Cryptography.Rijndael(key,iv);
            var result = new Dictionary<string,string>(_data.Count);
            foreach (var element in _data)
                result.Add(element.Key,UTF8.GetString(_decryptor.Decrypt(element.Value)));
            return result;
        }
    }
 
    [Serializable]
    public class Sigment
    {
        public enum Type : byte
        {
            Identification = 0,
            Message
        }
        //
        
        public readonly Type SigmentType;
 
        readonly ProtectedData _data;
 
        static readonly BinaryFormatter BinFortmatter = new BinaryFormatter();
        
        public Sigment(byte[] key, byte[] iv, string name, string sword) 
        {
            SigmentType = Type.Identification;
            _data = new ProtectedData(key , iv, 2)
            {
                ["name"] = name,
                ["sword"] = sword
            };
        }
 
        public Sigment(byte[] key, byte[] iv, string message)
        {
            SigmentType = Type.Message;
            _data = new ProtectedData(key,iv, 1)
            {
                ["message"] = message
            };
        }
 
        public Dictionary<string,string> GetData(byte[] key, byte[] iv) => _data.Decrypt(key , iv);
 
        public byte[] Pack()
        {
            var result = new MemoryStream();
            BinFortmatter.Serialize(result,this);
            return result.ToArray();
        }
 
        public static Sigment Read(Stream data) => (Sigment)BinFortmatter.Deserialize(data);
    }
    
    [Serializable]
    public class Tunnel
    {
        public string Name { get; }
        public string Sword { get; }
        public byte[] RijKey { get; }
        public byte[] RijIV { get; }
        public EndPoint Conversationalist;
        List<AssembledSigment> Sigments = new List<AssembledSigment>();
 
        public Tunnel(string name, string sword)
        {
            Name = name;
            Sword = sword;
        }
 
        public void Add(Sigment sigment)
        {
            Sigments.Add(sigment);
        }
    }
    
    /*[Serializable]
    public class Package
    {
        static readonly BinaryFormatter _binaryFormatter  = new BinaryFormatter();
        
        public readonly RSAParameters PublicKey;
 
        public readonly bool IsDoubleEncryption;
 
        public readonly Sigment sigment;
 
        public void Pack(Stream stream) => _binaryFormatter.Serialize(stream, this);
        
        public static Package Read(Stream stream) => (Package)_binaryFormatter.Deserialize(stream);
    }*/
    
    public class AssembledSigment
    {
        public Tunnel Tunnel { get; }
        Dictionary<string, string> Data;
 
        public AssembledSigment(Tunnel tunnel, Sigment sigment)
        {
            Tunnel = tunnel;
            Data = sigment.GetData(tunnel.RijKey , tunnel.RijIV);
        }
    }
    
    public class Client
    {
        public readonly List<Tunnel> Tunnels = new List<Tunnel>();
        public event EventHandler<AssembledSigment> NewSigment;
 
        public Tunnel CurrentTunnel { set; get; }
        //
        readonly TcpListener Receiver = new TcpListener(4004);
       
        readonly Semaphore _limiterReceivedMessage = new Semaphore(3,3);
        
        bool _active;                      
        
        readonly Task ListenerTask;
        //
        TcpClient _sender;
 
        public Client()
        {
            
        }
 
        public static void SendResponse()
        {
            
        }
 
        async void ReceiveMessage()
        {
            _limiterReceivedMessage.WaitOne();//Semaphore
            var result = await Receiver.AcceptTcpClientAsync();
            Sigment sigment;
            using (var networkStream = result.GetStream())
                sigment =  Sigment.Read(networkStream);
            var tunnel = Tunnels.Find(findTunnel => findTunnel.Conversationalist == result.Client.RemoteEndPoint);
            NewSigment?.Invoke(this,new AssembledSigment(tunnel,sigment));
            _limiterReceivedMessage.Release();
        }
 
        void BeginListening()
        {
            _active = true;
            Receiver.Start();
            Task.Factory.StartNew(() =>
            {
                while (_active) ReceiveMessage();
            });
        }
 
        public bool SendMessage(string message)
        {
            return true;[SUB][/SUB]
        }
    }
}

И это уже как половину года пишу....
Заморочек много , а эффекта будет мало , ведь так?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2017, 15:12
Ответы с готовыми решениями:

Может ли чат на сайте сфоткать рабочий стол?
Знаете такие чаты , даже в магизине любов инета, может ли получить доступ вообще ненапрягаясь, как вы считаете? Возможно какие другие...

Делаю чат, код chat.php как-то каряво идет, может кто -нть посмотрит и ошибку найдет?
&lt;?PHP error_reporting(0); include(&quot;includer.php&quot;); $login=$_POST; $password=$_POST; if (($login!='') &amp;&amp; ($password!='')) { ...

Чат на PHP. При отправке сообщения повторно отправяет его
Незнаю может и не в правильном месте создал тему. Ну помогите с кодом. А точнее. Написал легонький чат. И проблема в том что после...

7
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
14.10.2017, 17:51
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Заморочек много , а эффекта будет мало
RaevskiAnatoly, я конечно только За различных экспериментов, но есть же готовые средства. SignalR, WCF, берите и используйте. Зачем вам написание велосипедов?
0
20 / 20 / 6
Регистрация: 18.07.2014
Сообщений: 73
14.10.2017, 19:42
На самом деле я согласен с insite2012 однако и изобретение собственных велосипедов весЧь очень нужная! Всё зависит от того что должно быть в конечном итоге - если проект рабочий и выйдет в свет и есть сроки то лучше брать что то уже наезженное и сосредоточится на бизнес логике, если делается для себя (а ведь иной раз и для себя выходит в свет) то тут знания и опыт бесценны и уже не может стоять вопроса "а эффекта будет мало".
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
14.10.2017, 23:04
я тоже ничего не понял, вроде не первый год шарю в этой сетевой мути
но согласен что это прекрасно - твори! не надо никому ничего объяснить, делай что нравится ))
0
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
15.10.2017, 23:05  [ТС]
Чат в ящик... Может быть когда-то , никогда. Есть гораздо более интересные , пока еще не банальные вещи.
0
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
01.02.2018, 22:06  [ТС]
Цитата Сообщение от m0nax Посмотреть сообщение
я тоже ничего не понял, вроде не первый год шарю в этой сетевой мути
но согласен что это прекрасно - твори! не надо никому ничего объяснить, делай что нравится ))
Я, кстати, нашел аналог описываемого мною способа защиты своей переписки. Оказывается это ничто иное, как https. Надо было раньше почитать про него детальней)
2
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
01.02.2018, 23:09
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Я, кстати, нашел аналог описываемого мною способа защиты своей переписки. Оказывается это ничто иное, как https. Надо было раньше почитать про него детальней)
вот это поворот)))
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
03.02.2018, 16:40
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Я, кстати, нашел аналог описываемого мною способа защиты своей переписки.
У меня шок...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2018, 16:40
Помогаю со студенческими работами здесь

Чат-бот, выводящий факты, которые уже есть в его базе данных
Добрый день/вечер:senor: Дело вот в чём,т.к я недавно занялся программированием,а для азов взял паскаль и чутка научился там всяких...

А может ну его Яндекс?
Коллеги, в последнее время я вижу увеличение количества посетителей от Рамблер. Что это случайность или изменение алгоритмов? ...

Может ли компьютер сам писать код и проверять его?
Всем привет! Такая мысль возникла, а что, если бы компьютер сам писал код, а программист бы лишь руководил процессом...

НОД32 выдает сообщение о вирусе, но не может его удалить
Добрый день. При включении компьютера антивирус НОД32 выдает сообщение о вирусе, но не может его удалить. Помогите. Прилагаю скрин вируса,...

Система видит внешний HDD, но не может его открыть
Всем привет! У меня есть внешний HDD на 500гб. Недавно я копировал на него данные с ПК (там порядка 40 гб, фотки, программы итд)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru