app.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. from curve import Curve
  2. import tools, random
  3. # Глобальные переменные эллептической кривой и пользовательских ключей
  4. cur = None
  5. p1KeyPriv = p1KeyPub = None
  6. p2KeyPriv = p2KeyPub = None
  7. # Проверка ввода целого числа
  8. def readInteger(text):
  9. if len(text) > 0:
  10. text += ': '
  11. try:
  12. return int(input(text))
  13. except:
  14. return None
  15. # Цикличная проверка ввода целого числа
  16. def readIntregerCycle(text):
  17. res = None
  18. while res is None:
  19. res = readInteger(text)
  20. if res is None:
  21. print('Укажите целое число')
  22. return res
  23. # Установка точки g эллиптической кривой
  24. def setupG(g):
  25. cur.g = g
  26. print('Точка g установлена. Вычисляется порядок подгруппы. Пожалуйста, подождите.')
  27. cur.setupN()
  28. input('Порядок подгруппы вычислен. Для продолжания нажмите ввод. ')
  29. # Вывод информции об эллиптической кривой
  30. def curveInfo():
  31. print('Эллиптическая кривая:')
  32. if cur == None:
  33. print('Не определена')
  34. return
  35. print('Уравнение: y² = x³ + {}x + {}'.format(cur.a, cur.b))
  36. print('Размер конечного поля: {}'.format(cur.p))
  37. if cur.g.isNone():
  38. print('Точка g не определена')
  39. else:
  40. print('Точка g: ({}, {})'.format(cur.g.x, cur.g.y))
  41. if cur.n is None:
  42. print('Порядок подгруппы (n) не определен')
  43. else:
  44. print('Порядок подгруппы (n): {}'.format(cur.n))
  45. print('>>>>>>>>>>>>>>>>>>>>>>>>>')
  46. if p1KeyPriv is None:
  47. print('Пары ключей пользователей не определены')
  48. else:
  49. print('Пары ключей пользователей сгенерированы')
  50. print('Пользователь 1 - priv: {}, pub ({}, {})'.format(p1KeyPriv, p1KeyPub.x, p1KeyPub.y))
  51. print('Пользователь 2 - priv: {}, pub ({}, {})'.format(p2KeyPriv, p2KeyPub.x, p2KeyPub.y))
  52. print('>>>>>>>>>>>>>>>>>>>>>>>>>')
  53. # Инициализиция эллиптической кривой
  54. def initCurve():
  55. global cur
  56. a = b = p = None
  57. print('Укажите параметры эллиптической кривой:')
  58. while True:
  59. a = readIntregerCycle('a (коэффицент, целое число)')
  60. b = readIntregerCycle('b (коэффицент, целое число)')
  61. if tools.isCurveSingular(a, b):
  62. mes = 'Кривая сингулярна (4a³ + 27b² = 0). Указать новые параметры кривой? [y/n] '
  63. answ = input(mes)
  64. if answ.lower() != 'y':
  65. return
  66. else:
  67. break
  68. while True:
  69. p = readIntregerCycle('p (размер конечного поля, целое простое число)')
  70. pp = tools.searchPrime(p)
  71. if p != pp:
  72. print('Число [{}] не является простым. Ближайшее простое число - [{}]'.format(p, pp))
  73. answ = input('Установить число [{}] в качестве p эллептической кривой? [y/n] '.format(pp))
  74. if answ.lower() == 'y':
  75. p = pp
  76. break
  77. else:
  78. break
  79. cur = Curve(p, a, b)
  80. # Обработка ввода в главном меню
  81. def readMainMenu():
  82. global cur
  83. global p1KeyPriv
  84. global p1KeyPub
  85. global p2KeyPriv
  86. global p2KeyPub
  87. num = readInteger('>> ')
  88. if num == 9:
  89. exit(0)
  90. if cur is None:
  91. if num == 1:
  92. initCurve()
  93. else:
  94. if num == 1:
  95. cur = None
  96. return
  97. if cur.g.isNone():
  98. if num == 2:
  99. print('Вычисляется точка g. Пожалуйста, подождите.')
  100. cur.setupGAuto()
  101. setupG(cur.g)
  102. elif num == 3:
  103. while True:
  104. x = readIntregerCycle('Укажите x (целое число)')
  105. y = readIntregerCycle('Укажите y (целое число)')
  106. p = cur.point(x, y)
  107. if not p.isInCurve():
  108. answ = input('Точка ({}, {}) не расположена на данной кривой. Указать другую точку? (y/n): '.format(p.x, p.y))
  109. if answ.lower() != 'y':
  110. break
  111. else:
  112. setupG()
  113. break
  114. elif num == 4:
  115. rnd = random.randrange(1, cur.p - 1)
  116. p1, p2 = cur.searchClosePoints(rnd)
  117. print(p1.coords(), p2.coords())
  118. readMainMenu()
  119. else:
  120. if p1KeyPriv is None:
  121. if num == 2:
  122. print('Генерация ключей для пользователя 1...')
  123. p1KeyPriv, p1KeyPub = cur.randomKeypair()
  124. print('Готово. p1KeyPriv: {}, p1KeyPub ({}, {})'.format(p1KeyPriv, p1KeyPub.x, p1KeyPub.y))
  125. print('Генерация ключей для пользователя 2...')
  126. p2KeyPriv, p2KeyPub = cur.randomKeypair()
  127. print('Готово. p2KeyPriv: {}, p2KeyPub ({}, {})'.format(p2KeyPriv, p2KeyPub.x, p1KeyPub.y))
  128. else:
  129. if num == 2:
  130. message = ""
  131. while True:
  132. message = input('Введите текстовое сообщение: ')
  133. if len(message) == 0:
  134. print('Сообщение пустое. Введите непустое сообщение.')
  135. else:
  136. break
  137. print(p1KeyPriv, p2KeyPub)
  138. p1KeySecret = cur.pointSecret(p1KeyPriv, p2KeyPub)
  139. print('Секретный ключ пользователя 1: ({}, {})'.format(p1KeySecret.x, p1KeySecret.y))
  140. p2KeySecret = cur.pointSecret(p2KeyPriv, p1KeyPub)
  141. print('Секретный ключ пользователя 2: ({}, {})'.format(p2KeySecret.x, p2KeySecret.y))
  142. p1MessageEncrypted = cur.encodeMessage(p1KeySecret, message)
  143. print("Зашифрованное сообщение пользователем 1: {}".format(p1MessageEncrypted))
  144. p1MessageDecrypted = cur.decodeMessage(p2KeySecret, p1MessageEncrypted)
  145. print("Расшифрованное сообщение пользователем 2: {}".format(p1MessageDecrypted))
  146. input('Демонстрация завершена. Для продолжения нажмите ввод.')
  147. # Вывод главного меню
  148. def mainMenu():
  149. curveInfo()
  150. print('')
  151. print('Укажите пункт меню:')
  152. if cur is None:
  153. print('1) Определить эллиптическую кривую')
  154. else:
  155. print('1) Сбросить параметры эллептической кривой')
  156. if cur.g.isNone():
  157. print('2) Установить случайную точку g')
  158. print('3) Указать координату точки g вручную')
  159. print('4) Найти и показать случайную пару точек')
  160. else:
  161. if p1KeyPriv is None:
  162. print('2) Сгенерировать ключевые пары пользователей')
  163. else:
  164. print('2) Демонстрация работы шифрования')
  165. print('9) Выход из программы')
  166. readMainMenu()
  167. print('')
  168. print('+++++++++++++++++++++++++++++++++')
  169. print('')
  170. # Главный цикл программы
  171. while True:
  172. mainMenu()