You are on page 1of 7

Міністерство освіти і науки України

КРИВОРІЗЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ


Кафедра моделювання та програмного забезпечення

Лабораторна робота №2
з дисципліни
«Безпека програм та даних»

Виконав:
Студент гр. ІПЗ–20–2
Чепурко М.С
Перевірив викладач:
Гриценко А.М

Кривий Ріг
2023
Лабораторна робота №2
Тема роботи: Криптоаналіз шифру простої заміни.
Мета: Вивчення елементів частотного аналізу криптограми: частоти
букв, частоти біграм, сполучність літер.
Варіант 14

Виконання роботи
Вводю дані, розділяю знаками
data = '15 48 32 52 32 60 67 32 25 60 19 36 25 55 20 91 55 20 15 25
15 67 25 99 63 46 11 99 12 46 60 78 46 12 46 60 15, 28 57 46 28 99
52, 46 57 60 32 28 55 60 18 99 36 20 55 30 32 20 46 7 55 37 52 46 37 57
39 30 55 20 19, 30 19 12 75 12 55 37 37 99 28 32 37 75 99 91 37 15
63 46 67 15 57 28 99 75 46 91. 60 37 60 46 32 60 25 32 91 41 46 52
67 46 25 55 30 46 57 55 12 52 55 37 46 60 32 37 57 39, 46 30 46 25 15
11 46 60 55 60 37 15 63 46 67 15 57 52 19 32 67 46 11 37 57 15 67 19 75
30 55 20 32 32 91 75 46 37 57 52 19 91 99 11 55 57 28 99 75 55 91 99,
37 99 78 52 55 12 39 52 19 91 99 25 55 75 32 57 55 91 99, 67 25 99 91
55 12 32 36 18 32 91 67 25 99 75 46 37 52 46 60 32 52 99 99 75 57 46 52
61 37 32 52 39 75 46 36 52 99 57 99 60 20 12 32 57 55 60 18 99 91 99 60
52 32 30 32 37 55 37 46 37 60 99 37 57 46 91, 25 55 37 37 19 67 55 41
60 46 25 46 63 55 25 55 20 52 46 74 60 32 57 52 19 63 46 37 12 32 67 99
57 32 12 39 52 19 63 99 37 75 25 - 99 11 55 48 32 67 46 12 45 37 55 91
99 67 25 46 57 99 60 46 57 99 60 46 67 32 63 46 57 52 19 63 91 99 52. 28
57 46 75 55 37 55 32 57 37 41 67 46 11 37 57 15 67 46 60 60 46 11 52 19
63, 28 99 52 30 19 12 52 32 57 55 75 25 32 57 99 60. 46 11 52 99
57 46 12 39 75 46 37 57 46 12 30 19 37 75 46 12 61 28 75 46 36 99
67 25 32 37 12 46 60 15 57 19 32 "37 67 99 25 55 12 39 75 99" - 75 46 58
46 25 19 32 52 32 20 60 55 52 19 32 78 46 37 57 99, 60 46 57 12 99 28
99 32 46 57 20 11 32 18 52 99 63 67 55 25 57 99 20 55 52, 15 91 32 12
99 67 25 32 46 11 46 12 32 60 55 57 39 30 19 37 57 25 46 99 30 32 20
91 55 12 32 36 18 32 78 46 60 25 32 11 55 11 12 41 37 46 30 37 50 60 32
52 52 46 78 46 46 25 78 55 52 99 20 91 55. 99 60 37 32.'

signs = [',', '.', '"', '-']


buffer = data
for sign in signs:
buffer = buffer.replace(sign, '')

Виводжу частоту букв та біграм


