Добавил:
Novilit
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab2
.pyimport sys
from PyQt5.Qt import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import random
import hashlib
class NotRealNetwork:
'''буфер, симулирующий сеть'''
def __init__(self):
self.contact=dict()#здесь лежит информация про зарегистрированные объекты и их "почтовые ящики"
# потоки будут по очереди использовать этот словарь через блокировку
def enter(self, name):
'''Вход объекта в "сеть". Через имя объект может получить информацию о том,
что с ним хотят свяаться. Тогда в списке будет кортеж их имени отправителя и
содержания послания'''
if self.contact.get(name) is None:
self.contact[name]=[]
return True
else:
return False
def delete(self, name):
if self.contact.get(name) is None:
return False
else:
self.contact.pop(name)
return True
def write(self, send_name, rec_name, data):
'''Пишет в ящик получателя информацию и имя отправителя'''
if self.contact.get(rec_name) is None:
return False
else:
self.contact[rec_name].append((send_name, data))
return True
def read(self, name):
'''Выдаёт получателю следующий по очереди отправленный ему пакет, если он есть'''
if self.contact.get(name):
return self.contact[name].pop(0)
else:
return []
class Subject:
'''Субьект протокола, управляется пользователем'''
def __init__(self, name, web):
self.name=name
self.web=web
self.chap_twice_database=dict()
self.skey_database=dict()
def reg_web(self):
f=self.web.enter(self.name)
return f
def pap_auth_reg_inquiry(self, auth_system_name, login, password):
'''посылает запрос на регистрацию по паролю. Никакой доп защиты'''
send=dict()
send['nomination']='pap reg'
send['login']=login
send['password']=password
self.web.write(self.name, auth_system_name, send)
def pap_auth_result(self, auth_system_name, suc, fail):
'''проверяет результаты действия. suc - строка, возврат которо обозначает успех, fail - наоборот'''
obj=objs=self.web.read(self.name) #берём первое письмо и запоминаем
if not obj or obj is None: #если ничего не написали, то следующая попытка
return False
while not (obj[0]==auth_system_name and obj[1]['nomination']==suc): #другое письмо
if obj[0]==auth_system_name and obj[1]['nomination']==fail: #пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) #возвращаем ненужное письмо обратно в очередь
obj=self.web.read(self.name) #и берём следующее
if obj is objs: #если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
return True
def pap_auth_check_inquiry(self, auth_system_name, login, password):
send = dict()
send['nomination'] = 'pap auth'
send['login'] = login
send['password'] = password
f=self.web.write(self.name, auth_system_name, send)
return f
def chap_reg_inquiry(self, auth_system_name, login, password):
'''посылает запрос на регистрацию по паролю. Никакой доп защиты'''
send = dict()
send['nomination'] = 'chap reg'
send['login'] = login
send['password'] = password
self.web.write(self.name, auth_system_name, send)
def chap_reg_result(self, auth_system_name, suc, fail):
#############дубль
'''проверяет результаты действия. Возвращает ложь (неудача) или случайное число от системы аутентификации'''
obj = objs = self.web.read(self.name) # берём первое письмо и запоминаем
if not obj or obj is None: # если ничего не написали, то следующая попытка
return False
while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc): # другое письмо
if obj[0] == auth_system_name and obj[1]['nomination'] == fail: # пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) # возвращаем ненужное письмо обратно в очередь
obj = self.web.read(self.name) # и берём следующее
if obj is objs: # если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
return True
def chap_auth_check_inquiry(self, auth_system_name, login, is_twice=False):
send = dict()
send['login'] = login
if is_twice:
send['nomination'] = 'chap twice auth inquiry'
number=random.randint(0, 2000000)
send['number']=number
self.chap_twice_database[auth_system_name+'number']=number
self.web.write(self.name, auth_system_name, send)
return number
else:
send['nomination'] = 'chap auth inquiry'
f = self.web.write(self.name, auth_system_name, send)
return f
def chap_auth_check_inquiry_step_two(self, auth_system_name, suc, fail, login, password, is_twice=False):
obj = objs = self.web.read(self.name) # берём первое письмо и запоминаем
if not obj or obj is None: # если ничего не написали, то следующая попытка
return False
while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc): # другое письмо
if obj[0] == auth_system_name and obj[1]['nomination'] == fail: # пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) # возвращаем ненужное письмо обратно в очередь
obj = self.web.read(self.name) # и берём следующее
if obj is objs: # если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
number = obj[1]['number']
hashpass = hashlib.sha1(str(number).encode('utf-8'))
hashpass.update(str(password).encode("utf-8"))
send = dict()
send['login'] = login
send['hashpass'] = hashpass
if is_twice:
send['nomination']='chap twice auth pass'
hashpass1=obj[1]['hashpass']
hashpass2=hashlib.sha1(str(self.chap_twice_database[auth_system_name+'number']).encode('utf-8'))
hashpass2.update(str(self.chap_twice_database[auth_system_name]).encode('utf8'))
if hashpass1.hexdigest()==hashpass2.hexdigest():
self.web.write(self.name, auth_system_name, send)
return (hashpass.hexdigest(), number, hashpass1)
else:
return False
else:
send['nomination'] = 'chap auth pass'
self.web.write(self.name, auth_system_name, send)
return (hashpass.hexdigest(), number)
def chap_auth_check_inquiry_step_four(self, auth_system_name, suc, fail):
obj = objs = self.web.read(self.name) # берём первое письмо и запоминаем
if not obj or obj is None: # если ничего не написали, то следующая попытка
return False
while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc): # другое письмо
if obj[0] == auth_system_name and obj[1]['nomination'] == fail: # пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) # возвращаем ненужное письмо обратно в очередь
obj = self.web.read(self.name) # и берём следующее
if obj is objs: # если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
return True
def chap_twice_reg_inquiry(self, auth_system_name, login, password):
'''посылает запрос на регистрацию по паролю. Никакой доп защиты'''
send = dict()
send['nomination'] = 'chap twice reg'
send['login'] = login
send['password'] = password
self.web.write(self.name, auth_system_name, send)
def chap_twice_reg_result(self, auth_system_name, suc, fail):
'''проверяет результаты действия. Возвращает ложь (неудача) или случайное число от системы аутентификации'''
obj = objs = self.web.read(self.name) # берём первое письмо и запоминаем
if not obj or obj is None: # если ничего не написали, то следующая попытка
return False
while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc): # другое письмо
if obj[0] == auth_system_name and obj[1]['nomination'] == fail: # пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) # возвращаем ненужное письмо обратно в очередь
obj = self.web.read(self.name) # и берём следующее
if obj is objs: # если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
self.chap_twice_database[obj[1]['login']]=obj[1]['password']
return obj[1]
def skey_reg_inquiry(self, auth_system_name, login, password):
'''посылает запрос на регистрацию по паролю. Никакой доп защиты'''
send = dict()
send['nomination'] = 'skey reg'
send['login'] = login
send['password'] = password
self.skey_database[login]=password
self.web.write(self.name, auth_system_name, send)
def skey_reg_result(self, auth_system_name, suc, fail, slogin):
'''проверяет результаты действия. Возвращает ложь (неудача) или случайное число от системы аутентификации'''
obj = objs = self.web.read(self.name) # берём первое письмо и запоминаем
if not obj or obj is None: # если ничего не написали, то следующая попытка
return False
while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc): # другое письмо
if obj[0] == auth_system_name and obj[1]['nomination'] == fail: # пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) # возвращаем ненужное письмо обратно в очередь
obj = self.web.read(self.name) # и берём следующее
if obj is objs: # если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
password=self.skey_database[slogin].encode('utf-8')
k = hashlib.sha1(password)
k.update(str(obj[1]['number']).encode('utf-8'))
self.skey_database[slogin]=[]
for i in range(100):
self.skey_database[slogin].append(k.copy())
k.update(password)
self.skey_database[slogin].append(password)
return obj[1]
##
def skey_auth_check_inquiry(self, auth_system_name, login):
send = dict()
send['login'] = login
send['nomination'] = 'skey auth inquiry'
f = self.web.write(self.name, auth_system_name, send)
return f
def skey_auth_check_inquiry_step_two(self, auth_system_name, suc, fail, login):
obj = objs = self.web.read(self.name) # берём первое письмо и запоминаем
if not obj or obj is None: # если ничего не написали, то следующая попытка
return False
while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc): # другое письмо
if obj[0] == auth_system_name and obj[1]['nomination'] == fail: # пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) # возвращаем ненужное письмо обратно в очередь
obj = self.web.read(self.name) # и берём следующее
if obj is objs: # если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
tran= obj[1]['transaction']
hashpass=self.skey_database[login][100-tran]
'''k=[]
for i in self.skey_database[login][:99]:
if i!=b'qwerty':
k.append(i.hexdigest())'''
send = dict()
send['hashpass'] = hashpass
send['login']=login
send['nomination']='skey auth pass'
if tran==100:
send['getnext']=True
else:
send['getnext']=False
self.web.write(self.name, auth_system_name, send)
return (hashpass, tran)
def skey_auth_check_inquiry_step_four(self, auth_system_name, suc, fail, slogin):
obj = objs = self.web.read(self.name) # берём первое письмо и запоминаем
if not obj or obj is None: # если ничего не написали, то следующая попытка
return False
while not (obj[0] == auth_system_name and obj[1]['nomination'] == suc): # другое письмо
if obj[0] == auth_system_name and obj[1]['nomination'] == fail: # пришёл отказ - регистрация не удалать
return False
self.web.write(self.name, self.name, obj) # возвращаем ненужное письмо обратно в очередь
obj = self.web.read(self.name) # и берём следующее
if obj is objs: # если все письма уже перебрали, а нужного не нашли
break
else: # нашли нужное письмо!
if obj[1]['number']:
password = self.skey_database[slogin][101]
k = hashlib.sha1(password)
k.update(str(obj[1]['number']).encode('utf-8'))
self.skey_database[slogin] = []
for i in range(100):
self.skey_database[slogin].append(k.hexdigest())
k.update(password)
self.skey_database[slogin].append(password)
return True
class AuthSystem:
'''Аутентификационная система'''
def __init__(self, name, password, web):
self.name=name
self.password=password
self.web=web
self.pap_detabase=dict()
self.chap_detabase=dict()
self.chap_twice_database=dict()
self.skey_database=dict()
self.flag=True
self.data=[]
def reg_web(self):
f=self.web.enter(self.name)
return f
def del_web(self):
f=self.web.delete(self.name)
return f
def pap_auth_reg(self, name, obj):
send=dict()
if self.pap_detabase.get(obj['login']) is None:
self.pap_detabase[obj['login']]=obj['password']
send['nomination']='pap auth reg done'
self.web.write(self.name, name, send)
return True
else:
send['nomination']='pap auth reg fail'
self.web.write(self.name, name, send)
return False
def pap_auth_check(self, name, obj):
send=dict()
if not self.pap_detabase.get(obj['login']) is None and self.pap_detabase[obj['login']]==obj['password']:
send['nomination']='pap auth done'
self.web.write(self.name, name, send)
return True
else:
send['nomination'] = 'pap auth fail'
self.web.write(self.name, name, send)
return False
def chap_reg(self, name, obj):
send = dict()
if self.chap_detabase.get(obj['login']) is None:
self.chap_detabase[obj['login']] = obj['password']
send['nomination'] = 'chap auth reg done'
self.web.write(self.name, name, send)
return True
else:
send['nomination'] = 'chap auth reg fail'
self.web.write(self.name, name, send)
return False
def chap_auth_check_step_one(self, name, obj, is_twice=False):
send = dict()
if (not self.chap_detabase.get(obj['login']) is None) and not is_twice or is_twice and (not self.chap_twice_database.get(obj['login']) is None):
if is_twice:
send['nomination'] = 'chap twice auth random number'
number=random.randint(0, 2000000)
send['number']=number
password=self.password
number1 = obj['number']
hashpass = hashlib.sha1(str(number1).encode('utf-8'))
hashpass.update(str(password).encode("utf-8"))
send['hashpass']=hashpass
self.web.write(self.name, name, send)
self.chap_twice_database[obj['login']+'number']=number
return (number, hashpass, number1)
else:
send['nomination'] = 'chap auth random number'
number=random.randint(0, 2000000)
send['number']=number
self.web.write(self.name, name, send)
self.chap_detabase[obj['login']+'number']=number
return number
else:
send['nomination'] = 'chap auth fail'
self.web.write(self.name, name, send)
return False
def chap_auth_check_step_three(self, name, obj, is_twice=False):
send = dict()
if is_twice:
database=self.chap_twice_database
suc='chap twice auth suc'
fail='chap twice auth fail'
else:
database=self.chap_detabase
suc='chap auth suc'
fail='chap auth fail'
if not database.get(obj['login']) is None:
hashpass=obj['hashpass'].hexdigest()
number=database[obj['login']+'number']
password=database[obj['login']]
f=hashlib.sha1(str(number).encode('utf-8'))
f.update(str(password).encode('utf-8'))
f=f.hexdigest()
if hashpass==f:
send['nomination']=suc
self.web.write(self.name, name, send)
return True
else:
send['nomination'] = fail
self.web.write(self.name, name, send)
return False
else:
send['nomination'] = fail
self.web.write(self.name, name, send)
return False
def chap_twice_reg(self, name, obj):
send = dict()
if self.chap_twice_database.get(obj['login']) is None:
self.chap_twice_database[obj['login']] = obj['password']
send['nomination'] = 'chap twice auth reg done'
send['login']=self.name
send['password']=self.password
self.web.write(self.name, name, send)
return True
else:
send['nomination'] = 'chap twice auth reg fail'
self.web.write(self.name, name, send)
return False
def skey_reg(self, name, obj):
send = dict()
if self.skey_database.get(obj['login']) is None:
self.skey_database[obj['login']] = dict()
self.skey_database[obj['login']]['transaction']=1
number=random.randint(0, 2000000)
k=hashlib.sha1(obj['password'].encode('utf-8'))
k.update(str(number).encode('utf-8'))
for i in range(100):
k.update(obj['password'].encode('utf-8'))
k=k.copy()
self.skey_database[obj['login']]['password'] = k.hexdigest()
self.skey_database[obj['login']]['passinit']=obj['password'].encode('utf-8')
send['nomination'] = 'skey auth reg done'
send['number']=number
self.web.write(self.name, name, send)
return number
else:
send['nomination'] = 'skey auth reg fail'
self.web.write(self.name, name, send)
return False
def skey_auth_step_one(self, name, obj):
send = dict()
if not self.skey_database.get(obj['login']) is None:
send['nomination'] = 'skey auth tran'
tran=self.skey_database[obj['login']]['transaction']
send['transaction']=tran
self.web.write(self.name, name, send)
return tran
else:
send['nomination'] = 'skey auth fail'
self.web.write(self.name, name, send)
return False
def skey_auth_step_three(self, name, obj):
send = dict()
if not self.skey_database.get(obj['login']) is None:
hashpass=obj['hashpass']
password=self.skey_database[obj['login']]['passinit']
f=self.skey_database[obj['login']]['password']
hs=hashpass.copy()
ff=hs.hexdigest()
hashpass.update(password)
hashpass=hashpass.hexdigest()
if hashpass==f:
send['nomination']='skey auth suc'
self.skey_database[obj['login']]['transaction']=self.skey_database[obj['login']]['transaction']+1
self.skey_database[obj['login']]['password']=ff
if obj['getnext']:
send['number']=random.randint(0, 2000000)
else:
send['number']=False
self.web.write(self.name, name, send)
return True
else:
send['nomination'] = 'skey auth fail'
self.web.write(self.name, name, send)
return False
else:
send['nomination'] = 'skey auth fail'
self.web.write(self.name, name, send)
return False
def signal_waiting(self):
obj=self.web.read(self.name)#obj - name, описание, login, password
if not obj or obj is None:
return
if obj[1]['nomination']=='pap reg':
f=self.pap_auth_reg(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='pap auth':
f=self.pap_auth_check(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='chap reg':
f=self.chap_reg(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='chap auth inquiry':
f=self.chap_auth_check_step_one(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='chap auth pass':
f=self.chap_auth_check_step_three(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='chap twice reg':
f=self.chap_twice_reg(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='chap twice auth inquiry':
f=self.chap_auth_check_step_one(obj[0], obj[1], True)
self.data.append((obj, f))
elif obj[1]['nomination']=='chap twice auth pass':
f=self.chap_auth_check_step_three(obj[0], obj[1], True)
self.data.append((obj, f))
elif obj[1]['nomination']=='skey reg':
f=self.skey_reg(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='skey auth inquiry':##
f=self.skey_auth_step_one(obj[0], obj[1])
self.data.append((obj, f))
elif obj[1]['nomination']=='skey auth pass':
f=self.skey_auth_step_three(obj[0], obj[1])
self.data.append((obj, f))
else:
self.data.append(('', 'error letter', False, False))
class SubjectDraw(QWidget):
'''Визуализация субъектов'''
def __init__(self, web):
QWidget.__init__(self)
self.initUI()
self.subject=dict() # массив с зарегистрированными субъектами
self.web=web
def initUI(self):
self.resize(500, 700)
vbox = QVBoxLayout()
hbox1 = QHBoxLayout()
self.name = QLabel("Имя")
hbox1.addWidget(self.name)
self.system_name = QLabel("Имя системы")
hbox1.addWidget(self.system_name)
self.login_label = QLabel("Логин")
hbox1.addWidget(self.login_label)
self.password_label = QLabel("Пароль")
hbox1.addWidget(self.password_label)
vbox.addLayout(hbox1)
hbox2 = QHBoxLayout()
self.name_edit = QLineEdit()
self.name_edit.setText("name")
hbox2.addWidget(self.name_edit)
self.system_name_edit = QLineEdit()
self.system_name_edit.setText("sys")
hbox2.addWidget(self.system_name_edit)
self.login_edit = QLineEdit()
self.login_edit.setText("name1")
hbox2.addWidget(self.login_edit)
self.password_edit = QLineEdit()
self.password_edit.setText("qwety")
hbox2.addWidget(self.password_edit)
vbox.addLayout(hbox2)
self.plain_text = QPlainTextEdit()
vbox.addWidget(self.plain_text)
hbox = QHBoxLayout()
self.create_button = QPushButton("Создать объект")
self.create_button.clicked.connect(self.create_subject)
hbox.addWidget(self.create_button)
self.web_button = QPushButton("Зайти в сеть")
self.web_button.clicked.connect(self.web_reg)
hbox.addWidget(self.web_button)
self.pap_reg_button = QPushButton("Зарегистрироваться PAP")
self.pap_reg_button.clicked.connect(self.pap_reg)
hbox.addWidget(self.pap_reg_button)
self.pap_reg_check_button = QPushButton("Проверить регистрацию PAP")
self.pap_reg_check_button.clicked.connect(self.pap_reg_check)
hbox.addWidget(self.pap_reg_check_button)
self.pap_auth_button = QPushButton("Авторизоваться PAP")
self.pap_auth_button.clicked.connect(self.pap_auth)
hbox.addWidget(self.pap_auth_button)
self.pap_auth_check_button = QPushButton("Проверить авторизацию PAP")
self.pap_auth_check_button.clicked.connect(self.pap_auth_check)
hbox.addWidget(self.pap_auth_check_button)
vbox.addLayout(hbox)
hbox1 = QHBoxLayout()
self.chap_reg_button = QPushButton("Зарегистрироваться CHAP")
self.chap_reg_button.clicked.connect(self.chap_reg)
hbox1.addWidget(self.chap_reg_button)
self.chap_reg_check_button = QPushButton("Проверить регистрацию CHAP")
self.chap_reg_check_button.clicked.connect(self.chap_reg_check)
hbox1.addWidget(self.chap_reg_check_button)
self.chap_auth_button = QPushButton("Авторизоваться CHAP")
self.chap_auth_button.clicked.connect(self.chap_auth_init)
hbox1.addWidget(self.chap_auth_button)
self.chap_auth_button_step_two = QPushButton("Отправить хэш")
self.chap_auth_button_step_two.clicked.connect(self.chap_auth_step_two)
hbox1.addWidget(self.chap_auth_button_step_two)
self.chap_auth_check_button = QPushButton("Результаты авторизации CHAP")
self.chap_auth_check_button.clicked.connect(self.chap_auth_step_four)
hbox1.addWidget(self.chap_auth_check_button)
vbox.addLayout(hbox1)
hbox2 = QHBoxLayout()
self.chap_twice_reg_button = QPushButton("Зарегистрироваться двойным CHAP")
self.chap_twice_reg_button.clicked.connect(self.chap_twice_reg)
hbox2.addWidget(self.chap_twice_reg_button)
self.chap_twice_reg_check_button = QPushButton("Проверить двойную регистрацию CHAP")
self.chap_twice_reg_check_button.clicked.connect(self.chap_twice_reg_check)
hbox2.addWidget(self.chap_twice_reg_check_button)
self.chap_twice_auth_button = QPushButton("Двойная авторизоваться CHAP")
self.chap_twice_auth_button.clicked.connect(self.chap_twice_auth_init)
hbox2.addWidget(self.chap_twice_auth_button)
self.chap_twice_auth_button_step_two = QPushButton("Отправить хэш")
self.chap_twice_auth_button_step_two.clicked.connect(self.chap_twice_auth_step_two)
hbox2.addWidget(self.chap_twice_auth_button_step_two)
self.chap_twice_auth_check_button = QPushButton("Результаты авторизации CHAP")
self.chap_twice_auth_check_button.clicked.connect(self.chap_twice_auth_step_four)
hbox2.addWidget(self.chap_twice_auth_check_button)
vbox.addLayout(hbox2)
hbox3 = QHBoxLayout()
self.skey_reg_button = QPushButton("Зарегистрироваться S/KEY")
self.skey_reg_button.clicked.connect(self.skey_reg)
hbox3.addWidget(self.skey_reg_button)
self.skey_reg_check_button = QPushButton("Проверить регистрацию S/KEY")
self.skey_reg_check_button.clicked.connect(self.skey_reg_check)
hbox3.addWidget(self.skey_reg_check_button)
self.skey_auth_button = QPushButton("Авторизоваться S/KEY")
self.skey_auth_button.clicked.connect(self.skey_auth_init)
hbox3.addWidget(self.skey_auth_button)
self.skey_auth_button_step_two = QPushButton("Отправить хэш")
self.skey_auth_button_step_two.clicked.connect(self.skey_auth_step_two)
hbox3.addWidget(self.skey_auth_button_step_two)
self.skey_auth_check_button = QPushButton("Результаты авторизации S/KEY")
self.skey_auth_check_button.clicked.connect(self.skey_auth_step_four)
hbox3.addWidget(self.skey_auth_check_button)
vbox.addLayout(hbox3)
self.setLayout(vbox)
def create_subject(self):
name=self.name_edit.text()
if not self.subject.get(name) is None:
self.plain_text.appendPlainText("Уже зарегистрирован")
else:
self.subject[name]=Subject(name, self.web)
self.plain_text.appendPlainText("Создан")
def web_reg(self):
name = self.name_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Объекта нет")
else:
if self.subject[name].reg_web():
self.plain_text.appendPlainText("Зашёл")
else:
self.plain_text.appendPlainText("Вход этим именем уже произведён")
def pap_reg(self):
name=self.name_edit.text()
system_name=self.system_name_edit.text()
login=self.login_edit.text()
password=self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не создан")
return
else:
self.subject[name].pap_auth_reg_inquiry(system_name, login, password)
self.plain_text.appendPlainText("Запрос регистрации отправлен")
def pap_reg_check(self):
name = self.name_edit.text()
system_name=self.system_name_edit.text()
if self.subject[name].pap_auth_result(system_name, "pap auth reg done", "pap auth reg fail"):
self.plain_text.appendPlainText("Регистрация успешна")
else:
self.plain_text.appendPlainText("Регистрация не прошла")
def pap_auth(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
password = self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
self.subject[name].pap_auth_check_inquiry(system_name, login, password)
self.plain_text.appendPlainText("Запрос на авторизацию отправлен")
def pap_auth_check(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
if self.subject[name].pap_auth_result(system_name, "pap auth done", "pap auth fail"):
self.plain_text.appendPlainText("Аутентификация успешна")
else:
self.plain_text.appendPlainText("Аутентификация не прошла")
def chap_reg_check(self):
name = self.name_edit.text()
system_name=self.system_name_edit.text()
if self.subject[name].chap_reg_result(system_name, "chap auth reg done", "chap auth reg fail"):
self.plain_text.appendPlainText("Регистрация успешна")
else:
self.plain_text.appendPlainText("Регистрация не прошла")
def chap_reg(self):
name=self.name_edit.text()
system_name=self.system_name_edit.text()
login=self.login_edit.text()
password=self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не создан")
return
else:
self.subject[name].chap_reg_inquiry(system_name, login, password)
self.plain_text.appendPlainText("Запрос регистрации отправлен")
def chap_auth_init(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
self.subject[name].chap_auth_check_inquiry(system_name, login)
self.plain_text.appendPlainText("Запрос на авторизацию отправлен")
def chap_auth_step_two(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
password = self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
obj=self.subject[name].chap_auth_check_inquiry_step_two(system_name, 'chap auth random number', 'chap auth fail', login, password)
self.plain_text.appendPlainText("Пришло случайное число "+str(obj[1])+". Пароль отправлен, хеш - "+str(obj[0]))
return
def chap_auth_step_four(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
password = self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
obj = self.subject[name].chap_auth_check_inquiry_step_four(system_name, 'chap auth suc', 'chap auth fail')
if obj:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
return
def chap_twice_reg(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
password = self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не создан")
return
else:
self.subject[name].chap_twice_reg_inquiry(system_name, login, password)
self.plain_text.appendPlainText("Запрос регистрации отправлен")
def chap_twice_reg_check(self):
name = self.name_edit.text()
system_name=self.system_name_edit.text()
f = self.subject[name].chap_twice_reg_result(system_name, "chap twice auth reg done", "chap twice auth reg fail")
if f:
self.plain_text.appendPlainText(
"Регистрация успешна, логин системы " + f['login'] + ", пароль " + f['password'])
else:
self.plain_text.appendPlainText("Регистрация не прошла")
def chap_twice_auth_init(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
n=self.subject[name].chap_auth_check_inquiry(system_name, login, True)
self.plain_text.appendPlainText("Запрос на авторизацию отправлен вместе со случайным числом "+str(n))
def chap_twice_auth_step_two(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
password = self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
obj = self.subject[name].chap_auth_check_inquiry_step_two(system_name, 'chap twice auth random number','chap twice auth fail', login, password, True)
self.plain_text.appendPlainText("Пришло случайное число " + str(obj[1]) + " и хэш пароля "+ str(obj[2].hexdigest())+ ". Пароль отправлен, хеш - " + str(obj[0])+" Система аутентификации аутетифицирована")
return
def chap_twice_auth_step_four(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
password = self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
obj = self.subject[name].chap_auth_check_inquiry_step_four(system_name, 'chap twice auth suc', 'chap twice auth fail')
if obj:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
return
def skey_reg(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
password = self.password_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не создан")
return
else:##
self.subject[name].skey_reg_inquiry(system_name, login, password)
self.plain_text.appendPlainText("Запрос регистрации отправлен")
def skey_reg_check(self):
name=self.name_edit.text()
login = self.login_edit.text()
system_name=self.system_name_edit.text()
f = self.subject[name].skey_reg_result(system_name, "skey auth reg done", "skey auth reg fail", login)
if f:
self.plain_text.appendPlainText(
"Регистрация успешна, получено случайное число " + str(f['number']))
else:
self.plain_text.appendPlainText("Регистрация не прошла")
def skey_auth_init(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
self.subject[name].skey_auth_check_inquiry(system_name, login)
self.plain_text.appendPlainText("Запрос на авторизацию отправлен")
def skey_auth_step_two(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
login = self.login_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:##
obj = self.subject[name].skey_auth_check_inquiry_step_two(system_name, 'skey auth tran','skey auth fail', login)
self.plain_text.appendPlainText("Пришёл номер транзакции " + str(obj[1]) + ".Отправлен хэш "+ str(obj[0].hexdigest()))
return
def skey_auth_step_four(self):
name = self.name_edit.text()
system_name = self.system_name_edit.text()
if self.subject.get(name) is None:
self.plain_text.appendPlainText("Не зарегистрирован")
return
else:
obj = self.subject[name].skey_auth_check_inquiry_step_four(system_name, 'skey auth suc', 'skey auth fail', name)
if obj:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
return
class SystemDraw(QWidget):
'''Визуализация систем аутентификации'''
def __init__(self, web):
QWidget.__init__(self)
self.initUI()
self.system=dict() # словарь систем
self.web=web
def initUI(self):
self.resize(500, 700)
vbox = QVBoxLayout()
hbox = QHBoxLayout()
self.name = QLabel("Имя системы")
hbox.addWidget(self.name)
self.name_edit = QLineEdit()
self.name_edit.setText('sys')
hbox.addWidget(self.name_edit)
self.password = QLabel("Пароль системы")
hbox.addWidget(self.password)
self.pass_edit = QLineEdit()
self.pass_edit.setText('12345')
hbox.addWidget(self.pass_edit)
self.create_button=QPushButton("Создать")
self.create_button.clicked.connect(self.create_system)
hbox.addWidget(self.create_button)
self.reg_button=QPushButton("Зарегистрировать")
self.reg_button.clicked.connect(self.reg_system)
hbox.addWidget(self.reg_button)
self.stop_button=QPushButton("Удалить")
self.stop_button.clicked.connect(self.stop_system)
hbox.addWidget(self.stop_button)
self.read_button=QPushButton("Считать")
self.read_button.clicked.connect(self.read_data)
hbox.addWidget(self.read_button)
vbox.addLayout(hbox)
self.plain_text = QPlainTextEdit()
vbox.addWidget(self.plain_text)
self.setLayout(vbox)
def create_system(self):
name=self.name_edit.text()
password=self.pass_edit.text()
if not self.system.get(name) is None:
self.plain_text.appendPlainText("Система с таким именем уже существует")
else:
self.system[name]=AuthSystem(name, password, self.web)
self.plain_text.appendPlainText("Система создана")
def reg_system(self):
name=self.name_edit.text()
f=self.system[name].reg_web()
if f:
self.plain_text.appendPlainText("Система зарегистрирована в сети")
else:
self.plain_text.appendPlainText("Регистрация в сети невозможна")
def stop_system(self):
name=self.name_edit.text()
if self.system.get(name) is None:
self.plain_text.appendPlainText("Система с таким именем не существует")
else:
self.system[name].del_web()
self.system.pop(name)
self.plain_text.appendPlainText("Удалена")
def read_data(self):
#захватить данные системы
name=self.name_edit.text()
if self.system.get(name) is None:
self.plain_text.appendPlainText("Система с таким именем не существует")
else:
self.system[name].signal_waiting()
if self.system[name].data:
if self.system[name].data is None:
self.plain_text.appendPlainText(name + " - ничего не принято" )
return
obj=self.system[name].data[0]#cообщение и результат. Надо сделать перебор
if obj[0][1]['nomination']=='pap reg':
self.plain_text.appendPlainText(name+" принят запрос на регистрацию pap от "+obj[0][0]+", логин "+obj[0][1]['login']+", пароль "+obj[0][1]['password'])
if obj[1]:
self.plain_text.appendPlainText("Регистрация прошла")
else:
self.plain_text.appendPlainText("Регистрация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='pap auth':
self.plain_text.appendPlainText(name+" принят запрос на авторизацию pap от "+obj[0][0]+", логин "+obj[0][1]['login']+", пароль "+obj[0][1]['password'])
if obj[1]:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='chap reg':
self.plain_text.appendPlainText(name+" принят запрос на регистрацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+", пароль "+obj[0][1]['password'])
if obj[1]:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='chap auth inquiry':
self.plain_text.appendPlainText(name+" принят запрос на авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+". Сгенерировано случайное число "+str(obj[1]))
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='chap auth pass':
self.plain_text.appendPlainText(name+" принят запрос на авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+", хэш "+str(obj[0][1]['hashpass'].hexdigest()))
if obj[1]:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='chap twice reg':
self.plain_text.appendPlainText(name + " принят запрос на двойную регистрацию chap от " + obj[0][0] + ", логин " + obj[0][1]['login'] + ", пароль " + obj[0][1]['password'])
if obj[1]:
self.plain_text.appendPlainText("Регистрация прошла")
else:
self.plain_text.appendPlainText("регистрация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='chap twice auth inquiry':
self.plain_text.appendPlainText(name+" принят запрос на двойную авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+". Сгенерировано случайное число "+str(obj[1][0])+". Послан хэш "+str(obj[1][1].hexdigest())+", сгенерированный по числу "+str(obj[1][2]))
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='chap twice auth pass':
self.plain_text.appendPlainText(name+" принят запрос на двойную авторизацию chap от "+obj[0][0]+", логин "+obj[0][1]['login']+", хэш "+str(obj[0][1]['hashpass'].hexdigest()))
if obj[1]:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='chap twice reg':
self.plain_text.appendPlainText(name + " принят запрос на регистрацию chap от " + obj[0][0] + ", логин " + obj[0][1]['login'] + ", пароль " + obj[0][1]['password'])
if obj[1]:
self.plain_text.appendPlainText("Регистрация прошла")
else:
self.plain_text.appendPlainText("Регистрация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='skey reg':
self.plain_text.appendPlainText(name + " принят запрос на регистрацию S/KEY от " + obj[0][0] + ", логин " + obj[0][1]['login'] + ", пароль " + obj[0][1]['password'])
if obj[1]:
self.plain_text.appendPlainText("Регистрация прошла, послано случайное число "+str(obj[1]))
else:
self.plain_text.appendPlainText("Регистрация не прошла")
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='skey auth inquiry':
self.plain_text.appendPlainText(name+" принят запрос на авторизацию S/KEY от "+obj[0][0]+", логин "+obj[0][1]['login']+". Нормер транзакции "+str(obj[1]))
self.system[name].data.pop()
return
elif obj[0][1]['nomination']=='skey auth pass':
self.plain_text.appendPlainText(name+" принят запрос на авторизацию S/KEY от "+obj[0][0]+", логин "+obj[0][1]['login'])
if obj[1]:
self.plain_text.appendPlainText("Авторизация прошла")
else:
self.plain_text.appendPlainText("Авторизация не прошла")
self.system[name].data.pop()
return
else:
self.plain_text.appendPlainText("Ничего не принято")
return
w=NotRealNetwork()
app = QApplication(sys.argv)
s1 = SubjectDraw(w)
s2 = SystemDraw(w)
s1.show()
s2.show()
app.exit(app.exec_())
Соседние файлы в предмете Технология построения защищенных распределённых приложений