Advertisement
Guest User

Код

a guest
Sep 13th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.71 KB | None | 0 0
  1. from random import choice
  2. from random import randrange as rnd
  3.  
  4. primeNumbers = (11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97)
  5.  
  6.  
  7. def generateKeys(primeNumbers, p=None, q=None, ):
  8.     # Случайным образом выбираем 2 простых числа p и q (Если они не заданы заранее)
  9.     if p is None:
  10.         p = choice(primeNumbers)
  11.     if q is None:
  12.         q = choice(primeNumbers)
  13.  
  14.     print(f"p = {p}, q = {q}")
  15.     # Вычисляется произведение n = p * q.
  16.     n = p * q
  17.     print(f"n = {n}")
  18.     # Вычисляется функция Эйлера φ(n)
  19.     fn = phi(p, q)
  20.     print(f"φ(n) = {fn}")
  21.     # Выбирается открытый ключ e, как произвольное число (0 < e < n),
  22.     # взаимно простое3 с результатом функции Эйлера (e ⊥ φ(n)).
  23.     e = coprime(fn, n)
  24.     print(f"e = {e}")
  25.  
  26.     # Вычисляется закрытый ключ d, как обратное число к e по модулю φ(n),
  27.     # из соотношения (d*e) mod φ(n) = 1.
  28.     d = reverseByMod(e, fn)
  29.     print(f"d = {d}")
  30.  
  31.     return (e, n), (d, n)
  32.  
  33.  
  34. def phi(p, q):
  35.     return (p - 1) * (q - 1)
  36.  
  37.  
  38. def reverseByMod(e, fn):
  39.     g = fn + 1
  40.     while (True):
  41.         if g % e == 0:
  42.             return int(g / e)
  43.         g += fn
  44.  
  45.  
  46. def coprime(a, n):
  47.     # Самым экономичным вариантом будет, если нам подойдёт простое число из списка
  48.     for i in primeNumbers:
  49.         if gcd(a, i) == 1:
  50.             return i
  51.  
  52.     # Если же этого не произошло - будем перебирать всё
  53.     return __coprime(a, n)
  54.  
  55.  
  56. def __coprime(a, n):
  57.     for i in range(1, n):
  58.         if gcd(a, i) == 1:
  59.             return i
  60.     raise Exception("Числа e не существует! Проверьте корректность данных!")
  61.  
  62.  
  63. def gcd(a, b):
  64.     return abs(a) if b == 0 else gcd(b, a % b)
  65.  
  66.  
  67. def genPays(maxSumPayment):
  68.     a = maxSumPayment // rnd(7, 15)
  69.     maxSumPayment -= a
  70.     b = maxSumPayment // rnd(3, 7)
  71.     maxSumPayment -= b
  72.     return a, b, maxSumPayment
  73.  
  74.  
  75. def crypt(a, key):
  76.     return a ** key[0] % key[1]
  77.  
  78.  
  79. if __name__ == "__main__":
  80.     maxSumPayment = primeNumbers[0] * primeNumbers[1]
  81.  
  82.     y_p, s_p, d_p = genPays(maxSumPayment - 50)
  83.  
  84.     print("Уборщица генерирует ключ: ")
  85.     Y = generateKeys(primeNumbers)
  86.     print(f"Открытый ключ Уборщицы: {Y[0]}\nЗакрытый ключ Уборщицы: {Y[1]}\n")
  87.  
  88.     print("Секретарь генерирует ключ: ")
  89.     S = generateKeys(primeNumbers)
  90.     print(f"Открытый ключ Секретаря: {S[0]}\nЗакрытый ключ Секретаря: {S[1]}\n")
  91.  
  92.     print("Директор генерирует ключ: ")
  93.     D = generateKeys(primeNumbers)
  94.     print(f"Открытый ключ Директора: {D[0]}\nЗакрытый ключ Директора: {D[1]}\n")
  95.  
  96.     x = rnd(1, 25)
  97.  
  98.     print(f"Зарплата уборщицы - {y_p}. Она прибавляет к ней случайное число x = {x} и шифрует открытым ключом секретаря {S[0]}:")
  99.     t1=y_p + x
  100.     t = crypt(t1, S[0])
  101.  
  102.     print(f"{t1} => {t}")
  103.  
  104.     print(f"Секретарь получает сообщение и расшифровывает его своим закрытым ключом {S[1]}:")
  105.     t1 = t
  106.     t = crypt(t, S[1])
  107.     print(f"{t1} => {t}")
  108.  
  109.     print(f"Зарплата секретаря - {s_p}. Она прибавляет ее к {t} и шифрует открытым ключом директора {D[0]}:")
  110.     t1=t + s_p
  111.     t = crypt(t1, D[0])
  112.     print(f"{t1} => {t}")
  113.  
  114.     print(f"Директор получает сообщение и расшифровывает его своим закрытым ключом {D[1]}:")
  115.     t1 = t
  116.     t = crypt(t, D[1])
  117.     print(f"{t1} => {t}")
  118.  
  119.     print(f"Зарплата директора - {d_p}. Она прибавляет ее к {t} и шифрует открытым ключом уборщицы {Y[0]}:")
  120.     t1=t+d_p
  121.     t = crypt(t1, Y[0])
  122.     print(f"{t1} => {t}")
  123.  
  124.     print(f"Уборщица получает сообщение и расшифровывает его своим закрытым ключом {Y[1]}:")
  125.     t1 = t
  126.     t = crypt(t, Y[1])
  127.     print(f"{t1} => {t}")
  128.  
  129.     print (f"Затем убирает загаданное число {t} - {x} = {t-x} и оглашает, \nчто средняя зарплата в организации равна {(t-x)/3:.2f}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement