· 6 years ago · May 20, 2019, 04:34 AM
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Linq;
7using System.Text;
8using System.Threading.Tasks;
9using System.Windows.Forms;
10
11namespace WindowsFormsApplication22
12{
13 public partial class Form4 : Form
14 {
15
16 public struct Player
17 {
18 public Int64 publickey;
19 public Int64 secretkey;
20 public List<Int64> cards;
21 public List<Int64> openCards;
22 };
23
24 public Form4()
25 {
26 InitializeComponent();
27 }
28
29 public Int64 nod(Int64 a, Int64 b, out Int64 x, out Int64 y)
30 {
31 if (a == 0)
32 {
33 x = 0; y = 1; return b;
34 }
35
36 Int64 x1, y1;
37 Int64 d = nod((b % a), a, out x1, out y1);
38 x = y1 - (Int64)(b / a) * x1;
39 y = x1;
40
41 return d;
42 }
43
44 public Int64 powmod(Int64 a, Int64 b, Int64 k)
45 {
46 Int64 result = 1;
47 while (b != 0)
48 {
49 if ((b & 1) == 1) result = (result * a) % k;
50 b >>= 1;
51 a = (a * a) % k;
52 }
53 return result;
54 }
55
56 public bool isPrime(Int64 num)
57 {
58
59 for (Int64 i = 2; i <= (Int64)Math.Sqrt(num); ++i)
60 {
61 if ((num % i) == 0)
62 {
63 return false;
64 }
65 }
66 return true;
67 }
68
69 public Int64 genPrime(Int64 upper, Int64 lower, Random rand)
70 {
71 Int64 a; do a = (rand.Next((Int32)(upper - lower)) + lower); while (!isPrime(a));
72 return a;
73 }
74
75 private void init()
76 {
77
78 }
79
80 private void button1_Click(object sender, EventArgs e)
81 {
82 Random rand = new Random();
83 string cout;
84 Int64 p, q;
85
86
87 int playersNum = Convert.ToInt32(textBox1.Text);
88 if ((playersNum < 2) || (playersNum > 23)) {
89 MessageBox.Show("ЧиÑло игроков должно быть в диапазоне от 2 до 23!");
90 return;
91 }
92
93
94 do
95 {
96 do q = (rand.Next((int)(Math.Pow(10, 9)) / 2)); while (!isPrime(q));
97 p = 2 * q + 1;
98 } while (!isPrime(p));
99
100 cout = "p - " + p.ToString() + "\r\n";
101
102
103 List<Player> players = new List<Player>();
104 for (int i = 0; i < playersNum; i++) players.Add(new Player());
105
106
107 List<Int64> deck = new List<Int64>(); for (int i = 2; i < 54; i++) deck.Add(i);
108
109 Dictionary<long, string> cards = new Dictionary<long, string>();
110 cards.Add(2, "Два Черви");
111 cards.Add(3, "Три Черви");
112 cards.Add(4, "Четыре Черви");
113 cards.Add(5, "ПÑть Черви");
114 cards.Add(6, "ШеÑть Черви");
115 cards.Add(7, "Семь Черви");
116 cards.Add(8, "ВоÑемь Черви");
117 cards.Add(9, "ДевÑть Черви");
118 cards.Add(10, "ДеÑÑть Черви");
119 cards.Add(11, "Валет Черви");
120 cards.Add(12, "Дама Черви");
121 cards.Add(13, "Король Черви");
122 cards.Add(14, "Туз Черви");
123 cards.Add(15, "Два Пики");
124 cards.Add(16, "Три Пики");
125 cards.Add(17, "Четыре Пики");
126 cards.Add(18, "ПÑть Пики");
127 cards.Add(19, "ШеÑть Пики");
128 cards.Add(20, "Семь Пики");
129 cards.Add(21, "ВоÑемь Пики");
130 cards.Add(22, "ДевÑть Пики");
131 cards.Add(23, "ДеÑÑть Пики");
132 cards.Add(24, "Валет Пики");
133 cards.Add(25, "Дама Пики");
134 cards.Add(26, "Король Пики");
135 cards.Add(27, "Туз Пики");
136 cards.Add(28, "Два КреÑти");
137 cards.Add(29, "Три КреÑти");
138 cards.Add(30, "Четыре КреÑти");
139 cards.Add(31, "ПÑть КреÑти");
140 cards.Add(32, "ШеÑть КреÑти");
141 cards.Add(33, "Семь КреÑти");
142 cards.Add(34, "ВоÑемь КреÑти");
143 cards.Add(35, "ДевÑть КреÑти");
144 cards.Add(36, "ДеÑÑть КреÑти");
145 cards.Add(37, "Валет КреÑти");
146 cards.Add(38, "Дама КреÑти");
147 cards.Add(39, "Король КреÑти");
148 cards.Add(40, "Туз КреÑти");
149 cards.Add(41, "Два Буби");
150 cards.Add(42, "Три Буби");
151 cards.Add(43, "Четыре Буби");
152 cards.Add(44, "ПÑть Буби");
153 cards.Add(45, "ШеÑть Буби");
154 cards.Add(46, "Семь Буби");
155 cards.Add(47, "ВоÑемь Буби");
156 cards.Add(48, "ДевÑть Буби");
157 cards.Add(49, "ДеÑÑть Буби");
158 cards.Add(50, "Валет Буби");
159 cards.Add(51, "Дама Буби");
160 cards.Add(52, "Король Буби");
161 cards.Add(53, "Туз Буби");
162
163 cout += "колода: ";
164 for (int i = 0; i < deck.Count(); i++)
165 {
166 if ((i % 5) == 0) cout += "\r\n";
167 cout += cards[deck[i]] + ", ";
168 }
169 cout += "\r\n\r\n";
170
171
172 for (int i = 0; i < players.Count(); i++) {
173 Int64 x, y;
174 var a = players[i];
175 do a.publickey = rand.Next((int)Math.Pow(10, 9)); while (nod(a.publickey, p - 1, out x, out y) != 1);
176 a.secretkey = (x < 0 ? x + p - 1 : x);
177 players[i] = a;
178 }
179
180
181 foreach(var a in players)
182 {
183 for (int i = 0; i < 20; i++)
184 {
185 int r1 = rand.Next(deck.Count()), r2 = rand.Next(deck.Count());
186 var b = deck[r1];
187 deck[r1] = deck[r2];
188 deck[r2] = b;
189 }
190
191
192 for (int i = 0; i < deck.Count(); i++)
193 {
194 var b = deck[i];
195 b = powmod(b, a.secretkey, p);
196 deck[i] = b;
197 }
198
199 }
200
201 cout += "Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð»Ð¾Ð´Ð°: ";
202 for (int i = 0; i < deck.Count(); i++)
203 {
204 if ((i % 10) == 0) cout += "\r\n";
205 cout += deck[i].ToString() + ", ";
206 }
207 cout += "\r\n\r\n";
208
209
210 for (int i = 0; i < players.Count(); i++)
211 {
212
213 var a = players[i];
214 a.cards = new List<Int64>();
215 a.openCards = new List<Int64>();
216
217
218 for (int j = 0; j < 2; j++)
219 {
220 a.cards.Add(deck[0]); deck.RemoveAt(0);
221 }
222 players[i] = a;
223 }
224
225
226 for (int i = 0; i < players.Count(); i++)
227 {
228 for (int j = 0; j < 2; j++)
229 {
230
231 var b = players[i].cards[j];
232 foreach (var a in players)
233 {
234 b = powmod(b, a.publickey, p);
235 }
236 players[i].openCards.Add(b);
237 }
238
239 }
240
241
242 for (int i = 0; i < players.Count; i++)
243 {
244 cout += "Игрок " + i.ToString() + ": ";
245 cout += "открытый ключ: " + players[i].publickey.ToString() + ", закрытый ключ: " + players[i].secretkey.ToString() + "\r\n";
246 cout += "карты: ";
247 for (int j = 0; j < players[i].cards.Count; j++)
248 {
249 cout += players[i].cards[j].ToString() + " -> " + cards[players[i].openCards[j]] + ", ";
250 }
251 cout += "\r\n\r\n";
252 }
253
254 List<Int64> table = new List<Int64>();
255 List<Int64> openTable = new List<Int64>();
256
257
258 for (int i = 0; i < 5; i++)
259 {
260 table.Add(deck[0]); deck.RemoveAt(0);
261 }
262
263
264
265 for (int i = 0; i < table.Count(); i++)
266 {
267 var b = table[i];
268 foreach (var a in players)
269 {
270 b = powmod(b, a.publickey, p);
271
272 }
273 openTable.Add(b);
274 }
275
276 cout += "карты на Ñтоле: ";
277 for (int j = 0; j < table.Count(); j++)
278 {
279 cout += table[j].ToString() + " -> " + cards[openTable[j]] + ", ";
280 }
281 cout += "\r\n";
282
283
284
285
286
287
288 List<Int64> table1 = new List<Int64>();
289 List<Int64> openTable1 = new List<Int64>();
290 int playersNum1 = Convert.ToInt32(textBox1.Text);
291
292 if (playersNum1 == 23)
293 {
294
295
296
297 for (int i = 0; i < 1; i++)
298 {
299 table1.Add(deck[0]); deck.RemoveAt(0);
300 }
301
302
303
304 for (int i = 0; i < table1.Count(); i++)
305 {
306 var b = table1[i];
307 foreach (var a in players)
308 {
309 b = powmod(b, a.publickey, p);
310
311 }
312 openTable1.Add(b);
313 }
314
315 cout += "оÑтавщаÑÑÑ ÐºÐ°Ñ€Ñ‚Ð°: ";
316 for (int j = 0; j < table1.Count(); j++)
317 {
318 cout += table1[j].ToString() + " -> " + cards[openTable1[j]] + ", ";
319 }
320 cout += "\r\n";
321 }
322 textBox2.Text = cout;
323 }
324
325 private void Form4_Load(object sender, EventArgs e)
326 {
327
328 }
329
330 private void textBox2_TextChanged(object sender, EventArgs e)
331 {
332
333 }
334 }
335}