ИБ_4
.docxГУАП
КАФЕДРА № 51
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
старший преподаватель |
|
|
|
Е.Д. Пойманова |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 4 |
||||
ЭЛЕКТРОННАЯ ЦИФРОВАЯ ПОДПИСЬ НА ОСНОВЕ ЗАДАЧИ СЛОЖНОСТИ ДИСКРЕТНОГО ЛОГАРИФМИРОВАНИЯ |
||||
по курсу: ОСНОВЫ ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ |
||||
|
||||
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4616 |
|
|
|
Павлов А.В |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург
2019
Цель работы: Освоение механизмов построения систем цифровой электронной подписи (ЭЦП) на основе открытых ключей системы Диффи-Хелмана.
Ход работы:
Рисунок 1 – Схема Эль-Гамаля
Рисунок 2 – Алгоритм для кэширования
Далее напишем наш код программы. В качестве вектора инициализации возьмем число 33. Программа будет генерировать случайные значение в заданном диапазоне, который указан в варианте. Таким образом каждый запуск программы будет выдать новые уникальные значения.
Листинг 1 – Код программы
from random import randint
from math import sqrt
def mod(x, y):
if x % y > abs(y):
return (x % y) - 1
else:
return x % y
def makehash():
# Начальные данные
message = 'Это тест длинного сообщения '
#P = 80191
#X = 30391
h0 = 51
X = randint(10 ** 4, 10 ** 5) # случайное число от 1 до длинны 7
def splittext(message):
return message.strip().split(' ')
def bin_add(*args):
return bin(sum(int(x, 2) for x in args))[2:]
# Пункт 2
def findnumber(n):
# Проверка на простое число
def isPrime(n):
# проверка на маленькие числа
if (n <= 1):
return False
if (n <= 3):
return True
if (n % 2 == 0 or n % 3 == 0):
return False
i = 5
while (i * i <= n):
if (n % i == 0 or n % (i + 2) == 0):
return False
i = i + 6
return True
def power(x, y, p):
res = 1
x = x % p # обновляем х если оно больше p
while (y > 0):
# Если у нечетное то умнажаем на х
if (y & 1):
res = (res * x) % p
y = y >> 1 # y = y/2
x = (x * x) % p
return res
def findPrimefactors(s, n):
while (n % 2 == 0):
s.add(2)
n = n // 2
for i in range(3, int(sqrt(n)), 2):
while (n % i == 0):
s.add(i)
n = n // i
if (n > 2):
s.add(n)
#корень из n
def findPrimitive(n):
s = set()
#проверка на простое число
if (isPrime(n) == False):
return -1
phi = n - 1
findPrimefactors(s, phi)
for r in range(2, phi + 1):
flag = False
for it in s:
if (power(r, phi // it, n) == 1):
flag = True
break
if (flag == False):
return r
#Если ничего не нашли
return -1
result = findPrimitive(n)
return result
while (True):
P = randint(10 ** 4, 10 ** 6) # случайное число от 4 до длинны 7
alpha = findnumber(P)
if alpha != -1:
break
def hash(message, h0, p, x):
result = []
text = '{} ->(2) {} -> {}'
for i in range(len(message)):
textstr = []
for s in range(len(message[i])):
M = bin_add(bin(ord(message[i][s])), bin(h0), bin(h0))
textstr.append(int(M, 2))
symbolECP = ECP(sum(textstr), p, x, alpha)
result.append(text.format(message[i], bin(sum(textstr))[2:], symbolECP))
return result
splitMessage = splittext(message)
print('Хэщируем сообщение:')
print('\n'.join(map(str, hash(splitMessage, h0, P, X))))
def ECP(M, p, x, alpha):
# M = 5687 #сообщение
# p,x = 80191, 23789
# Пункт 4
y = alpha ** x % p
# Пункт 5.1
def NOD(x, y):
while (y):
x, y = y, x % y
return x
def findK():
while (True):
k = randint(0, p - 1)
res = NOD(k, p - 1)
if res == 1:
break
return k
k = findK()
# Пунтк 5.2
r = 0
r = (r + alpha ** k) % p
# 5.3
s = 1
H = 0
while (True):
H = mod((x * r + k * s), (p - 1))
if H == M:
break
s += 1
# Пункт 6
alphaH = alpha ** M % p
yR = y ** r % p
rS = r ** s % p
yRrS = yR * rS % p
result = {'p': p, 'a': alpha, 'x': x, 'y': y,
'M': M, 'k': k, 'r': r, 's': s,
'alphaM': alphaH, 'yR': yR,
'rS': rS, 'yRrS': yRrS}
return result
makehash()
Рисунок 2 – Результат работы хэширования сообщения
Рисунок 3 – Результат работы программы, где каждая строчка являет одним словом
Результат работы в табличном виде для текст ’Тестовый текст для проверки’ и вектором инициализации 33:
502781 |
2 |
48845 |
143759 |
9182 |
211491 |
267052 |
382942 |
479373 |
96912 |
414709 |
479373 |
5758 |
454499 |
334553 |
60027 |
72410 |
179073 |
207963 |
72410 |
3460 |
438563 |
404199 |
71035 |
405606 |
411530 |
369862 |
405606 |
9190 |
51771 |
416216 |
362250 |
40924 |
459764 |
201780 |
40924 |
Выводы:
В ходе лабораторной работы мы ознакомились с принципами построения систем цифровой электронной подписи (ЭЦП) на основе открытых ключей системы Диффи-Хелмана.