Академический Документы
Профессиональный Документы
Культура Документы
РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО
ОБРАЗОВАНИЯ
«СЕВАСТОПОЛЬСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ»
Пояснительная записка
к РГР по дисциплине
«Защита программ и данных»
г. Севастополь
2022 г.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ
РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«СЕВАСТОПОЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРИТЕТ»
УТВЕРЖДАЮ
Заведующий кафедрой
«Информационная безопасность»
М.И. Ожиганова
(подпись) (инициалы, фамилия)
«____»__________________202__года
З А Д А Н И Е
на курсовую работу
КАЛЕНДАРНЫЙ ПЛАН
Срок
№ Название этапов Примечание
выполнения
п/п работы (проекта)
этапов работы
1 Сбор и анализ материала 03.10 – 14.10
2 3й раздел курсового проекта описание программ,
параметров запуска,
02.10 – 20.10
входных данных,
полученного результата.
3 2й раздел курсового проекта описание программ виде
структурной схемы;
14.10 – 10.11
описание программ в виде
блок-схемы алгоритма.
4 1й раздел курсового проекта описание правового поля
для использования
исследуемых программных
прототипов и данных;
08.10 – 17.11
описание применяемой в
программе математической
модели математического
аппарата, принципов.
5 Оформление пояснительной записки 08.10 – 01.12 Согласно ГОСТ 2.105
6 Оформление графического материала 08.10 – 07.12
3
СОДЕРЖАНИЕ
Введение 5
1 МЕТОД ХЭШИРОВАНИЯ SHA-2, АЛГОРИТМ ХЭШИРОВАНИЯ SHA-256.
6
1.1 Хэш-функция основные теоретические положения 6
1.2 SHA-2 и SHA-256 6
1.3 Правовое регулирование использования SHA-256 8
2 ОПИСАНИЕ И МАТЕМАТИЧЕСКАЯ МОДЕЛЬ АЛГОРИТМА 10
2.1 Описание алгоритма 10
2.2 Математическая модель 12
3 ТЕСТИРОВАНИЕ АЛГОРИТМА ХЭШИРОВАНИЯ SHA-256 16
3.1 Исследование работоспособности проекта 16
3.2 Сравнение работы исследуемого алгоритма хэширования с другими
17
Заключение 23
Приложение Б 30
Приложение В 31
4
ВВЕДЕНИЕ
5
Работа изложена на 25 страницах основного текста, включающего 17
рисунков, 3 таблицы, 3 листинга кода, список литературных источников из 13
наименований, 3 приложения.
6
1 МЕТОД ХЭШИРОВАНИЯ SHA-2, АЛГОРИТМ ХЭШИРОВАНИЯ
SHA-256.
1.1 Хэш-функция основные теоретические положения
разрядность;
вычислительная сложность;
криптостойкость.[3]
10
2 ОПИСАНИЕ И МАТЕМАТИЧЕСКАЯ МОДЕЛЬ АЛГОРИТМА.
2.1 Описание алгоритма
11
# Padding
length = len(message) * 8 # len(message) is number of
BYTES!!!
message.append(0x80)
while (len(message) * 8 + 64) % 512 != 0:
message.append(0x00)
message += length.to_bytes(8, 'big') # pad to 8 bytes or 64
bits
assert (len(message) * 8) % 512 == 0, "Padding did not
complete properly!"
13
Рисунок 1 – Математическая модель (схема работы) хэш-функции sha-256
14
Рисунок 3 – Пример инициализации буфера [8]
Далее все сообщение разбивается на несколько блоков по 512 бит в
каждом. Он подвергает каждый блок 64 раундам работы, при этом выходные
данные каждого блока служат входными данными для следующего блока. Весь
процесс заключается в следующем. На рисунке 4 представлены схема работы
сжатия функции.
15
Рисунок 4 – схема работы сжатия функции [8]
16
3 ТЕСТИРОВАНИЕ АЛГОРИТМА ХЭШИРОВАНИЯ SHA-256
3.1 Исследование работоспособности проекта
18
Таблица 2 – Сравнение алгоритмов sha-1 и sha-256 [10]
Хеш- Длина Длина Длин Максимальн Длин Количеств Найденны
функци дайджест внутреннег а ая длина а о е
я а о блока сообщения слова итераций коллизии
сообщени состояния (бит) (бит) (бит) в цикле
я (бит) (бит)
64 52
SHA-1 160 160 512 2 −1 32 80 (4 Есть. 2
группы из операций
20
итераций)
64
SHA- 256 256 512 2 −1 32 64 Нет
256
19
Для просмотра работы sha-1 был взят репозиторий GitHub [11]. На
рисунке 12 изображены результаты хэширования sha-1 и вычисление времени
работы алгоритма:
21
Таблица 3 – Сравнение sha-256 и sha-384 алгоритмов хеширования [1]
Хеш- Длина Длина Длин Максимальна Длин Количеств Найденны
функци дайджест внутреннег а я длина а о е
я а о блока сообщения слова итераций коллизии
сообщени состояния (бит) (бит) (бит) в цикле
я (бит) (бит)
64
SHA- 256 256 512 2 −1 32 64 Нет
256
128
SHA- 384 512 1024 2 −1 64 80 Нет
384
22
Рисунок 16 – Сгенерированный хэш для строки Vitaliy123 методом sha-384 и
время его вычисления
23
ЗАКЛЮЧЕНИЕ
24
Список информационных источников
26
Приложение А
Листинг программы
27
Приложение А
Продолжение листинга
h1 = 0xbb67ae85
h2 = 0x3c6ef372
h3 = 0xa54ff53a
h5 = 0x9b05688c
h4 = 0x510e527f
h6 = 0x1f83d9ab
h7 = 0x5be0cd19
# SHA-256 Hash Computation
for message_block in blocks:
# Prepare message schedule
message_schedule = []
for t in range(0, 64):
if t <= 15:
# adds the t'th 32 bit word of the block,
# starting from leftmost word
# 4 bytes at a time
message_schedule.append(bytes(message_block[t*4:
(t*4)+4]))
else:
term1 = _sigma1(int.from_bytes(message_schedule[t-
2], 'big'))
term2 = int.from_bytes(message_schedule[t-7],
'big')
term3 = _sigma0(int.from_bytes(message_schedule[t-
15], 'big'))
term4 = int.from_bytes(message_schedule[t-16],
'big')
# append a 4-byte byte object
schedule = ((term1 + term2 + term3 + term4) %
2**32).to_bytes(4, 'big')
message_schedule.append(schedule)
assert len(message_schedule) == 64
# Initialize working variables
a = h0
b = h1
c = h2
d = h3
e = h4
f = h5
g = h6
h = h7
# Iterate for t=0 to 63
for t in range(64):
t1 = ((h + _capsigma1(e) + _ch(e, f, g) + K[t] +
int.from_bytes(message_schedule[t], 'big')) %
2**32)
t2 = (_capsigma0(a) + _maj(a, b, c)) % 2**32
h = g
g = f
28
Приложение А
Продолжение листинга
f = e
e = (d + t1) % 2**32
d = c
c = b
b = a
a = (t1 + t2) % 2**32
# Compute intermediate hash value
h0 = (h0 + a) % 2**32
h1 = (h1 + b) % 2**32
h2 = (h2 + c) % 2**32
h3 = (h3 + d) % 2**32
h4 = (h4 + e) % 2**32
h5 = (h5 + f) % 2**32
h6 = (h6 + g) % 2**32
h7 = (h7 + h) % 2**32
return ((h0).to_bytes(4, 'big') + (h1).to_bytes(4, 'big') +
(h2).to_bytes(4, 'big') + (h3).to_bytes(4, 'big') +
(h4).to_bytes(4, 'big') + (h5).to_bytes(4, 'big') +
(h6).to_bytes(4, 'big') + (h7).to_bytes(4, 'big'))
def _sigma0(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 7) ^
_rotate_right(num, 18) ^
(num >> 3))
return num
def _sigma1(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 17) ^
_rotate_right(num, 19) ^
(num >> 10))
return num
def _capsigma0(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 2) ^
_rotate_right(num, 13) ^
_rotate_right(num, 22))
return num
def _capsigma1(num: int):
"""As defined in the specification."""
num = (_rotate_right(num, 6) ^
_rotate_right(num, 11) ^
_rotate_right(num, 25))
return num
def _ch(x: int, y: int, z: int):
"""As defined in the specification."""
return (x & y) ^ (~x & z)
def _maj(x: int, y: int, z: int):
"""As defined in the specification."""
return (x & y) ^ (x & z) ^ (y & z)
29
Приложение А
Окончание листинга
def _rotate_right(num: int, shift: int, size: int = 32):
"""Rotate an integer right."""
return (num >> shift) | (num << size - shift)
if __name__ == "__main__":
print(generate_hash("Vitaliy123").hex())
print("--- %s seconds ---" % (time.time() - start_time))
30
Приложение Б
Листинг программы
import hashlib
import time
start_time = time.time()
password = input('Input the Password to Hash: ')
print('\nsha-1:\n')
setpass = bytes(password, 'utf-8')
hash_object = hashlib.sha1(setpass)
guess_pw = hash_object.hexdigest()
print(guess_pw)
print("--- %s seconds ---" % (time.time() - start_time))
31
Приложение В
Листинг программы
#SHA-384 Hash Function
import time
start_time = time.time()
def leftrotate_64(x, c):
x &= 0xFFFFFFFFFFFFFFFF
return ((x << c) | (x >> (64 - c))) & 0xFFFFFFFFFFFFFFFF
def rightrotate_64(x, c):
x &= 0xFFFFFFFFFFFFFFFF
return ((x >> c) | (x << (64 - c))) & 0xFFFFFFFFFFFFFFFF
def leftshift(x, c):
return x << c
def rightshift(x, c):
return x >> c
class SHA384():
def __init__(self):
self.block_size = 96
self.digest_size = 48
h0 = 0xcbbb9d5dc1059ed8
h1 = 0x629a292a367cd507
h2 = 0x9159015a3070dd17
h3 = 0x152fecd8f70e5939
h4 = 0x67332667ffc00b31
h5 = 0x8eb44a8768581511
h6 = 0xdb0c2e0d64f98fa7
h7 = 0x47b5481dbefa4fa4
self.k = [
0x428a2f98d728ae22, 0x7137449123ef65cd,
0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538,
0x59f111f1b605d019, 0x923f82a4af194f9b,
0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe,
0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,
0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235,
0xc19bf174cf692694, 0xe49b69c19ef14ad2,
0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,
0x2de92c6f592b0275, 0x4a7484aa6ea6e483,
0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab,
0xa831c66d2db43210, 0xb00327c898fb213f,
0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725,
0x06ca6351e003826f, 0x142929670a0e6e70,
0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed,
0x53380d139d95b3df, 0x650a73548baf63de,
0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,
0xa2bfe8a14cf10364, 0xa81a664bbc423001,
0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218,
0xd69906245565a910, 0xf40e35855771202a,
0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53,
0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,
0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373,
32
Приложение В
Продолжение листинга
0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc,
0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,
0x90befffa23631e28, 0xa4506cebde82bde9,
0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c,
0xd186b8c721c0c207, 0xeada7dd6cde0eb1e,
0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6,
0x113f9804bef90dae, 0x1b710b35131c471b,
0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc,
0x431d67c49c100d4c, 0x4cc5d4becb3e42b6,
0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
]
self.hash_pieces = [h0, h1, h2, h3, h4, h5, h6, h7]
def hexdigest(self):
digest = self.digest()
raw = digest.to_bytes(self.digest_size, byteorder='big')
format_str = '{:0' + str(2 * self.digest_size) + 'x}'
return format_str.format(int.from_bytes(raw,
byteorder='big'))
def main():
string = input("Enter String : ")
h = SHA384()
data = bytes(string, encoding='utf8')
h.update(data)
print(f"Hash : {h.hexdigest()}")
main()
print("--- %s seconds ---" % (time.time() - start_time))
34