bigrams = {'аа': 2, 'аб': 12, 'ав': 35, 'аг': 8, 'ад': 14, 'ае': 7, 'аж': 6,
'аз': 15, 'аи': 7, 'ай': 7, 'ак': 19, 'ал': 27, 'ам': 19, 'ан': 45, 'ао': 3,
'ап': 11, 'ар': 26, 'ас': 31, 'ат': 27, 'ау': 3, 'аф': 1, 'ах': 10, 'ац': 6,
'ач': 7, 'аш': 10, 'ащ': 1, 'аэ': 2, 'аю': 6, 'ая': 9,
'ба': 5, 'бе': 9, 'бж': 1, 'би': 6, 'бл': 6, 'бн': 2, 'бо': 21,
'бр': 8, 'бс': 1, 'бу': 6, 'бщ': 1, 'бы': 11, 'бя': 2,
'ва': 35, 'вб': 1, 'вв': 5, 'вг': 3, 'вд': 3, 'ве': 32, 'вз': 2,
'ви': 17, 'вк': 7, 'вл': 10, 'вм': 3, 'вн': 9, 'во': 58, 'вп': 6, 'вр': 6,
'вс': 19, 'вт': 6, 'ву': 7, 'вх': 1, 'вц': 1, 'вч': 2, 'вш': 4, 'вщ': 1,
'вы': 18, 'въ': 1, 'вэ': 2, 'вя': 3,
'га': 7, 'гд': 3, 'ге': 3, 'ги': 5, 'гк': 1, 'гл': 5, 'гн': 1,
'го': 50, 'гр': 7, 'гу': 2,
'да': 25, 'дв': 3, 'дг': 1, 'дд': 1, 'де': 29, 'дж': 1, 'дз': 1,
'ди': 13, 'дк': 1, 'дл': 5, 'дм': 1, 'дн': 13, 'до': 22, 'дп': 3, 'др': 6,
'дс': 8, 'дт': 1, 'ду': 10, 'дц': 1, 'дч': 1, 'дш': 1, 'ды': 5, 'дь': 1,
'дя': 1,
'еа': 2, 'еб': 9, 'ев': 18, 'ег': 11, 'ед': 27, 'ее': 7, 'еж': 5,
'ез': 10, 'еи': 6, 'ей': 15, 'ек': 13, 'ел': 35, 'ем': 24, 'ен': 63, 'ео': 7,
'еп': 16, 'ер': 39, 'ес': 37, 'ет': 33, 'еу': 3, 'еф': 1, 'ех': 8, 'ец': 3,
'еч': 7, 'еш': 3, 'ещ': 3, 'еэ': 1, 'ею': 1, 'ея': 2,
'жа': 1, 'жб': 1, 'жд': 6, 'же': 12, 'жи': 5, 'жн': 6, 'жс': 1,
'за': 35, 'зб': 1, 'зв': 7, 'зг': 1, 'зд': 5, 'зе': 3, 'зи': 4,
'зк': 2, 'зл': 1, 'зм': 2, 'зн': 9, 'зо': 9, 'зп': 1, 'зр': 3, 'зс': 1, 'зу':
2, 'зы': 4, 'зя': 4,
'иа': 4, 'иб': 6, 'ив': 22, 'иг': 5, 'ид': 10, 'ие': 21, 'иж': 2,
'из': 23, 'ии': 19, 'ий': 11, 'ик': 19, 'ил': 21, 'им': 20, 'ин': 32, 'ио':
8, 'ип': 13, 'ир': 11, 'ис': 29, 'ит': 29, 'иу': 3, 'иф': 1, 'их': 17, 'иц':
3, 'ич': 11, 'иш': 1, 'ищ': 1, 'иэ': 1, 'эю': 3, 'ия': 17,
'йа': 1, 'йб': 1, 'йв': 4, 'йг': 1, 'йд': 3, 'йж': 1, 'йз': 2,
'йи': 4, 'йк': 5, 'йл': 1, 'йм': 2, 'йн': 7, 'йо': 9, 'йп': 7, 'йр': 3, 'йс':
10, 'йт': 2, 'йц': 1, 'йч': 3, 'йш': 2,
'ка': 24, 'кб': 1, 'кв': 4, 'кг': 1, 'ке': 4, 'кж': 1, 'кз': 1,
'ки': 26, 'кк': 1, 'кл': 4, 'км': 1, 'кн': 2, 'ко': 66, 'кп': 2, 'кр': 10,
'кс': 3, 'кт': 7, 'ку': 10, 'кц': 1,
'ла': 25, 'лб': 1, 'лв': 1, 'лг': 1, 'лд': 1, 'ле': 33, 'лж': 2,
'лз': 1, 'ли': 36, 'лк': 1, 'лл': 2, 'лм': 1, 'лн': 8, 'ло': 30, 'лп': 2,
'лс': 3, 'лт': 1, 'лу': 6, 'лх': 4, 'лч': 1, 'лы': 2, 'ль': 30, 'лю': 4,
'ля': 9,
'ма': 18, 'мб': 2, 'мв': 4, 'мг': 1, 'мд': 1, 'ме': 21, 'мж': 1,
'мз': 2, 'ми': 23, 'мк': 3, 'мл': 1, 'мм': 3, 'мн': 7, 'мо': 19, 'мп': 5,
'мр': 2, 'мс': 5, 'мт': 3, 'му': 9, 'мф': 1, 'мч': 2, 'мы': 5, 'мь': 1, 'мэ':
1, 'мя': 3,
'на': 54, 'нб': 1, 'нв': 2, 'нг': 3, 'нд': 3, 'не': 34, 'ни': 58,
'нк': 3, 'нм': 1, 'нн': 24, 'но': 67, 'нп': 2, 'нр': 1, 'нс': 9, 'нт': 9,
'ну': 7, 'нф': 1, 'нц': 5, 'нч': 2, 'ны': 36, 'нь': 3, 'ня': 5,
'оа': 1, 'об': 28, 'ов': 84, 'ог': 32, 'од': 47, 'ое': 15, 'ож': 7,
'оз': 18, 'ои': 12, 'ой': 29, 'ок': 19, 'ол': 41, 'ом': 38, 'он': 30, 'оо':
9, 'оп': 18, 'ор': 43, 'ос': 50, 'от': 39, 'оу': 3, 'оф': 2, 'ох': 5, 'оц':
2, 'оч': 12, 'ош': 4, 'ощ': 3, 'оэ': 2, 'ою': 3, 'оя': 2,
'па': 7, 'пе': 15, 'пи': 4, 'пл': 9, 'пн': 1, 'по': 46, 'пр': 41,
'пс': 1, 'пу': 6, 'пы': 2, 'пя': 2,
'ра': 55, 'рб': 1, 'рв': 4, 'рг': 4, 'рд': 3, 'ре': 37, 'рж': 3,
'рз': 1, 'ри': 24, 'рк': 3, 'рл': 1, 'рм': 3, 'рн': 7, 'ро': 56, 'рп': 2,
'рр': 1, 'рс': 5, 'рт': 9, 'ру': 16, 'рх': 1, 'рц': 1, 'рч': 1, 'рш': 2,
'ры': 8, 'рь': 3, 'ря': 5,
'са': 8, 'сб': 1, 'св': 7, 'сг': 1, 'сд': 2, 'се': 25, 'си': 6,
'ск': 40, 'сл': 13, 'см': 3, 'сн': 9, 'со': 27, 'сп': 11, 'ср': 4, 'сс': 11,
'ст': 82, 'су': 6, 'сх': 1, 'сц': 1, 'сч': 2, 'сш': 2, 'сы': 1, 'сь': 8,
'ся': 17,
'та': 35, 'тб': 1, 'тв': 27, 'тг': 1, 'тд': 3, 'те': 31, 'тз': 1,
'ти': 28, 'тк': 5, 'тл': 1, 'тм': 1, 'тн': 11, 'то': 56, 'тп': 4, 'тр': 26,
'тс': 18, 'тт': 2, 'ту': 10, 'тч': 1, 'ть': 21, 'тя': 4,
'уа': 1, 'уб': 4, 'ув': 4, 'уг': 4, 'уд': 11, 'уе': 2, 'уж': 6,
'уз': 3, 'уи': 2, 'ук': 8, 'ул': 5, 'ум': 5, 'ун': 5, 'уо': 1, 'уп': 5, 'ур':
7, 'ус': 14, 'ут': 7, 'ух': 1, 'уч': 8, 'уш': 3, 'ущ': 2, 'ую': 9, 'уя': 1,
'фа': 2, 'фе': 2, 'фи': 2, 'фо': 1, 'фр': 1, 'фс': 1,
'ха': 4, 'хб': 1, 'хв': 4, 'хг': 1, 'хд': 3, 'хе': 1, 'хз': 2,
'хи': 3, 'хк': 4, 'хл': 3, 'хм': 3, 'хн': 4, 'хо': 18, 'хп': 5, 'хр': 3,
'хс': 4, 'хт': 2, 'ху': 2, 'хф': 1, 'хч': 1,
'ца': 3, 'це': 7, 'ци': 10, 'цк': 2, 'цо': 1, 'цу': 1, 'цы': 1,
'ча': 12, 'че': 23, 'чи': 13, 'чк': 2, 'чт': 7, 'чу': 1, 'чш': 1,
'чь': 1,
'ша': 5, 'ше': 11, 'ши': 14, 'шк': 1, 'шл': 2, 'шн': 2, 'шо': 2,
'шу': 1, 'шь': 1,
'ща': 3, 'ще': 8, 'щи': 6, 'щн': 1, 'щу': 1,
'ыб': 1, 'ыв': 9, 'ыг': 1, 'ыд': 3, 'ые': 12, 'ыз': 2, 'ыи': 4,
'ый': 7, 'ык': 3, 'ыл': 6, 'ым': 6, 'ын': 3, 'ыо': 2, 'ып': 10, 'ыр': 3,
'ыс': 9, 'ыт': 4, 'ыу': 1, 'ых': 16, 'ыч': 1, 'ыш': 2,
'ьб': 2, 'ьв': 4, 'ьг': 1, 'ьд': 1, 'ье': 2, 'ьз': 2, 'ьи': 2,
'ьк': 6, 'ьм': 3, 'ьн': 13, 'ьо': 2, 'ьп': 4, 'ьр': 1, 'ьс': 11, 'ьт': 3,
'ьч': 1, 'ьш': 4, 'ьэ': 1, 'ью': 3, 'ья': 1,
'эк': 1, 'эн': 1, 'эс': 1, 'эт': 9,
'юб': 2, 'юв': 1, 'юг': 2, 'юд': 1, 'юз': 3, 'юи': 1, 'юк': 1,
'юм': 1, 'юн': 1, 'юо': 1, 'юп': 3, 'юр': 1, 'юс': 1, 'юц': 1, 'юч': 1, 'ющ':
4,
'яа': 1, 'яб': 3, 'яв': 9, 'яг': 1, 'яд': 3, 'яе': 3, 'яж': 1,
'яз': 5, 'яи': 3, 'яй': 2, 'як': 3, 'ял': 3, 'ям': 4, 'ян': 6, 'яо': 3, 'яп':
6, 'яр': 3, 'яс': 6, 'ят': 10, 'ях': 2, 'яц': 1, 'яч': 4, 'яш': 1, 'ящ': 1,
'яэ': 1, 'яю': 1, 'яя': 1}

