Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from random import choice
- from random import randrange as rnd
- primeNumbers = (11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97)
- def generateKeys(primeNumbers, p=None, q=None, ):
- # Случайным образом выбираем 2 простых числа p и q (Если они не заданы заранее)
- if p is None:
- p = choice(primeNumbers)
- if q is None:
- q = choice(primeNumbers)
- print(f"p = {p}, q = {q}")
- # Вычисляется произведение n = p * q.
- n = p * q
- print(f"n = {n}")
- # Вычисляется функция Эйлера φ(n)
- fn = phi(p, q)
- print(f"φ(n) = {fn}")
- # Выбирается открытый ключ e, как произвольное число (0 < e < n),
- # взаимно простое3 с результатом функции Эйлера (e ⊥ φ(n)).
- e = coprime(fn, n)
- print(f"e = {e}")
- # Вычисляется закрытый ключ d, как обратное число к e по модулю φ(n),
- # из соотношения (d*e) mod φ(n) = 1.
- d = reverseByMod(e, fn)
- print(f"d = {d}")
- return (e, n), (d, n)
- def phi(p, q):
- return (p - 1) * (q - 1)
- def reverseByMod(e, fn):
- g = fn + 1
- while (True):
- if g % e == 0:
- return int(g / e)
- g += fn
- def coprime(a, n):
- # Самым экономичным вариантом будет, если нам подойдёт простое число из списка
- for i in primeNumbers:
- if gcd(a, i) == 1:
- return i
- # Если же этого не произошло - будем перебирать всё
- return __coprime(a, n)
- def __coprime(a, n):
- for i in range(1, n):
- if gcd(a, i) == 1:
- return i
- raise Exception("Числа e не существует! Проверьте корректность данных!")
- def gcd(a, b):
- return abs(a) if b == 0 else gcd(b, a % b)
- def genPays(maxSumPayment):
- a = maxSumPayment // rnd(7, 15)
- maxSumPayment -= a
- b = maxSumPayment // rnd(3, 7)
- maxSumPayment -= b
- return a, b, maxSumPayment
- def crypt(a, key):
- return a ** key[0] % key[1]
- if __name__ == "__main__":
- maxSumPayment = primeNumbers[0] * primeNumbers[1]
- y_p, s_p, d_p = genPays(maxSumPayment - 50)
- print("Уборщица генерирует ключ: ")
- Y = generateKeys(primeNumbers)
- print(f"Открытый ключ Уборщицы: {Y[0]}\nЗакрытый ключ Уборщицы: {Y[1]}\n")
- print("Секретарь генерирует ключ: ")
- S = generateKeys(primeNumbers)
- print(f"Открытый ключ Секретаря: {S[0]}\nЗакрытый ключ Секретаря: {S[1]}\n")
- print("Директор генерирует ключ: ")
- D = generateKeys(primeNumbers)
- print(f"Открытый ключ Директора: {D[0]}\nЗакрытый ключ Директора: {D[1]}\n")
- x = rnd(1, 25)
- print(f"Зарплата уборщицы - {y_p}. Она прибавляет к ней случайное число x = {x} и шифрует открытым ключом секретаря {S[0]}:")
- t1=y_p + x
- t = crypt(t1, S[0])
- print(f"{t1} => {t}")
- print(f"Секретарь получает сообщение и расшифровывает его своим закрытым ключом {S[1]}:")
- t1 = t
- t = crypt(t, S[1])
- print(f"{t1} => {t}")
- print(f"Зарплата секретаря - {s_p}. Она прибавляет ее к {t} и шифрует открытым ключом директора {D[0]}:")
- t1=t + s_p
- t = crypt(t1, D[0])
- print(f"{t1} => {t}")
- print(f"Директор получает сообщение и расшифровывает его своим закрытым ключом {D[1]}:")
- t1 = t
- t = crypt(t, D[1])
- print(f"{t1} => {t}")
- print(f"Зарплата директора - {d_p}. Она прибавляет ее к {t} и шифрует открытым ключом уборщицы {Y[0]}:")
- t1=t+d_p
- t = crypt(t1, Y[0])
- print(f"{t1} => {t}")
- print(f"Уборщица получает сообщение и расшифровывает его своим закрытым ключом {Y[1]}:")
- t1 = t
- t = crypt(t, Y[1])
- print(f"{t1} => {t}")
- print (f"Затем убирает загаданное число {t} - {x} = {t-x} и оглашает, \nчто средняя зарплата в организации равна {(t-x)/3:.2f}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement