123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- import sys
- sys.path.insert(0, 'c:\\users\\icewi\\appdata\\local\\programs\\python\\python310\\lib\\site-packages')
- #print(sys.path)
- from curve import Curve
- import tools, random
- # Глобальные переменные эллептической кривой и пользовательских ключей
- cur = None
- p1KeyPriv = p1KeyPub = None
- p2KeyPriv = p2KeyPub = None
- # Проверка ввода целого числа
- def readInteger(text):
- if len(text) > 0:
- text += ': '
- try:
- return int(input(text))
- except:
- return None
- # Цикличная проверка ввода целого числа
- def readIntregerCycle(text):
- res = None
- while res is None:
- res = readInteger(text)
- if res is None:
- print('Укажите целое число')
- return res
- # Установка точки g эллиптической кривой
- def setupG(g):
- cur.g = g
- print('Точка g установлена. Вычисляется порядок подгруппы. Пожалуйста, подождите.')
- cur.setupN()
- input('Порядок подгруппы вычислен. Для продолжания нажмите ввод. ')
- # Вывод информции об эллиптической кривой
- def curveInfo():
- print('Эллиптическая кривая:')
- if cur == None:
- print('Не определена')
- return
- print('Уравнение: y² = x³ + {}x + {}'.format(cur.a, cur.b))
- print('Размер конечного поля: {}'.format(cur.p))
- if cur.g.isNone():
- print('Точка g не определена')
- else:
- print('Точка g: ({}, {})'.format(cur.g.x, cur.g.y))
- if cur.n is None:
- print('Порядок подгруппы (n) не определен')
- else:
- print('Порядок подгруппы (n): {}'.format(cur.n))
- print('>>>>>>>>>>>>>>>>>>>>>>>>>')
- if p1KeyPriv is None:
- print('Пары ключей пользователей не определены')
- else:
- print('Пары ключей пользователей сгенерированы')
- print('Пользователь 1 - priv: {}, pub ({}, {})'.format(p1KeyPriv, p1KeyPub.x, p1KeyPub.y))
- print('Пользователь 2 - priv: {}, pub ({}, {})'.format(p2KeyPriv, p2KeyPub.x, p2KeyPub.y))
- print('>>>>>>>>>>>>>>>>>>>>>>>>>')
- # Инициализиция эллиптической кривой
- def initCurve():
- global cur
- a = b = p = None
- print('Укажите параметры эллиптической кривой:')
- while True:
- a = readIntregerCycle('a (коэффицент, целое число)')
- b = readIntregerCycle('b (коэффицент, целое число)')
- if tools.isCurveSingular(a, b):
- mes = 'Кривая сингулярна (4a³ + 27b² = 0). Указать новые параметры кривой? [y/n] '
- answ = input(mes)
- if answ.lower() != 'y':
- return
- else:
- break
- while True:
- p = readIntregerCycle('p (размер конечного поля, целое простое число, минимум 17)')
- if p < 17:
- print('Минимальное значение: 17')
- continue
- pp = tools.searchPrime(p)
- if p != pp:
- print('Число [{}] не является простым. Ближайшее простое число - [{}]'.format(p, pp))
- answ = input('Установить число [{}] в качестве p эллептической кривой? [y/n] '.format(pp))
- if answ.lower() == 'y':
- p = pp
- break
- else:
- break
- cur = Curve(p, a, b)
- # Обработка ввода в главном меню
- def readMainMenu():
- global cur
- global p1KeyPriv
- global p1KeyPub
- global p2KeyPriv
- global p2KeyPub
- num = readInteger('>> ')
- if num == 9:
- exit(0)
- if cur is None:
- if num == 1:
- initCurve()
- else:
- if num == 1:
- cur = None
- p1KeyPriv = p1KeyPub = None
- p2KeyPriv = p2KeyPub = None
- return
- if cur.g.isNone():
- if num == 2:
- print('Вычисляется точка g. Пожалуйста, подождите.')
- cur.setupGAuto()
- setupG(cur.g)
- elif num == 3:
- while True:
- x = readIntregerCycle('Укажите x (целое число)')
- y = readIntregerCycle('Укажите y (целое число)')
- p = cur.point(x, y)
- if not p.isInCurve():
- answ = input('Точка ({}, {}) не расположена на данной кривой. Указать другую точку? (y/n): '.format(p.x, p.y))
- if answ.lower() != 'y':
- break
- else:
- setupG()
- break
- elif num == 4:
- rnd = random.randrange(1, cur.p - 1)
- p1, p2 = cur.searchClosePoints(rnd)
- print(p1.coords(), p2.coords())
- readMainMenu()
- else:
- if p1KeyPriv is None:
- if num == 2:
- print('Генерация ключей для пользователя 1...')
- p1KeyPriv, p1KeyPub = cur.randomKeypair()
- print('Готово. p1KeyPriv: {}, p1KeyPub ({}, {})'.format(p1KeyPriv, p1KeyPub.x, p1KeyPub.y))
- print('Генерация ключей для пользователя 2...')
- p2KeyPriv, p2KeyPub = cur.randomKeypair()
- print('Готово. p2KeyPriv: {}, p2KeyPub ({}, {})'.format(p2KeyPriv, p2KeyPub.x, p1KeyPub.y))
- else:
- if num == 2:
- message = ""
- while True:
- message = input('Введите текстовое сообщение: ')
- if len(message) == 0:
- print('Сообщение пустое. Введите непустое сообщение.')
- else:
- break
- print(p1KeyPriv, p2KeyPub)
- p1KeySecret = cur.pointSecret(p1KeyPriv, p2KeyPub)
- print('Секретный ключ пользователя 1: ({}, {})'.format(p1KeySecret.x, p1KeySecret.y))
- p2KeySecret = cur.pointSecret(p2KeyPriv, p1KeyPub)
- print('Секретный ключ пользователя 2: ({}, {})'.format(p2KeySecret.x, p2KeySecret.y))
- p1MessageEncrypted = cur.encodeMessage(p1KeySecret, message)
- print("Зашифрованное сообщение пользователем 1: {}".format(p1MessageEncrypted))
- p1MessageDecrypted = cur.decodeMessage(p2KeySecret, p1MessageEncrypted)
- print("Расшифрованное сообщение пользователем 2: {}".format(p1MessageDecrypted))
- input('Демонстрация завершена. Для продолжения нажмите ввод.')
- # Вывод главного меню
- def mainMenu():
- curveInfo()
- print('')
- print('Укажите пункт меню:')
- if cur is None:
- print('1) Определить эллиптическую кривую')
- else:
- print('1) Сбросить параметры эллептической кривой')
- if cur.g.isNone():
- print('2) Установить случайную точку g')
- print('3) Указать координату точки g вручную')
- print('4) Найти и показать случайную пару точек')
- else:
- if p1KeyPriv is None:
- print('2) Сгенерировать ключевые пары пользователей')
- else:
- print('2) Демонстрация работы шифрования')
- print('9) Выход из программы')
- readMainMenu()
- print('')
- print('+++++++++++++++++++++++++++++++++')
- print('')
- # Главный цикл программы
- while True:
- mainMenu()
|