Рахую кількість зашифрованих літер, сортую та виводжу їх


umber_count = {}
numbers = []
for i in range(len(data_split)):
if data_split[i] not in number_count:
amount = data_split.count(data_split[i])
number_count.update({data_split[i]: amount})
numbers.append(data_split[i])

number_count = sorted(number_count.items(), key = lambda x: x[1],


reverse=True)

Шляхом аналізу та підстановки розшифровую букви


# "о" та "е" найчастіше зустрічуються
data = data.replace('46', 'о')
data = data.replace('32', 'е')
result.update({'46': 'о', '32': 'е'})

# "99" скоріше за все "и" тому що зустрічається як сполучник


data = data.replace('99', 'и')
result.update({'99': 'и'})

data = data.replace('60', 'в')


result.update({'60': 'в'})
# "99" - це скоріше за все "н" тому що друге слово в першому реченні, можна
припустити, "не"
data = data.replace('52', 'н')
result.update({'52': 'н'})

# останнє слово напевно "все", тому що слів які закінчується на "се" і


складаються з 3 букв майже немає
data = data.replace('37', 'с')
result.update({'37': 'с'})

# "28" - це "ч" тому що дуже мало логічних слів які підходять під контекст з
закінченням "ин" окрім слова "чин"
data = data.replace('28', 'ч')
result.update({'28': 'ч'})

