· 6 years ago · May 25, 2019, 02:24 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 Form5 : Form
14 {
15
16 // клаÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸ Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñми
17 public CryptoLib lib = new CryptoLib();
18
19 public Form5()
20 {
21 InitializeComponent();
22 }
23
24 private void button1_Click(object sender, EventArgs e)
25 {
26 Random rand = new Random();
27 String cout = "";
28
29
30
31
32 // генерируем голоÑ
33 Int64 Vote = rand.Next(10);
34
35 cout += "Ð³Ð¾Ð»Ð¾Ñ = " + Vote.ToString() + "\r\n";
36
37 // припиÑываем Ñлучайное чиÑло к нему
38 Vote = Vote + (rand.Next(100000000) * 10);
39 cout += "rnd|Ð³Ð¾Ð»Ð¾Ñ = " + Vote.ToString() + "\r\n";
40
41 // хеш голоÑа
42 Int64 Hash = (Vote * 831242187) % 100000000;
43 cout += "хеш голоÑа = " + Hash.ToString() + "\r\n";
44
45 Int64 N, publickey, secretKey, phi;
46 Int64 p, q;
47
48 do
49 {
50 p = lib.genPrime(1000000, 1, rand);
51 q = lib.genPrime(1000000, 1, rand);
52
53 N = p * q;
54 } while ((N <= Hash) || (N >= 1000000000));
55
56 phi = (p - 1) * (q - 1);
57
58 Int64 x, y;
59 do publickey = rand.Next(1000000000); while (lib.nod(publickey, phi, out x, out y) != 1);
60 secretKey = (x < 0 ? x + phi : x);
61
62 cout += "p = " + p.ToString() + ", q = " + q.ToString() + ", n = " + N.ToString() + ", phi = " + phi.ToString() + "\r\n";
63 cout += "открытый ключ = " + publickey.ToString() + ", закрытый ключ = " + secretKey.ToString() + "\r\n";
64
65 // генерируем r
66 Int64 r, r_obr;
67
68 do r = rand.Next(1000000000); while (lib.nod(r, N, out x, out y) != 1);
69 r_obr = (x > 0 ? x : x + N);
70
71 cout += "r = " + r_obr.ToString() + ", обратное r = " + r_obr.ToString() + "\r\n";
72
73 // вычиÑлÑем /h
74 Int64 hash_obr = (Hash * lib.powmod(r, publickey, N)) % N;
75 cout += "/h = " + hash_obr.ToString() + "\r\n";
76
77 // отдаем /s
78 Int64 s_obr = lib.powmod(hash_obr, secretKey, N);
79 cout += "/s = " + s_obr.ToString() + "\r\n";
80
81 // подпиÑываем бюллетень
82 Int64 s = (s_obr * r_obr) % N;
83 cout += "s = " + s.ToString() + "\r\n";
84
85 // проверим хеш
86 Int64 verifiedhash = lib.powmod(s, publickey, N);
87 cout += "прверочный хеш = " + verifiedhash.ToString() + ((verifiedhash == Hash) ? " - Ñовпадают" : " не Ñовпадает") + "\r\n\r\n";
88
89 textBox2.Text = cout;
90
91
92
93 }
94 }
95}