app.py 8.5 KB

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