-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
241 lines (221 loc) · 9 KB
/
Program.cs
File metadata and controls
241 lines (221 loc) · 9 KB
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
using LevLab;
using System;
using System.Collections.Generic;
using System.Xml;
namespace LevLab
{
class RSA
{
char[] characters = new char[] { '#', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И',
'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С',
'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ъ',
'Э', 'Ю', 'Я', ' ', '1', '2', '3', '4', '5', '6', '7',
'8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
public string MakeRSA(BigInt p, BigInt q, string str)
{
var inputStr = str.ToUpper();
if (p.IsSimple() && q.IsSimple())
{
var n = p * q;
var m = ((p - BigInt.one) * (q - BigInt.one));
var e = FindE(m);
var d = BigInt.AModBInverse(e, m);
var encodeRes = Encode(inputStr, e, n);
var decodeRes = Decode(encodeRes, d, n);
Console.WriteLine(decodeRes);
return decodeRes;
}
else
Console.WriteLine("p или q не простые числа");
return "";
}
private string Decode(List<string> encodeRes, BigInt d, BigInt n)
{
var res = "";
foreach (var e in encodeRes)
{
var b = new BigInt(e);
b = BigInt.Pow(b,d);
b = b % n;
var index = Convert.ToInt32(b.ToString());
res += characters[index].ToString();
}
return res;
}
private List<string> Encode(string s, BigInt e, BigInt n)
{
var res = new List<string>();
for (var i = 0; i < s.Length; i++)
{
var index = Array.IndexOf(characters, s[i]);
var r = new BigInt(index);
r = BigInt.Pow(r, e);
r = r % n;
res.Add(r.ToString());
}
return res;
}
private BigInt FindE(BigInt m)//находим коэф e
{
var e = m - BigInt.one;
for (var i = new BigInt(2); i <= m; i += BigInt.one)
if ((m % i == BigInt.zero) && (e % i == BigInt.zero))
{
e -= BigInt.one;
i = BigInt.one;
}
return e;
}
}
}
class Program
{
static void Main(string[] args)
{
var a = new BigInt();
if (a.Sign != Sign.Plus || a.number.Equals(new List<int>()))
Console.WriteLine("Ошибка конструктора 1");
var b = new BigInt("+123");
if (b.Sign != Sign.Plus || b.number.Equals(new List<int>() { 1, 2, 3 }))
Console.WriteLine("Ошибка конструктора 2");
var c = new BigInt("123");
if (c.Sign != Sign.Plus || a.number.Equals(new List<int>() { 1, 2, 3 }))
Console.WriteLine("Ошибка конструктора 3");
var d = new BigInt("-123");
if (d.Sign != Sign.Minus || d.number.Equals(new List<int>() { 1, 2, 3 }))
Console.WriteLine("Ошибка конструктора 4");
var e = new BigInt('-', new List<int>() { 1, 2, 3 });
if (e.Sign != Sign.Minus || e.number.Equals(new List<int>() { 1, 2, 3 }))
Console.WriteLine("Ошибка конструктора 5");
var f = new BigInt("54321");
var g = new BigInt("12345");
var h = new BigInt("-123");
var i = new BigInt("100");
var j = new BigInt("-54321");
var k = BigInt.zero;
// var i = f + g;//66666
//var j = f + h;//12222
//Сложение тест
var s1 = f + g;
if (s1.ToString() != "66666")
Console.WriteLine("Ошибка сложения 1");
var s2 = f + h;
if (s2.ToString() != "54198")
Console.WriteLine("Ошибка сложения 2");
var s3 = f + i;
if (s3.ToString() != "54421")
Console.WriteLine("Ошибка сложения 3");
var s4 = j + i;
if (s4.ToString() != "-54221")
Console.WriteLine("Ошибка сложения 4");
var s5 = g + j;
if (s5.ToString() != "-41976")
Console.WriteLine("Ошибка сложения 4");
//Вычитание тест
var sub1 = f - g;
if (sub1.ToString() != "41976")
Console.WriteLine("Ошибка вычитания 1");
var sub2 = f - h;
if (sub2.ToString() != "54444")
Console.WriteLine("Ошибка вычитания 2");
var sub3 = f - j;
if (sub3.ToString() != "108642")
Console.WriteLine("Ошибка вычитания 3");
var sub4 = j - h;
if (sub4.ToString() != "-54444")
Console.WriteLine("Ошибка вычитания 4");
var sub5 = g - j;
if (sub5.ToString() != "66666")
Console.WriteLine("Ошибка вычитания 5");
//Умножение тест
var m1 = f * g;
if (m1.ToString() != "670592745")
Console.WriteLine("Ошибка умножения 1");
var m2 = f * h;
if (m2.ToString() != "-6681483")
Console.WriteLine("Ошибка умножения 2");
var m3 = h * i;
if (m3.ToString() != "-12300")
Console.WriteLine("Ошибка умножения 3");
var m4 = g * k;
if (m4.ToString() != "0")
Console.WriteLine("Ошибка умножения 4");
var m5 = g * j;
if (m5.ToString() != "-670592745")
Console.WriteLine("Ошибка умножения 5");
//Деление тест
var d1 = f / g;
if (d1.ToString() != "4")
Console.WriteLine("Ошибка деления 1");
var d2 = g / i;
if (d2.ToString() != "123")
Console.WriteLine("Ошибка деления 2");
var d3 = j / i;
if (d3.ToString() != "-543")
Console.WriteLine("Ошибка деления 3");
var d4 = j % i;
if (d4.ToString() != "21")
Console.WriteLine("Ошибка деления 4");
var d5 = f % g;
if (d5.ToString() != "4941")
Console.WriteLine("Ошибка деления 5");
var d6 = g % h;
if (d6.ToString() != "45")
Console.WriteLine("Ошибка деления 6");
var d7 = h % g;
if (d7.ToString() != "123")
Console.WriteLine("Ошибка деления 7");
var d8 = i / g;
if (d8.ToString() != "0")
Console.WriteLine("Ошибка деления 8");
var d9 = new BigInt(143) % new BigInt(72);
if (d9.ToString() != "71")
Console.WriteLine("Ошибка деления 9");
//Проверка на простое число тест
var simple1 = new BigInt(3);
if (!simple1.IsSimple())
Console.WriteLine("Ошибка простые числа 1");
var simple2 = new BigInt(37);
if (!simple2.IsSimple())
Console.WriteLine("Ошибка простые числа 2");
var simple3 = new BigInt(103);
if (!simple3.IsSimple())
Console.WriteLine("Ошибка простые числа 3");
var simple4 = new BigInt(179);
if (!simple4.IsSimple())
Console.WriteLine("Ошибка простые числа 4");
var simple5 = new BigInt(28);
if (simple5.IsSimple())
Console.WriteLine("Ошибка простые числа 5");
//RSA тест
var rsa1 = new RSA();
var rs1 = rsa1.MakeRSA(new BigInt(13), new BigInt(7), "test");
if (rs1 != "TEST")
Console.WriteLine("Ошибка RSA 1");
var rsa2 = new RSA();
var rs2 = rsa1.MakeRSA(new BigInt(7), new BigInt(17), "lab rabota");
if (rs2 != "LAB RABOTA")
Console.WriteLine("Ошибка RSA 2");
//-----------------------------------------------------------
var p = "";
var q = "";
var str = "";
var xDoc = new XmlDocument();
xDoc.Load("lab1.xml");
var xRoot = xDoc.DocumentElement;
foreach (XmlNode xNode in xRoot)
{
if (xNode.Name == "q")
q = xNode.InnerText;
if (xNode.Name == "p")
p = xNode.InnerText;
if (xNode.Name == "text")
str = xNode.InnerText;
}
var rsa = new RSA();
rsa.MakeRSA(new BigInt(p), new BigInt(q), str);
Console.ReadKey();
}
}