data = data.replace('57', 'т')


result.update({'57': 'т'})

# можна побачити слово "совесть" отже "39" це "ь"


data = data.replace('39', 'ь')
result.update({'39': 'ь'})

# є слово "свистом"
data = data.replace('91', 'м')
result.update({'91': 'м'})

# слово "безопасность"
data = data.replace('55', 'а')
result.update({'55': 'а'})

# букви нижче по аналогії, адже оскільки я вже відкрив найпопулярніши літери,


більшість слів можна прочитати
data = data.replace('18', 'ш')
result.update({'18': 'ш'})

data = data.replace('36', 'й')


result.update({'36': 'й'})

data = data.replace('75', 'к')


result.update({'75': 'к'})

data = data.replace('20', 'з')


result.update({'20': 'з'})

data = data.replace('30', 'б')


result.update({'30': 'б'})

data = data.replace('67', 'п')


result.update({'67': 'п'})

data = data.replace('19', 'ы')


result.update({'19': 'ы'})

data = data.replace('25', 'р')


result.update({'25': 'р'})

data = data.replace('63', 'х')


result.update({'63': 'х'})

data = data.replace('12', 'л')


result.update({'12': 'л'})

data = data.replace('11', 'д')


result.update({'11': 'д'})

data = data.replace('15', 'у')


result.update({'15': 'у'})

data = data.replace('78', 'г')


result.update({'78': 'г'})

data = data.replace('48', 'ж')


result.update({'48': 'ж'})

data = data.replace('41', 'я')


result.update({'41': 'я'})

data = data.replace('61', 'и')


result.update({'61': 'и'})

data = data.replace('50', 'т')


result.update({'50': 'т'})

data = data.replace('7', 'п')


result.update({'7': 'п'})

data = data.replace('58', 'т')


result.update({'59': 'т'})

data = data.replace('45', 'о')


result.update({'45': 'о'})

print(data)

Виводжу результат
result = sorted(result.items(), key = lambda x: x[1], reverse=False)
print("Розшифровка: ")
print(result)
Висновок
На цій лабораторній роботі я вивчив елементи частотного аналізу
криптограми: частоти букв, частоти біграм, сполучність літер.

You might also like