-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
138 lines (114 loc) · 3.63 KB
/
main.py
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
import random
def isPrime(num):
counter = abs(num) // 2
if (counter == 1):
return True
while (counter > 1):
if (num % counter == 0):
return False
counter -= 1
return True
def Multipliers(num):
ls = []
num = abs(num)
while num != 1:
i = num // 2 + 1
print(f'i на итерации {i}')
if (i == 1):
break
while i != 1:
if num % i == 0:
ls.append(i)
break
i -= 1
num /= i
print(f'Найден множитель {i}')
print(f'Финальный список множителей: {ls}')
return ls
def Checker(num):
j = 2
flag = False
while True:
for i in range(1, num - 1):
if (j ** i % num == 0):
flag = False
break
else:
flag = True
if (flag):
return j
j += 1
pass
class Abonent:
def __init__(self, name, p, g):
self.name = name
self.x = self.chooseX(p)
self.y = g ** self.x % p
def chooseX(self, p):
return random.randint(1, p - 1)
def choose_sessionK(self, p):
self.k = random.randint(2, p - 2)
return self.k
pass
def main():
while True:
q = random.randint(50, 1000)
p = 2 * q + 1
if not isPrime(q) or not isPrime(p):
# print(f'Число q и/или p не простое число!')
continue
else:
break
print(f'p: {p}, q: {q}')
g = -1
for i in range(2, p - 1):
if i ** q % p != 1:
g = i
break
if g == -1:
print(f'Число g найти не удалось :(')
exit(-1)
print(f'p: {p}, q: {q}, g: {g}')
abonents = []
Abont1 = Abonent('Abonent1', p, g)
abonents.append(Abont1)
Abont2 = Abonent('Abonent2', p, g)
abonents.append(Abont2)
print(f'{Abont1.name}: '
f'p:{p}, g:{g}, x:{Abont1.x}, y:{Abont1.y}, session key: пока неизвестен')
print(f'{Abont2.name}: '
f'p:{p}, g:{g}, x:{Abont2.x}, y:{Abont2.y}, session key: пока неизвестен')
to_enc = r"some really cool m6ss4g6"
print(f'Изначальный текст: {to_enc}')
if len(to_enc) >= p:
print(f'Извините, сообщение слишком длинное для текущего p ({p})')
exit(-1)
to_enc = [ord(char) for char in to_enc.lower()]
print(f'Текст в виде цифр: {to_enc}')
for ab in abonents: # шифровка
ab.choose_sessionK(p)
ab.r = g ** ab.k % p
e = []
# e = (to_enc * ab.y ** ab.k) % p
for num in to_enc:
if (num == -64):
e.append(num)
continue
e.append((num * ab.y ** ab.k) % p)
ab.e = e
print(f'Abonent: {ab.name}, r:{ab.r}, e (шифротекст):{ab.e}')
# условный send_to_abonent(abonent)
for ab in abonents: # расшифровка
Mmod = []
for num in ab.e:
if num == -64:
Mmod.append(num)
continue
Mmod.append((num * ab.r ** (p - 1 - ab.x)) % p)
print(f'Абонент {ab.name}, полученные числа после расшифровки: {Mmod}')
decoded = [chr(n) for n in Mmod]
print(f'Абонент {ab.name}, полученный текст после расшифровки: {decoded}')
pass
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
main()