· 7 years ago · Feb 25, 2018, 04:48 AM
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using System.Net;
7using System.Net.Sockets;
8using System.Numerics;
9
10namespace WireSharkLesson
11{
12 public struct Datas
13 {
14 public BigInteger p;
15 public BigInteger g;
16 public BigInteger message;
17 }
18 class Program
19 {
20 static void Main(string[] args)
21 {
22 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
23 IPEndPoint ep = new IPEndPoint(IPAddress.Any, 5555);
24 socket.Bind(ep);
25
26 Dictionary<IPEndPoint, BigInteger> clients = new Dictionary<IPEndPoint, BigInteger>();
27 Random r = new Random();
28
29 //read p, read g, read alice message SHORT PREFIX
30 while (true)
31 {
32 byte[] buffer = new byte[1024];
33 EndPoint clientEP = new IPEndPoint(IPAddress.Any, 2000);
34 int dataReceived = socket.ReceiveFrom(buffer, ref clientEP);
35
36 if (dataReceived < 0) continue;
37 if (!clients.ContainsKey((IPEndPoint)clientEP))
38 {
39
40 Datas d = new Datas();
41
42 short pLength = BitConverter.ToInt16(buffer, 0);
43 byte[] p = new byte[pLength];
44 Buffer.BlockCopy(buffer, 2, p, 0, pLength);
45 d.p = new BigInteger(p);
46
47 d.g = buffer[2 + pLength];
48
49 short messageLength = BitConverter.ToInt16(buffer, 3 + pLength);
50 byte[] message = new byte[messageLength];
51 Buffer.BlockCopy(buffer, 5 + pLength, message, 0, messageLength);
52 d.message = new BigInteger(message);
53
54 int myRandom = r.Next(); //bob secret number
55
56 BigInteger secretKey = BigInteger.ModPow(d.message, myRandom, d.p);
57 clients.Add((IPEndPoint)clientEP, secretKey);
58
59 BigInteger myMessage = (BigInteger.ModPow(d.g, myRandom, d.p));
60
61 List<byte> toSend = new List<byte>();
62
63 toSend.AddRange(BitConverter.GetBytes((short)myMessage.ToByteArray().Length));
64 toSend.AddRange(myMessage.ToByteArray());
65
66 socket.SendTo(toSend.ToArray(), clientEP);
67 Console.WriteLine("data received "+ myMessage);
68 }
69 else
70 {
71 List<byte> decriptedData = new List<byte>();
72 byte[] clientKey = clients[(IPEndPoint)clientEP].ToByteArray();
73 for (int i = 0; i < dataReceived; i++)
74 {
75 decriptedData.Add(buffer[i] ^= clientKey[i]);
76 }
77
78 string text = Encoding.ASCII.GetString(decriptedData.ToArray());
79 Console.WriteLine(text);
80 }
81 }
82
83
84 }
85 }
86}