Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИБ_4

.docx
Скачиваний:
21
Добавлен:
18.12.2019
Размер:
228.33 Кб
Скачать

ГУАП

КАФЕДРА № 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

Выводы:

В ходе лабораторной работы мы ознакомились с принципами построения систем цифровой электронной подписи (ЭЦП) на основе открытых ключей системы Диффи-Хелмана.

Соседние файлы в предмете Информационная безопасность