Please use this identifier to cite or link to this item: https://er.chdtu.edu.ua/handle/ChSTU/7744
Title: Розробка стеганографічної системи прихованої передачі звукових даних
Authors: Палагін, Володимир Васильович
Присяжненко, Вадим Володимирович
Keywords: least significant bit;формат звукових даних;ступінь зашифровування;telegram;чатбот;бітовий потік
Issue Date: 2022
Abstract: Побудова та обґрунтування алгоритму для приховування даних у аудіосигналах за допомогою Telegram-бота
URI: https://er.chdtu.edu.ua/handle/ChSTU/7744
Appears in Collections:125 Кібербезпека та захист інформації (Безпека інформаційних і комунікаційних систем)

Files in This Item:
File Description SizeFormat 
Б_125_Присяжненко_Палагін.pdf
  Restricted Access
4.31 MBAdobe PDFView/Open Request a copy


Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.

Extracted text
 
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ 
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ 
ФАКУЛЬТЕТ ЕЛЕКТРОННИХ ТЕХНОЛОГІЙ І РОБОТОТЕХНІКИ 
КАФЕДРА РОБОТОТЕХНІЧНИХ І ТЕЛЕКОМУНІКАЦІЙНИХ СИСТЕМ ТА 
КІБЕРБЕЗПЕКИ 
 
 
До захисту допущено  
завідувач кафедри РТСК 
д.т.н., професор  
_______________ В.В. Палагін  
"_____" _____________ 2022 року 
 
 
Пояснювальна записка 
до дипломного проекту (роботи) 
                 бакалавра              
 
(освітньо-кваліфікаційний рівень) 
на тему «Розробка стеганографічної системи прихованої передачі звукових 
даних» 
 
Виконав: студент  4  курсу, групи    БІ-81    
Спеціальності         125 – «Кібербезпека» , 
(шифр і назва спеціальності) 
 
освітньої програми  «Безпека інформаційних і 
комунікаційних систем»  
                         (назва освітньої програми) 
                        Присяжненко В.В.   
(прізвище та ініціали) 
Керівник   Палагін В.В.  
(прізвище та ініціали) 
Рецензент  Андрієнко В.А.  
(прізвище та ініціали) 
 
 
 
 
Черкаси – 2022 року 
Форма № Н-9.01 
 
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ 
Факультет  електронних технологій і робототехніки  
Кафедра  робототехнічних і телекомунікаційних систем та кібербезпеки  
Освітньо-кваліфікаційний рівень  бакалавр  
Спеціальність  125 – Кібербезпека  
Освітня програма  – Безпека інформаційних і комунікаційних систем  
 
 
 
 
 
ЗАТВЕРДЖУЮ 
Завідувач кафедри  В.В. Палагін 
“_____” ___________________ 2022 року 
 
 
 
ЗАВДАННЯ 
НА ВИПУСКНУ РОБОТУ СТУДЕНТУ 
 
                                Присяжненка Вадима Володимировича _______________ 
(прізвище, ім’я, по батькові) 
1. Тема проекту (роботи) Розробка стеганографічної системи прихованої передачі 
звукових даних  
керівник проекту (роботи)  Палагін Володимир Васильович  
(прізвище, ім’я, по батькові, науковий ступінь, вчене звання) 
затверджені наказом вищого навчального закладу від «18» лютого 2022 року № 58/04 
 
2. Термін здачі студентом закінченої роботи  “ 25 ” травня 2022 року _________ 
 
3. Вихідні дані до роботи: спосіб передачі та зберігання звукових даних – стеганографія; 
метод шифрування – заміна найменш значущого біта (LSB – Least Significant Bit); 
формат звукових даних - *.wav;  ступінь зашифровування (в бітах) – 1, 2, 4, 8, 16; 
середовище передачі даних – Telegram (месенджер); платформа створення 
зашифрованого повідомлення методом LSB – чатбот у Telegram; мова програмування – 
Python.      
 
4. Зміст розрахунково-пояснювальної записки (перелік питань, що їх належить розробити) 
Аналіз принципів побудови стеганографічних систем захисту інформації; методи 
побудови звукової стеганографії; розробка алгоритму Telegram-бота для прихованої 
передачі даних; охорона праці.  
 
5.  Перелік графічного матеріалу (з точним зазначенням обов’язкових креслень, плакатів)  
1. Приклади використання стеганографії та загальна структурна схема; 2.Вбудовування 
та отримання даних у методі LSB, приклад циклу шифрування та рошифрування даних; 
3. Аналіз розробки та роботи модулів та методів створення Telegram-боту;  4. Охорона 
праці.     
 
.6. Консультанти з проекту (роботи) із зазначенням розділів проекту, що їх стосуються 
Підпис, дата 
Прізвище, ініціали та посада 
Розділ завдання завдання 
консультанта 
видав прийняв 
Охорона праці  Кожем’якін О.С.    
старший викладач кафедри 
   
безпеки життєдіяльності 
 
 
7. Дата видачі завдання  18 лютого 2022 року  
  
 
 
 
 
КАЛЕНДАРНИЙ ПЛАН 
 
Термін  
№ Назва етапів дипломного проекту  
виконання етапів Примітка  
з/п (роботи)  
проекту (роботи) 
1. Аналіз технічного завдання та пошук 
18.02.22 – 09.03.22  
літератури 
2. Аналіз принципів побудови стеганографічних 
10.03.22 – 24.03.22  
систем захисту інформації 
3. Аналіз методів побудови звукової 
25.03.22 – 10.04.22  
стеганографії 
4. Побудова та обґрунтування алгоритму 
11.04.22 – 25.04.22  
приховування даних у звуковій інформації 
5. Побудова та обґрунтування алгоритму для 
приховування даних у аудіосигналах за 26.04.22 – 10.05.22  
допомогою Telegram-бота 
7. Виконання розділу охорони праці  11.05.22 – 26.05.22  
8. Оформлення пояснювальної записки 27.05.22 – 01.06.22  
9. Оформлення презентації 02.06.22 – 09.06.22  
 
 
 
Студент        Присяжненко В.В.  
 ( підпис ) (прізвище та ініціали) 
 
Керівник проекту (роботи)  Палагін В.В.  
 ( підпис ) (прізвище та ініціали) 
 
ЗМІСТ 
 
ВСТУП ................................................................................................................................... 3 
РОЗДІЛ 1. АНАЛІЗ ПРИНЦИПІВ ПОБУДОВИ СТЕГАНОГРАФІЧНИХ СИСТЕМ 
ЗАХИСТУ ІНФОРМАЦІЇ .................................................................................................... 5 
1.1. Історія та розвиток стеганографії .......................................................................... 5 
1.2. Галузі застосування стеганографії ......................................................................... 6 
1.3. Основні методи стеганографії ................................................................................ 9 
1.4. Висновок ................................................................................................................. 12 
РОЗДІЛ 2. МЕТОДИ ПОБУДОВИ ЗВУКОВОЇ СТЕГАНОГРАФІЇ ............................. 13 
2.1. Особливості слухової системи людини (ССЛ) ................................................... 13 
2.2. Цифрові формати аудіосигналів та особливості їх комп’ютерної обробки .... 14 
2.3. Методи і алгоритми звукової стеганографії ....................................................... 20 
2.4. Побудова алгоритму приховування даних у звуковій інформації ................... 23 
2.5. Демонстрація алгоритму ....................................................................................... 30 
2.6. Висновок ................................................................................................................. 34 
РОЗДІЛ 3. РОЗРОБКА АЛГОРИТМУ TELEGRAM-БОТА ДЛЯ ПРИХОВАНОЇ 
ПЕРЕДАЧІ ДАНИХ ........................................................................................................... 35 
3.1. Основи розробки Telegram-Бота .......................................................................... 35 
3.2. Розробка алгоритму для приховування даних у аудіосигналах за допомогою 
Telegram-Бота .................................................................................................................. 41 
3.3. Аналіз функціонування алгоритму ...................................................................... 52 
3.4. Висновок ................................................................................................................. 59 
 
БІ81.22.18008.248 ПЗ 
Змн.  Арк. № докум. Підпис Дата 
 Розроб. Присяжненко В.В. Розробка стеганографічної Літ. Арк. Акрушів 
 Перевір. Палагін В.В. 3 
системи прихованої передачі 107 
 Реценз. Андрієнко В.О. 
 Н. Контр.  Палагін В.В. звукових даних 
 ЧДТУ 
 Затверд.  
РОЗДІЛ 4. ОХОРОНА ПРАЦІ .......................................................................................... 60 
4.1 Аналіз небезпек та шкідливостей, які виникають в приміщені 
експериментального відділу .......................................................................................... 60 
4.2 Розробка системи пожежної сигналізації в приміщенні експериментального 
відділу ............................................................................................................................... 65 
ВИСНОВОК ........................................................................................................................ 73 
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ ................................................................... 74 
ДОДАТКИ ........................................................................................................................... 75 
Додаток А (Лістинги файлів) ............................................................................................ 75 
Додаток Б (Ілюстративний матеріал) ............................................................................... 85 
 
  
Лист 
БІ81.22.18008.248 ПЗ 4 
Змін. Лист № докум. Підпис Дата 
ВСТУП 
 
 У сучасному світі існує безліч методів захисту інформації, починаючи від 
правового забезпечення та закінчуючи програмним, технічно-апаратним, 
математичним та навіть лінгвістичним методом засобу гарантування інформаційної 
безпеки. Так само пліч-о-пліч розвивається галузь інформаційних технологій, вона в 
свою чергу впливає на безліч чинників рутинного життя. Кожна людина повинна бути 
захищена, навіть коли це стосується інформаційної безпеки.  
У людини не повинно бути страху перед тим, що у неї є ризик втрати важливої 
інформації або те, що цю інформацію може переглянути умовна “людина по 
середині”. У зв'язку з цим було вирішено розробити стеганографічну систему 
прихованої передачі звукових даних використовуючи звичайний мессенджер 
Telegram та вбудовану функцію створення особистого Telegram-Бота для 
зашифровування інформації. 
Такий спосіб зберігання або передачі інформації з урахуванням зберігання його 
в таємниці є досить популярний у наші часи. Одразу можемо згадати кольорові 
лазерні принтери Hewlett-Packard та Xerox, в них є функції маркування інформації у 
вигляді крихітних жовтих точок на кожну сторінку. Ці ледь помітні точки містять 
закодовані серійні номери принтера, а також позначки дати та часу.  
У відмінності від криптографії, яка ховає у собі вміст повідомлення, 
стеганографія ховає сам факт його існування. Цей факт облегшує приховування та 
зберігання інформації. Переваги стеганографії полягає у тому, що повідомлення не 
приваблює до себе уваги. 
Аби створити чат-бота, що буде використовувати стеганографічні методи, 
потрібно розібратися з термінологією. Чат-бот – це деяка програма, яка створена для 
ведення розмови в чаті за допомогою команд або текстових повідомлень, без контакту 
з живим людиною-агентом. Взагалі, чат-бот є типом програмного забезпечення, який 
допомагає користувачам та вирішує їхні задачі через деякі платформи обміну 
Лист 
БІ81. 22.18008.248 ПЗ 5 
Змін. Лист № докум. Підпис Дата 
інформацією, у нашому випадку – мессенджер Telegram. Створені чат-боти повинні 
переконливо моделювати поведінку реальної людини як партнера при розмові, а тому 
система чат-боту, як правило, вимагає постійного налаштування та тестування.  
Створений чат-бот, який буде використовуватися як частина системи 
прихованої передачі звукових даних буде включати у собі діалогову систему для 
різних цілей, включаючи обслуговування клієнта, маршрутизацію запитів та обробку 
та зберігання інформації. Також чат-бот буде актуальним у наш час, адже вони все 
частіше використовуються на підприємствах і часто використовуються для 
автоматизації завдань, які не вимагають талантів, заснованих на навичках. 
Telegram-бот буде грати роль клієнта в моделі клієнт-сервер, тоді як роль 
сервера зазвичай грають веб-сервери. Тому однією із цілей створення системи для 
прихованої передачі звукових даних буде також і створення програми, яка буде 
запускати автоматизовані завдання через мережу Інтернет для обміну інформації у 
малих та великих масштабах.  
 
 
 
 
 
 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 6 
Змін. Лист № докум. Підпис Дата 
РОЗДІЛ 1. АНАЛІЗ ПРИНЦИПІВ ПОБУДОВИ СТЕГАНОГРАФІЧНИХ 
СИСТЕМ ЗАХИСТУ ІНФОРМАЦІЇ 
 
1.1. Історія та розвиток стеганографії 
Перше зареєстроване використання стеганографії датується 440 роком до нашої 
ери. У Греції Геродот згадує два приклади у своїх «Історіях»[1]. Гістіей надіслав 
послання своєму васалу Арістагору, поголив волосся свого найнадійнішого слуги, 
«позначив» повідомлення на його шкірі і відправив його в дорогу, коли його волосся 
відросло, з інструкціями: «Коли ти прийдеш в Мілет, запропонуй Арістагору поголити 
тобі голову і подивись на неї». Крім того, Демарат надіслав попередження про 
майбутній напад до Греції, написавши його безпосередньо на дерев’яній основі 
воскової таблички перед нанесенням на її поверхню з бджолиного воску. Воскові 
таблички були поширені тоді як багаторазові письмові поверхні, іноді 
використовувалися для скорочення. 
У своїй роботі Polygraphiae Йоганнес Тритемій розробив свій так званий «Ave-
Maria-Cipher», який може приховувати інформацію в латинській славі Бога. 
Наприклад, «Auctor Sapientissimus Conseruans Angelica Deferat Nobis Charitas 
Potentissimi Creatoris» містить приховане слово VICIPEDIA. 
Існує версія, що древні шумери одними з перших використовували 
стеганографію, так як було знайдено безліч глиняних клинописних табличок, в яких 
один запис покривався шаром глини, а на другому шарі писалася інша. Проте 
противники цієї версії вважають, що це було зовсім не спробою приховування 
інформації, а лише практичною потребою. 
Також, під час Другої світової війни активно використовувалися мікрокрапки - 
мікроскопічні фотознімки, що вклеюються в текст листів. 
З епохи розробки мережевих додатків дослідження стеганографії розвинулися 
від стеганографії зображень до стеганографії в потокових медіа, таких як Voice over 
Internet Protocol (VoIP). 
Лист 
БІ81.22.18008.248 ПЗ 7 
Змін. Лист № докум. Підпис Дата 
У 2003 році Giannoula et al. Була розроблена методика приховування даних, яка 
стискає форму вихідного відеосигналу кадр за кадром. [3] 
У 2005 році Dittmann et al. вивчав стеганографію та водяні знаки 
мультимедійного контенту, наприклад як VoIP. 
У 2008 році Yongfeng Huang і Shanyu Tang представили новий метод 
приховування інформації в голосових потоках VoIP з низькою бітовою швидкістю, і 
їхня робота зі стеганографії була першою в історії спробою використовувати теорію 
графів і квантовану експоненціальну модуляцію для покращення розділу кодової 
книги при низькій швидкості потокового передавання даних. 
У 2011 і 2012 роках Юнфен Хуанг і Шанью Тан розробили нові стеганографічні 
алгоритми, які використовують параметри кодека як об’єкт покриття для реалізації 
прихованої стеганографії VoIP в реальному часі. Їхні висновки були опубліковані в 
IEEE Transactions on Information Forensics and Security. 
Одним із прикладів досить простого способу стеганографії бачимо на рис. 1.1., 
де одне і те саме зображення, яке розглядається білим, синім, зеленим і червоним 
світлом, виявляє різні приховані числа. 
 
Рисунок – 1.1. Приклад використання стеганографії 
  
1.2. Галузі застосування стеганографії 
Стеганографія використовується у різноманітних сферах життя. Можна навіть 
зробити таке заключення, що вона застосовується не тільки задля приховування 
інформації в комп’ютерних файлах, а й наприклад має вплив на культуру мистецтва. 
Мистецтво приховування даних у головоломках може скористатися перевагами 
Лист 
БІ81.22.18008.248 ПЗ 8 
Змін. Лист № докум. Підпис Дата 
ступенів свободи у формулюванні головоломки, використовуючи початкову 
інформацію для кодування ключа в головоломці/зображенні головоломки. 
Наприклад, стеганографія з використанням головоломок судоку має стільки 
ключів, скільки можливих рішень головоломки судоку, тобто 6,71 × 1021. [2] 
Деякі сучасні комп’ютерні принтери використовують стеганографію, зокрема 
кольорові лазерні принтери Hewlett-Packard та Xerox. Принтери додають крихітні 
жовті точки на кожну сторінку. Ледь помітні точки містять закодовані серійні номери 
принтера, а також позначки дати та часу. 
Чим більше повідомлення (у двійкових даних кількість бітів ) порівняно з 
прихованим повідомленням, тим легше приховати приховане повідомлення (як 
аналогія, чим більше «стіг сіна», тим легше приховати «голку»). Таким чином, 
цифрові зображення, які містять багато даних, іноді використовуються для 
приховування повідомлень в Інтернеті та інших цифрових носіях зв’язку. 
Незрозуміло, наскільки поширена ця практика насправді. 
У 2010 році Федеральне бюро розслідувань заявило, що російська служба 
зовнішньої розвідки використовує спеціальне програмне забезпечення для 
стеганографії для вбудовування зашифрованих текстових повідомлень у файли 
зображень для певного спілкування з «незаконними агентами» (агентами без 
дипломатичного прикриття), які перебувають за кордоном. 
23 квітня 2019 року Міністерство юстиції США оприлюднило обвинувальний 
акт, згідно з яким китайський бізнесмен і колишній головний інженер General Electric 
Сяоціна Чжена звинувачують у змові з метою крадіжки інтелектуальної власності та 
комерційної таємниці від General Electric. Чжен нібито використовував 
стеганографію, щоб вилучити 20 000 документів від General Electric до Tianyi Aviation 
Technology Co. в Нанкіні, Китай, компанії, у якій ФБР звинуватило його в тому, що 
вона починала з підтримки китайського уряду. [4] 
Існують розподілені методи стеганографії, включаючи методики, які 
розподіляють корисне навантаження через декілька файлів носія в різних місцях, щоб 
Лист 
БІ81.22.18008.248 ПЗ 9 
Змін. Лист № докум. Підпис Дата 
ускладнити виявлення. Наприклад, патент США 8 527 779 криптографа Вільяма 
Істтома ( Chuck Easttom ).  
Головоломки, які представлені Cicada 3301, включають стеганографію з 
криптографією та інші методи вирішення з 2012 року. Головоломки, що містять 
стеганографію, також були представлені в інших іграх альтернативної реальності. 
Повідомлення The May Day mystery  включають стеганографію та інші методи 
вирішення з 1981 року. 
Цифрові водяні знаки (ЦВЗ) використовуються для захисту від копіювання, 
збереження авторських прав. Невидимі водяні знаки зчитуються спеціальним 
пристроєм, який може підтвердити чи спростувати коректність. ЦВЗ можуть містити 
різні дані: авторські права, ідентифікаційний номер, керуючу інформацію. Найбільш 
зручними для захисту за допомогою ЦВЗ є нерухомі зображення, аудіо та відеофайли. 
Чутки про використання терористами стеганографії з’явилися після двох статей 
USA TODAY від 5 лютого 2001 року: «Терористи приховують інструкції в Інтернеті» 
та «Терористичні організації приховують онлайн-шифрування». 10 липня 2002 року 
ця ж газета опублікувала статтю під назвою «Бойовики обгортають мережу 
джихадистськими посиланнями». Опублікована в статті інформація свідчить, що 
терористи використовують фотографії на eBay для доставки прихованих повідомлень. 
Багато ЗМІ відтворили ці повідомлення, особливо після терактів 11 вересня, хоча 
підтвердження цієї інформації не було отримано. Стаття USA TODAY була написана 
іноземним журналістом Джеком Келлі, який був звільнений у 2004 році після того, як 
з'ясувалося, що інформація сфабрикована. 30 жовтня 2001 р. New York Times 
опублікувала статтю під назвою «Замасковані терористичні повідомлення можуть 
ховатися в кіберпросторі». У статті було висловлено припущення, що Аль-Каїда 
використовує стеганографію для приховування повідомлень у зображеннях, а потім 
для передачі їх електронною поштою та Usenet з метою підготовки терактів 11 
вересня. У посібнику з навчання терориста «Технологічний муджахид, навчальний 
посібник для джихаду» є глава, присвячена використанню стеганографії. [5] 
Лист 
БІ81.22.18008.248 ПЗ 10 
Змін. Лист № докум. Підпис Дата 
1.3. Основні методи стеганографії 
Стеганографія дозволяє не тільки приховано передавати дані (так звана 
класична стеганографія), але й успішно вирішує шумостійку аутентифікацію, 
запобігання несанкціонованому копіювання інформації, відстеження поширення 
інформації в мережах зв’язку, пошук інформації в мультимедіа тощо. Проблемні бази 
даних дозволяють вирішувати деякі важливі проблеми захисту інформації деяких 
галузей прикладних програм в рамках традиційного існуючого інформаційного 
потоку або інформаційного середовища. Стеганографія має два основні види 
використання: цифрову обробку сигналів (DSP) і нецифрову. У першому випадку 
секретна інформація вбудована в цифрові дані, які зазвичай мають аналоговий 
характер (голос, зображення, аудіо та відео). 
Друге – конфіденційна інформація розміщується в заголовку файлу або пакета 
(ця область не використовується широко через відносну простоту пошуку та/або 
знищення прихованої інформації). Переважна більшість сучасних досліджень у галузі 
стеганографії пов’язані з ЦОС, що дозволяє говорити про цифрову стеганографію 
(ЦС). Дослідження стеганографії популярні принаймні з двох причин: обмеження на 
використання криптографічних інструментів у деяких країнах і питання захисту прав 
власності на інформацію, представлену в цифровому вигляді. Перша причина 
породила велику кількість досліджень класичного стилю стеганографії, тобто 
приховування авторитетних фактів передачі, а друга причина - велика кількість робіт 
у галузі так званих цифрових водяних знаків. мати можливість контролювати це 
використання. 
Порожній контейнер (або так званий контейнер-оригінал) – це контейнер с, що 
не містить прихованої інформації. Повний контейнер (результатний контейнер) - 
контейнер c, що містить приховану інформацію m (см). Однією з вимог є те, що 
отриманий контейнер не повинен візуально відрізнятися від оригінального 
контейнера. Є два основних типи контейнерів: потоковий та стаціонарні контейнери. 
Контейнер потоку - це послідовність бітів, що постійно змінюється. Повідомлення 
Лист 
БІ81.22.18008.248 ПЗ 11 
Змін. Лист № докум. Підпис Дата 
вбудовується в нього в режимі реального часу, тому кодер не знає заздалегідь, чи 
достатньо великий контейнер, щоб передати все повідомлення. В один великий 
контейнер можна вбудувати кілька повідомлень. Відстань між вбудованими бітами 
визначається генератором псевдовипадкових послідовностей (ГПВП) з рівномірним 
розподілом інтервалів між вибірками. Основною проблемою є синхронізація, 
визначення початку та кінця послідовності. Якщо в даних контейнера є біти 
синхронізації, заголовки тощо, може послідувати прихована інформація. 
Стеганосистема у деяких загальних випадках може виглядати, як система 
зв’язку. Схожа структурна схема стеганосистеми представлена на рис. 1.2. 
 
Рисунок 1.2. – Структурна схема стеганосистеми 
 
 Методи стеганографії з цифровими повідомленнями: 
• Приховування повідомлень у найнижчих фрагментах із зашумленими 
зображеннями або звуковими файлами. 
• Приховування даних у зашифрованих або випадкових даних. Повідомлення, яке 
потрібно приховати, шифрується, а потім використовується для перезапису 
частини значно більшого блоку зашифрованих даних або блоку випадкових 
Лист 
БІ81.22.18008.248 ПЗ 12 
Змін. Лист № докум. Підпис Дата 
даних (незламний шифр, як одноразовий блокнот, генерує зашифровані тексти, 
які виглядають абсолютно випадковими без приватного ключа). 
• Натирання й відвіювання — це криптографічна техніка для досягнення 
конфіденційності без використання шифрування під час надсилання даних 
через незахищений канал. 
• Функція моделювання імітації перетворює один файл у статистичний профіль 
іншого. Це може заважати статистичним методам, які допомагають атакам 
грубої сили визначити правильне рішення в атаках із використанням лише 
зашифрованого тексту. 
• Використовуйте надмірність у цільовому наборі інструкцій, щоб приховати 
повідомлення у підроблених виконуваних файлах. 
• Зображення, вбудоване у відео (відтворення на повільній або швидшій 
швидкості). 
• Введіть непомітні затримки в пакетах, що надсилаються по мережі з клавіатури. 
Затримки натискання клавіш у деяких програмах (telnet або програмне 
забезпечення віддаленого робочого столу) можуть означати затримки пакетів, 
які можна використовувати для шифрування даних. 
• Змініть порядок елементів у колекції. 
• Стеганографія на основі вмісту приховує інформацію в семантиці, яку 
користувач призначає дейтаграмі. Ці системи забезпечують захист від 
нелюдських супротивників/наглядачів. 
• Блог-Стеганографія. Повідомлення поділяються на фракції, а (зашифровані) 
фрагменти додаються як коментарі до осиротілих веб-журналів (або pin-бордів 
на платформах соціальних мереж). У цьому випадку вибір блогів є симетричним 
ключем, який використовують відправник і одержувач; носієм прихованого 
повідомлення є вся блогосфера. 
• Змінення відлуння звукового файлу (ехостеганографія). 
• Стеганографія для звукових сигналів. 
Лист 
БІ81.22.18008.248 ПЗ 13 
Змін. Лист № докум. Підпис Дата 
• Стеганографія сегментації складності бітової площини 
• Включення даних у ігноровані розділи файлу, наприклад, після логічного кінця 
файлу-носія. 
• Адаптивна стеганографія: стеганографія на основі тону шкіри з використанням 
секретного кута вбудовування. 
• Вбудовування даних у діаграму потоку керування програмою, що піддається 
аналізу потоку керування 
 
1.4. Висновок 
На сьогоднішній день стеганографія має чималий влив на розвиток сфери 
інформаційних технологій. Історія стеганографіїї починається ще з 440 року до нашої 
ери, та попри час ця галузь все ще є актуальною і розвивається з часом. Актуальною є 
й ідея розробки стеганографічної системи прихованої передачі даних, а набір методів 
може лише розкрити потенціал цієї галузі. Без існування стеганографії було б важко 
уявити собі існування таких речей як цифрові водяні знаки, системи нанесення на 
папір серії чи інших даних при використанні деяких принтерів чи ксероксів, тому 
актуальність використання і розробки подібних систем можуть у деяких випадках 
навіть випереджувати свій час у зв’язку з використанням стеганографії у деяких 
країнах ц високим рівнем цензури. 
 
 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 14 
Змін. Лист № докум. Підпис Дата 
РОЗДІЛ 2. МЕТОДИ ПОБУДОВИ ЗВУКОВОЇ СТЕГАНОГРАФІЇ 
 
2.1. Особливості слухової системи людини (ССЛ) 
Щоб обговорити питання до введення інформації в звукові сигнали, необхідно 
визначити вимоги, які можуть пред'являтися до стеганографічних систем, що 
використовуються для вбудовування інформації в звукові сигнали: прихована 
інформація повинна бути стійкою до різнокольорових шумів (білий, рожевий, 
червоний, синій, фіолетовий, сірий та інші), втрат, стиснення, фільтрація, аналогове 
та цифрове перетворення режимів; прихована інформація не повинна вказувати на 
спотворення, які сприймає слухова система людини; 
Спроба видалити приховану інформацію може завдати серйозної шкоди 
контейнеру; прихована інформація не повинна суттєво змінювати статистику 
контейнера. Методи, що використовуються в інших типах стеганографії, можна 
використовувати для включення прихованої інформації в звуковий сигнал. 
Наприклад, ви можете вставити інформацію, замінивши найменші значущі біти (усі 
або частину). Або ви можете побудувати систему стеганографії на основі звукових 
сигналів і властивостей слухової системи людини. 
Слухову систему людини можна представити як аналізатор спектру, який може 
виявляти та ідентифікувати сигнали в діапазоні 10 - 20 000 Гц. Слухову систему 
людини можна змоделювати як 26 проникних фільтрів, пропускна здатність яких 
збільшується з частотою. Слуховий апарат людини розрізняє зміни фази сигналу 
слабше, ніж зміни амплітуди або частоти. 
Аудіосигнали можна розділити на три класи: 
• розмова телефонної якості, діапазон 300 – 3400 Гц; 
• широкосмугова мова 50 – 7000 Гц; 
• широкосмугові аудіосигнали 20 – 20000 Гц. 
Майже всі звукові сигнали мають характеристику. Кожна з них являє собою 
достатньо великий обсяг даних, щоб статистичні методи могли бути використані для 
Лист 
БІ81.22.18008.248 ПЗ 15 
Змін. Лист № докум. Підпис Дата 
реалізації інформації. Перший з описаних методів, призначений для цієї 
характеристики звукових сигналів, працює в налаштуваннях часу. 
 
2.2. Цифрові формати аудіосигналів та особливості їх комп’ютерної обробки  
Формат MP3 
MP3 (формально MPEG-1 Audio Layer III або MPEG-2 Audio Layer III) — це 
формат кодування цифрового аудіо, розроблений в основному Товариством 
Fraunhofer IIS в Німеччині за підтримки інших вчених у сфері цифрових технологій у 
Сполучених Штатах та інших країнах. Спочатку визначений як третій аудіоформат 
стандарту MPEG-1, він був збережений і додатково розширений — визначаючи 
додаткові бітрейти та підтримку більшої кількості аудіоканалів — як третій 
аудіоформат наступного стандарту MPEG-2. Третя версія, відома як MPEG 2.5 — 
розширена для кращої підтримки нижчих швидкостей — зазвичай реалізується, але 
не є визнаним стандартом. 
Високе стиснення MP3 досягається за допомогою досить складного алгоритму 
кодування. Використовуються математичні методи компресії та характеристики 
слуху людини (психоакустичні моделі): ефект маскування слабкого звуку однієї 
частоти більш гучним звуком тієї ж чи суміжної частоти, зниження чутливості вуха 
до тихих звуків. Гучність не чутлива до звуку. Звуковий потік під час кодування 
поділяється на рівні регіонів (кадрів). Кожен кадр окремо кодується своїми власними 
параметрами і містить заголовок, який визначає ці параметри. Стиснення можна 
виконувати з різними якостями та розмірами кінцевого файлу. Ступінь стиснення 
характеризується бітрейтом - кількістю інформації, що передається за одиницю часу. 
Файли MP3 зазвичай кодуються зі швидкістю від 64 до 320 кілобіт на секунду, а також 
зі змінною швидкістю передачі даних (VBR) – найкраще підходить для цієї області, 
коли кожен кадр використовує власний кадр, бітрейт. 
 Файл MP3 складається з кадрів MP3, які складаються із заголовка та блоку 
даних. Ця послідовність кадрів називається елементарним потоком. Через «резервуар 
Лист 
БІ81.22.18008.248 ПЗ 16 
Змін. Лист № докум. Підпис Дата 
бітів» кадри не є незалежними елементами і зазвичай не можуть бути вилучені на 
довільних межах кадру. Блоки даних MP3 містять (стиснену) аудіоінформацію з точки 
зору частот і амплітуд. Заголовок MP3 складається з синхронізуючого слова, яке 
використовується для ідентифікації початку дійсного кадру. За цим слідує біт, що 
вказує, що це стандарт MPEG, і два біти, які вказують, що використовується рівень 3; 
отже, MPEG-1 Audio Layer 3 або MP3. Після цього значення будуть відрізнятися 
залежно від файлу MP3. ISO/IEC 11172-3 визначає діапазон значень для кожного 
розділу заголовка разом із специфікацією заголовка. Більшість файлів MP3 сьогодні 
містять метадані ID3, які передують або слідують за кадрами MP3, як зазначено на 
схемі. Потік даних може містити додаткову контрольну суму. 
Спільна стереосистема виконується лише покадрово. 
Формат WAV 
Формат аудіофайлу Waveform (WAVE, або WAV через розширення назви 
файлу; вимовляється «wave») — це стандарт формату аудіофайлів, розроблений IBM 
та Microsoft, для зберігання бітового потоку аудіо на комп’ютері. Це основний 
формат, який використовується в системах Microsoft Windows для нестисненого аудіо. 
Звичайним кодуванням бітового потоку є формат лінійної імпульсно-кодової 
модуляції (LPCM). 
WAV є застосуванням методу формату бітового потоку в форматі Resource 
Interchange File Format (RIFF) для зберігання даних фрагментами, і, таким чином, 
схожий на формат 8SVX і AIFF, що використовуються на комп'ютерах Amiga і 
Macintosh відповідно. 
Починаючи з Windows 2000 , WAVE_FORMAT_EXTENSIBLEбуло визначено 
заголовок, який визначає дані кількох аудіоканалів разом із положеннями динаміків, 
усуває неоднозначність щодо типів зразків та розмірів контейнерів у стандартному 
форматі WAV та підтримує визначення користувацьких розширень до фрагмента 
формату. [7] 
Лист 
БІ81.22.18008.248 ПЗ 17 
Змін. Лист № докум. Підпис Дата 
У форматі WAV є деякі невідповідності: наприклад, 8-розрядні дані є 
беззнаковими, а 16-бітові дані підписані, і багато фрагментів дублюють інформацію, 
знайдену в інших фрагментах. 
WAVE файл складається з двох частин: заголовку файлу і області даних. 
Формат звичайного WAVE файлу бере свій початок з RIFF заголовку і двох 
підзаголовків: "fmt" і "data", як показано далі на таблиці 2.1. 
 
Таблиця 2.1. – Заголовок RIFF  
Позиція 
Позиція Розмір Назва Пояснення 
(HEX) 
• RIFF Заголовок 
Містить літери "RIFF" в ASCII кодуванні 
0000 0 4 байти ChunkID 
(0x52494646 у порядку байт big-endian) 
36 + SubChunk2Size, або більш точно: 4 + (8 
+ SubChunk1Size) + (8 + SubChunk2Size) 
0004 4 4 байти ChunkSize Це розмір всього файлу в байтах, не 
враховуючи 8 байтів перших двох полів: 
ChunkID і ChunkSize. 
Містить літери "WAVE" 
0008 8 4 байти Format 
(0x57415645 у порядку байт big-endian). 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 18 
Змін. Лист № докум. Підпис Дата 
Підзаголовок "fmt" вказує на параметри даних звукозапису (Таблиця 2.2.): 
Таблиця 2.2. – Підзаголовок "fmt" 
Позиція 
Позиція Розмір Назва Пояснення 
(HEX) 
4 Містить літери "fmt " 
000C 12 Subchunk1ID 
байти (0x666d7420 у порядку байт big-endian). 
Приймає значення 16 для формату 
4 кодування PCM. 
0010 16 Subchunk1Size 
байти Це розмір області цієї підсекції, що 
слідує після цього поля. 
PCM = 1 (Лінійне квантування) 
Значення відмнінні від 1 вказують на 
2 
0014 20 AudioFormat наявність конкретного кодування аудіо 
байта 
даних. 
 
2 Кількість звукових каналів. Моно = 1, 
0016 22 NumChannels 
байта Стерео = 2, і т.д. 
4 Частота дискретизації у Герцах. 
0018 24 SampleRate 
байти Наприклад, 8000, 44100, інші. 
4 = SampleRate * NumChannels * 
001С 28 ByteRate 
байти BitsPerSample/8 
= NumChannels * BitsPerSample/8 
2 
0020 32 BlockAlign Кількість байт, яка міститься в одному 
байта 
семплі враховуючи кількість каналів. 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 19 
Змін. Лист № докум. Підпис Дата 
Продовження табл. 2.2. – Підзаголовок "fmt" 
Кількість біт в одному семплі. Так 
2 
0022 34 BitsPerSample звана "глибина" чи точність звучання. 
байта 
8, 16, 32, і так далі. 
Розмір поля з параметрами. Якщо 
2 
  ExtraParamSize PCM, ці два поля ExtraParamSize і 
байта 
ExtraParams не записуються. 
Місце для запису додаткових 
  X ExtraParams 
параметрів 
 
У підзаголовку даних "data" знаходяться розмір даних і фактичні дані 
аудіозапису (Таблиця 2.3.): 
Таблиця 2.3. – Підзаголовок "data"  
4 Містить літери "data" 
0024 36 Subchunk2ID 
байти (0x64617461 у порядку байт big-endian). 
Розмір даних звукозапису в байтах, які містяться в 
4 
0028 40 Subchunk2Size наступному полі. 
байти 
Кількість семплів * NumChannels * BitsPerSample/8 
002С 44 X Data Фактичні дані звукозапису. 
 
Формат Ogg 
Ogg — це безкоштовний відкритий формат контейнера, який підтримується 
Xiph.Org Foundation. Автори формату Ogg стверджують, що він не обмежений 
патентами на програмне забезпечення і призначений для забезпечення ефективної 
потокової передачі та маніпулювання високоякісними цифровими мультимедіа. Його 
назва походить від «ogging», жаргону з комп'ютерної гри Netrek. 
Лист 
БІ81.22.18008.248 ПЗ 20 
Змін. Лист № докум. Підпис Дата 
Формат бітового потоку «Ogg», розроблений в основному Xiph.Org Foundation, 
був розроблений як основа більшої ініціативи, спрямованої на створення набору 
компонентів для кодування та декодування мультимедійних файлів, які доступні 
безкоштовно та безкоштовно можна повторно реалізувати в програмному та 
апаратному забезпеченні. 
Формат складається з фрагментів даних, кожен з яких називається «сторінкою 
Ogg». Кожна сторінка починається з символів "OggS", щоб ідентифікувати файл як 
формат Ogg. 
"Серійний номер" і "номер сторінки" в заголовку сторінки ідентифікують кожну 
сторінку як частину серії сторінок, що утворюють бітовий потік. Кілька бітових 
потоків можуть бути мультиплексовані у файлі, де сторінки з кожного бітового потоку 
впорядковуються за часом пошуку даних, що містяться. Потоки бітів також можуть 
бути додані до існуючих файлів, процес, відомий як «ланцюжок», щоб призвести до 
послідовного декодування бітових потоків. 
Нижче наведено макет поля заголовка сторінки Ogg: 
 
Рисунок 2.1. – Макет поля заголовка Ogg 
 
Ліцензована BSD бібліотека, яка називається «libvorbis», доступна для 
кодування та декодування даних із потоків «Vorbis». Незалежні реалізації Ogg 
Лист 
БІ81.22.18008.248 ПЗ 21 
Змін. Лист № докум. Підпис Дата 
використовуються в кількох проектах, таких як RealPlayer і набір фільтрів 
DirectShow.[8] 
Mogg, «Multi-Track-Single-Logical-Stream Ogg-Vorbis», є багатоканальним або 
багатодорожечним форматом файлу Ogg. 
 
2.3. Методи і алгоритми звукової стеганографії 
Розглянемо популярні методи для вбудовування «секретного» тексту, 
зображень та аудіо в «загальнодоступний» звуковий файл. Наша мета — дати 
можливість відправнику таємно надсилати свої дані, приховані в пісні. 
Алгоритм молодшого значущого біта. LSB (Least Significant Bit) 
Алгоритм LSB — це класичний метод стеганографії, який використовується для 
приховування існування секретних даних всередині «публічних» даних. LSB або 
«найменш значущий біт», в обчислювальних термінах, представляє біт на місці 
одиниці в двійковому представленні числа. 
У спрощеній формі алгоритм LSB замінює LSB кожного байту в даних «носія» 
одним бітом із «секретного» повідомлення. Ця концепція відображена на рисунку 
нижче. 
 
 
Рисунок 2.2. – Спрощена форма алгоритму LSB 
 
Лист 
БІ81.22.18008.248 ПЗ 22 
Змін. Лист № докум. Підпис Дата 
Наприклад, ми можемо представити десяткове число 170 у двійковому 
позначенні як 10101010 (ми припускаємо машину з низьким порядком байтів, адреса 
якої починається справа і зростає вліво). Розглянемо випадок бітової послідовності 
«10101010», молодший біт у цьому випадку дорівнює 0. 
Відправник виконує «вбудовування» бітів секретних повідомлень в дані носія 
побайтно. У той час як одержувач виконує процедуру «вилучення», зчитуючи біти 
LSB кожного байту отриманих даних, таким чином одержувач відновлює секретне 
повідомлення. 
 
Рисунок 2.3. – Вбудовування та отримання даних у методі LSB 
 
Головна ідея тут полягає в тому, що ми намагаємося використати людське 
сприйняття цілісності несучого сигналу. LSB стеганографія дуже популярна для 
стеганографії зображень, тобто приховування секретів у зображеннях. І зміна LSB 
впливає на колір настільки незначно, що зміна кольору взагалі не помітна для 
людського ока. Однак людське вухо більш чутливе до незначних змін звуку, і, отже, 
«шум», який ми додаємо, матиме більшу ймовірність бути поміченим. Щоб подолати 
цю проблему цієї тривіальної форми алгоритму LSB, багато дослідників 
запропонували варіанти, які підвищують надійність у звуковій області. 
Лист 
БІ81.22.18008.248 ПЗ 23 
Змін. Лист № докум. Підпис Дата 
Основні маніпуляції з бітами в LSB досить прості. Ми виконаємо логічну 
операцію AND між кожним байтом аудіо-носія («пісня») і бітовою маскою, яка скидає 
LSB байта носія. 
 
Рисунок 2.4. – Використання логічної операції AND 
 
Потім ми виконаємо просту логічну операцію OR між модифікованим байтом-
носієм і наступним бітом (0 або 1) із секретного повідомлення. 
 
Рисунок 2.5. - Використання логічної операції OR 
 
Метод на основі частотної модуляції 
Метод на основі частотної модуляції, дуже потужний і не викликає шуму в 
сигналі несучої. Використовуючи цей метод, можна вставити одне «секретне» аудіо в 
Лист 
БІ81.22.18008.248 ПЗ 24 
Змін. Лист № докум. Підпис Дата 
інше «загальне» аудіо. Секретний звук повинен бути непомітним для людського вуха, 
і приймач зможе витягти секретний звук на їх кінці. 
Основна ідея цього алгоритму полягає в тому, що ми приховувємо наш 
секретний звук в діапазоні, близькому до ультразвуку, зберігаючи наші 
загальнодоступні аудіодані в діапазоні нормального слуху. Більшість людей старше 
певного віку буде не чутною майже ультразвуковим звуком. Також можна вирішити, 
яку частоту частотної модуляції використовувати, виходячи з віку та навіть статі 
вашої цілі. 
Приховування відлуння 
Вводячи коротке відлуння в сигнал хоста, метод приховування відлуння 
вбудовує дані в звуковий сигнал. Після додавання відлуння стего-сигнал зберігає ті 
самі статистичні та перцептивні характеристики. У цьому методі приховування даних 
залежить від трьох параметрів ехо-сигналу: початкової амплітуди, зміщення 
(затримки) і швидкості загасання, щоб відлуння не було чутно. Ефект не відрізнити 
при затримці до 1 мс між вихідним сигналом і ехо-сигналом. [9] 
 
2.4. Побудова алгоритму приховування даних у звуковій інформації 
Бібліотека OS 
Починаємо розробку алгоритму на мові Python версії 3.9, де спочатку 
імпортуємо бібліотеку os. Ця бібліотека забезпечує портативний спосіб використання 
функцій, що залежать від операційної системи. Нам потрібно буде читати або 
редагувати файл, будемо використовувати open(), якщо нам потрібно буде 
маніпулювати шляхами, будемо використовувати модуль os.path, а якщо ми захочемо 
прочитати всі рядки у всіх файлах у командному рядку, то використаємо модуль 
введення файлів. 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 25 
Змін. Лист № докум. Підпис Дата 
Створення маски 
Створюємо маску для отримання бітів із байтів тексту і розміщуємо їх у байтах 
образу. Degree - це кількість бітів з байта, які беруться для кодування даних у 
аудіофайлі. 
Створюємо функцію, яку називаємо - def create_mask(degree): 
У ній створюємо змінні text_mask та sample_mask з наступними бітовими 
занченнями: 
text_mask = 0b1111111111111111 
sample_mask = 0b1111111111111111 
text_mask <<= (16 - degree) 
text_mask %= 65536 
65535 - це максимальне 16-ти байтне число, використовуємо на 1 більше, щоб 
усі числа були менше нього. Таким чином ми прибираємо усі біти які більше нього. 
sample_mask >>= degree 
sample_mask <<= degree 
Оператор >>  може використовуватися для  різних цілей. У термінах C++ цей 
оператор перевантаження. У нашому прикладі він використовується як побітовий 
оператор (зсув вліво). 
Вкінці функції ми використовуємо return для повернення даних після виконання 
роботи самої функції. Отже повертаємо наступні дані: 
return text_mask, sample_mask 
Створення функції зашифровування даних 
Наступним кроком, ми створюємо функцію def encrypt(), де буде увесь алгоритм 
зашифровування даних. 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 26 
Змін. Лист № докум. Підпис Дата 
У функції створюємо наступні змінні: 
Таблиця 2.4. – Створені змінні у функції def encrypt 
Змінна Коментар 
degree = int(input('Введіть ступінь Дізнаємося у користувача, яким 
кодування 1/2/4/8/16:\n')) ступенем кодування він хоче 
 зашифрувати файл 
name_file = str(input()) Вводимо назву файлу ,який хочемо 
 закодувати 
src_file = open(name_file + '.wav', 'rb') Відкриваємо потрібний нам файл, 
 використовуючи байтове читання 
dst_file = open(name_file + ' (' + Створюємо змінну для файлу «кінцевого 
str(degree) + " degree)" + ".wav", 'wb') варіанту» 
text_len = os.stat('source_text.txt').st_size Використовуючи os.stat дізнаємося 
розмір файлу та записуємо його 
wav_info = src_file.read(44) Дізнаємося перші байти файлу у яких 
знаходиться інформація про файл 
data_len = Розмір кількості даних 
int.from_bytes(wav_info[40:44], 
byteorder='little') 
 
Далі створюємо перевірку на переповнення символів у тексті для допустимого 
аби зашифрувати: 
if text_len > data_len * degree / 16: 
        print('Занадто велике повідомлення для шифрування') 
        src_file.close() 
        return False 
Лист 
БІ81.22.18008.248 ПЗ 27 
Змін. Лист № докум. Підпис Дата 
 Записуємо змінну text = open('source_text.txt', 'r'). Вона буде зчитувати текст з 
нашого створеного файлу (цей текст буде використовуватися для вшиття у наш файл 
формату .wav). 
 Далі копіюємо інформацію з оригінального файлу у контейнер: 
    dst_file.write(wav_info) 
Зчитуємо кілкість інформації: 
data = src_file.read(data_len) 
Створюємо дві маски: текстову і для звукового семплу:   
text_mask, sample_mask = create_mask(degree) 
 Створюємо цикл у якому буде відбуватися зашифровування інформації: 
 
Рисунок 2.6. – Цикл шифрування даних 
 
Лист 
БІ81.22.18008.248 ПЗ 28 
Змін. Лист № докум. Підпис Дата 
 Як бачимо, спочатку ми зчитуємо перший символ нашого тексту, який будемо 
вшивати у аудіофайл. Наступним кроком ми будемо виводити символ і його двійкове 
представлення, де ord() – символ char в int з таблиці ASCII, а потім зміщуємо цей 
символ на 8 біт вліво, аби він став на першу позицію. 
 Створюємо цикл if, який буде працювати, коли степінь кодування інформації 
буде дорівнювати 16. У циклі, якщо другий символ є останнім у тексті і не значить 
ніякої інформаціїї, то ми беремо і заповнюємо його незначущими нулями, а інакше ми 
перетворюємо символ char в int з таблиці ASCII. Вприкінці циклу ми використовуємо 
логічне додавання символів. 
 
Рисунок 2.7. – Цикл зашифровування даних (продовження) 
 
У цьому ж циклі while True, створюємо наступний цикл (Рисунок 2.7.). У ньому 
ми будемо зчитувати семпл аудіофайлу і перетворювати його у int. Далі створюємо 
Лист 
БІ81.22.18008.248 ПЗ 29 
Змін. Лист № докум. Підпис Дата 
зріз, аби змістити кількість інформації на два символи вправо, потім отримуємо біти, 
які потрібно зашифрувати у семплі, зміщуємо символ вправо аби вони з’явилися на 
останніх позиціях. Записуємо біти у наш семпл за допомогою логічного додавання, 
записуємо два байти, які у нас вийшли у попередніх кроках у контейнер, і знову 
робимо перетворення з int у байти. 
Наприкінці циклу ми записуємо опис особистої інформації файлу: виконавець, 
рік, жанр та інше. 
    dst_file.write(data) 
    dst_file.write(src_file.read()) 
Потім завершуємо роботу з цими файлами: 
    src_file.close() 
    dst_file.close() 
Створення функції розшифровування даних 
Після написання алгоритму зашифровування, потрібно написати алгоритм 
розшифровування, аби логічно завершити побудову алгоритму приховування даних у 
звуковій інформації. 
Отже, створимо функцію def decrypt(). У ній будуть міститися такі змінні: 
degree, де ми вводимо ступінь кодування; 
wav_file, де ми вводимо ім’я файлу, який ми будемо декодувати; 
wav_info з першими байтами у яких знаходиться інформація про файл; 
data_len з інформацію про кількість байтів у файлі; 
to_read, де ми вказуємо шлях до нашого файлу. 
Ми також створюємо перевірочний цикл на переповнення символів: 
if to_read >= data_len * degree / 16: 
print('Надто багато символів, щоб прочитати') 
wav_file.close() 
return 
Лист 
БІ81.22.18008.248 ПЗ 30 
Змін. Лист № докум. Підпис Дата 
 Далі відкриваємо файл у який будемо записувати розшифровану інформацію з 
файла: 
     text = open('decrypted_text.txt', 'w') 
 Знову створюємо дві маски та інвертуємо нулі на одиниці, а одиниці на нулі: 
text_mask, sample_mask = create_mask(degree) 
    sample_mask = ~sample_mask 
     Зчитуємо дані, які ми будемо використовувати: 
data = wav_file.read(data_len) 
 Надалі створюємо цикл у якому буде розшифровуватися інформація (Рисунок 
2.8.): 
 
Рисунок 2.8. – Цикл розшифровування даних 
 
two_symbols – це наш контейнер, у якому буде зберігатися два зчитаних 
символи із семплу.  
Далі ми зчитуємо семпл, який буде int, а далі ми робимо зсув вліво на значення 
degree. Далі отримуємо значення двух символів. 
Лист 
БІ81.22.18008.248 ПЗ 31 
Змін. Лист № докум. Підпис Дата 
У цьому ж циклі ми створюємо новий(Рисунок 2.9.): 
 
Рисунок 2.9. – Цикл розшифровування даних (продовження) 
 
Ми зчитуємо не парну кількість символів та віднімаємо парну, розумно було б 
уявити, що вкінці усього циклу розшифровування, буде виходити одиниця. Поки 
цього не відбувається, то ми будемо отримувати дані другого символу. 
Після завершення цього циклу ми закриваємо наші файли: 
text.close() 
wav_file.close() 
 
2.5. Демонстрація алгоритму 
Для початку введемо деякий текст у наш текстовий файл, нехай це буде текст 
статті з англомовної Вікіпедії про стеганографію (Рисунок 2.10.): 
Лист 
БІ81.22.18008.248 ПЗ 32 
Змін. Лист № докум. Підпис Дата 
 
Рисунок 2.10. – Вводимо текст 
 
Запускаємо програму (Рисунок 2.11.), вводимо 1 для шифрування, обираємо 4 
ступінь кодування, та вводимо назву аудіофайлу «Sound Effect from NES Kung Fu» 
розміром 225 КБ: 
 
 
Рисунок 2.11. – Вводимо дані 
 
Лист 
БІ81.22.18008.248 ПЗ 33 
Змін. Лист № докум. Підпис Дата 
По завершенню роботи, бачимо новий створений аудіофайл з назвою 
використаного ступеня:  
 
Рисунок 2.12. – Новий створений файл 
 
Далі спробуємо розшифрувати наш зашифрований аудіофайл, для цього знову 
запустимо програму і введемо наступні дані: 
 
Рисунок 2.13. – Вводимо дані 
 
 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 34 
Змін. Лист № докум. Підпис Дата 
Тепер можемо порівняти наші результати, для цього відкриємо інший файл: 
 
Рисунок 2.14. – Розшифрований текст 
 
 Як бачимо, процес розшифровування успішно працює, однак є проблема із 
деякими символами, які не зчитуються нашою програмою. Для цього є наступне 
пояснення: 
Шрифт конфліктує зі шрифтом, який використовує хтось в іншій області світу. 
У вас може бути Ű у вашому шрифті, в той час, як десь ще хтось використовував Ɛ у 
тій же кодовій точці. Ваші файли несумісні. Unicode надає унікальний номер для 
кожного символу, тому у вас немає цієї проблеми, якщо ви використовуєте Unicode. 
Якщо ваш документ вимагає U+0289, то будь-якій комп'ютерній програмі буде ясно, 
яким має бути символ. Тобто це лише проблема кодування Unicode. 
Лист 
БІ81.22.18008.248 ПЗ 35 
Змін. Лист № докум. Підпис Дата 
2.6. Висновок 
У підсумках даного розділу можна сказати, що слухова система людини 
розпізнає сигнали в діапазоні 10 - 20 000 Гц, а це означає, що закодований звук не 
повинен бути допустимий у цих межах. При виконанні розробки будемо 
користуватися одним із популярних форматів аудіозаписів, а саме wav форматом, він 
є найякіснішим серед усіх, хоч і важить більше, аніж усі перелічені до цього формати. 
Структура wav формату також не є дуже складною для вивчення, що дає змогу без 
проблем вносити зміни у сигнали даного формату.  Алгоритм використання та 
реалізації молодшого значущого біта є найпопулярнішим і найлегшим для створення 
швидкого кодування, що зробить розробку алгоритму приховування передачі даних у 
аудіосигнал ефективною. Для побудови алгоритму було використано розроблену 
маску, яка дає змогу використовувати 16-ти бітні формати wav, які до речі є також 
популярними у наш час. Алгоритми зашифровування та розшифровування даних 
складають із себе процеси переведення символів char в int з таблиці ASCII та вшиття 
закодованої інформації у послідовностях за допомогою методу молодшого значущого 
біта. При тестуванні алгоритму не було видно проблем у його використанні, окрім 
конфлікту шрифтів з різних куточків планети. 
 
 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 36 
Змін. Лист № докум. Підпис Дата 
РОЗДІЛ 3. РОЗРОБКА АЛГОРИТМУ TELEGRAM-БОТА ДЛЯ ПРИХОВАНОЇ 
ПЕРЕДАЧІ ДАНИХ 
 
3.1. Основи розробки Telegram-Бота 
Для розробки Телеграм-Бота, спочатку потрібно дізнатися, які бібліотеки нам 
допоможуть у цій задачі. Усі використані бібліотеки розберемо далі:  
Перша бібліотека – Asyncio. 
asyncio — це бібліотека для написання паралельного коду за допомогою 
синтаксису async/await. 
asyncio використовується як основа для кількох асинхронних фреймворків 
Python, які забезпечують високопродуктивні мережі та веб-сервери, бібліотеки 
підключень до бази даних, розподілені черги завдань тощо. 
asyncio часто ідеально підходить для зв'язаного з IO та високорівневого 
структурованого мережевого коду. 
Async IO — це дизайн паралельного програмування, який отримав спеціальну 
підтримку в Python, швидко розвиваючись від Python 3.4 до 3.7 і, ймовірно, далі. 
Що розглядається: 
• Асинхронний IO (async IO): парадигма (модель), яка не залежить від мови, 
яка має реалізації в багатьох мовах програмування 
• async/await: два нових ключових слова Python, які використовуються для 
визначення корутинами 
• asyncio: пакет Python, який забезпечує основу та API для запуску та 
керування корутинами 
Корутини - це (спеціалізовані функції генератора), вони є серцем асинхронного 
IO в Python, і ми зануримося в них пізніше. 
Де підходить Async IO? 
Одночасність і паралелізм – це розширені теми, в які нелегко проникнути. Варто 
витратити хвилинку, щоб порівняти асинхронний IO з його аналогами, щоб мати 
Лист 
БІ81.22.18008.248 ПЗ 37 
Змін. Лист № докум. Підпис Дата 
контекст про те, як асинхронний IO вписується в більшу, іноді запаморочливу 
головоломку. 
Паралелізм полягає у виконанні кількох операцій одночасно. 
Багатопроцесорність є засобом досягнення паралелізму і передбачає розподіл завдань 
на центральні процесори комп’ютера (процесори або ядра). Багатопроцесорність 
добре підходить для завдань, пов’язаних із процесором: тісно пов’язані цикли та 
математичні обчислення зазвичай потрапляють до цієї категорії. 
Одночасність - це трохи ширший термін, ніж паралелізм. Це говорить про те, 
що кілька завдань можуть виконуватися в один і той же спосіб. (Є вислів, що 
одночасність не означає паралелізм.) 
Передача потоків — це модель одночасного виконання, при якій кілька потоків 
по черзі виконують завдання. Один процес може містити кілька потоків. Python має 
складні стосунки з потоками завдяки своєму GIL. 
Важливо знати про потоки, так це те, що це краще для завдань, пов’язаних з IO. 
У той час як завдання, пов’язане з процесором, характеризується тим, що ядра 
комп’ютера безперервно працюють від початку до кінця, робота, пов’язана з 
введенням-виводом, переважає через багато очікування на завершення 
введення/виводу. 
Щоб підсумувати вищесказане, паралельність охоплює як багатопроцесорність 
(ідеально підходить для завдань, пов’язаних із процесором), так і потокову роботу 
(підходить для завдань, пов’язаних із введенням-виводом). Багатопроцесорність є 
формою паралельності, причому паралелізм є специфічним типом (підмножиною) 
паралельності. Стандартна бібліотека Python пропонує давню підтримку обох цих 
пакетів через багатопроцесорні, потокові та concurrent.futures пакети. 
Насправді, async IO — це однопотоковий, однопроцесний дизайн: він 
використовує кооперативну багатозадачність. Іншими словами було сказано, що 
асинхронний IO дає відчуття паралельності, незважаючи на використання одного 
Лист 
БІ81.22.18008.248 ПЗ 38 
Змін. Лист № докум. Підпис Дата 
потоку в одному процесі. Корутини (головна функція асинхронного введення в/в) 
можна планувати одночасно, але вони не є одночасними. 
Асинхронний IO — це стиль одночасного програмування, але це не паралелізм. 
Він більш тісно пов’язаний з потоками, ніж з багатопроцесорністю, але дуже 
відрізняється від обох і є окремим членом у пакеті трюків паралельності. 
Користь бібліотеки можна побачити на наступному графіку: 
 
Рисунок 3.1. – Різниця тестів синхронного та асинхронного коду 
 
Залишається ще один термін. Що означає асинхронність чогось? Це не суворе 
визначення, але для наших цілей я можу думати про дві властивості: 
• Асинхронні підпрограми можуть «призупинятися» під час очікування 
кінцевого результату, а тим часом дозволяти виконувати іншим 
програмам. 
• Асинхронний код через механізм, наведений вище, полегшує одночасне 
виконання. Інакше кажучи, асинхронний код надає вигляд і відчуття 
паралельності. 
Лист 
БІ81.22.18008.248 ПЗ 39 
Змін. Лист № докум. Підпис Дата 
Бібліотека Aiogram. 
aiogram — це досить простий і повністю асинхронний фреймворк для Telegram 
Bot API, написаний на Python 3.7 з asyncio і aiohttp. Це допоможе вам зробити ваших 
ботів швидшими та простішими. 
Пройдемося по швидкому створенню тестового бота де розглядаються основні 
тези: 
1. Спочатку потрібно імпортувати всі необхідні модулі: 
 
Рисунок 3.2. – Імпортуємо необхідні модулі 
 
По-перше, ми бачимо, що з бібліотеки aiogram ми імпортували Bot, Dispatcher, 
executor, types. Тепер розберемо їх окремо 
Bot – ініціалізація бота для його використання. 
Dispatcher – це простий диспетчер оновлень. Він оброблятиме вхідні оновлення: 
повідомлення, відредаговані повідомлення, дописи на каналі, відредаговані дописи 
каналу, вбудовані запити, вибрані вбудовані результати, запити зворотного дзвінка, 
запити на доставку, запити перед оформленням замовлення. 
Executor. aiogram вміє працювати у двох режимах – polling та webhooks. Як я 
зрозумів, executor дозволяє решті механізмів бота абстрагуватися від 
використовуваного режиму. Наприклад, start_polling() просто створює реактор (loop) 
asyncio і запускає в ньому завдання self.dispatcher.start_polling(), а потім чекає на 
сигнал завершення. Ну і ще використовує обробники on_startup та on_shutdown. Це 
можна зробити і вручну, за потреби. webhooks використовує aiohttp для реалізації веб-
сервера, який отримуватиме запити від telegram. 
Types – це модуль, який дозволяє працювати з різноманітними типами даних у 
Телеграм-Боті, такі як types.message та інші.  
Лист 
БІ81.22.18008.248 ПЗ 40 
Змін. Лист № докум. Підпис Дата 
2. Потім потрібно ініціалізувати екземпляри бота і диспетчера. Токен бота, 
який ви можете отримати від @BotFather у Телеграмі. 
 
Рисунок 3.3. – Ініціалізація бота і диспетчера 
 
3. Наступний крок: взаємодія з ботами починається з однієї команди. 
Зареєструйте свій перший обробник команд: 
 
Рисунок 3.4. – Реєструємо перший обробник команд 
 
Якщо ви хочете обробляти всі текстові повідомлення в чаті, просто додайте 
обробник без фільтрів: 
 
Рисунок 3.5. – Обробник команд без фільтрів 
 
4. Останній крок: запускаємо довге опитування: 
Лист 
БІ81.22.18008.248 ПЗ 41 
Змін. Лист № докум. Підпис Дата 
 
Рисунок 3.6. – Запускаємо довге опитування 
 
На цьому етапі було оглянуто основні кроки для створення Телеграм-Бота. 
Бібліотека Urllib та модуль Request. 
Модуль urllib.request визначає функції та класи, які допомагають відкривати 
URL-адреси (в основному HTTP), має базову та дайджест-автентифікацію, 
перенаправлення, файли cookie та багато іншого. 
Модуль urllib.requestпропонує дуже простий інтерфейс у вигляді функції 
urllib.request.urlopen() , що дозволяє отримувати URL-адреси з використанням різних 
протоколів. Також цей модуль пропонує трохи складніший інтерфейс для обробки 
звичайних ситуацій, таких як базова автентифікація, файли cookie, проксі тощо. Вони 
надаються об'єктами, званими обробниками та " відкривачами ". 
Модуль підтримує отримання для багатьох схем URL-адрес (ідентифікованих 
рядком перед :в URL-адресі - наприклад, ftp:- це схема URL-адрес ftp://python.org/) з 
використанням пов'язаної з ними мережі. 
У найпростіших ситуаціях функція urllib.request.urlopen()дуже проста у 
використанні. При появі помилок або нетривіальних випадків при відкритті URL-
адрес, необхідне деяке розуміння протоколу передачі гіпертексту. Мета цього 
вступного матеріалу - проілюструвати використання модуля urllib.requestз докладним 
описом HTTP. 
Також розгляньте можливість використання у своєму коді, написаного для 
людей, стороннього модуля HTTP запитів requests(вимагає додаткової установки). 
У нашому випадку ми будемо використовувати це модуль для парсингу токену 
бота. 
Лист 
БІ81.22.18008.248 ПЗ 42 
Змін. Лист № докум. Підпис Дата 
Бібліотека os - модуль os надає безліч функцій для роботи з операційною 
системою, причому їхня поведінка, як правило, не залежить від ОС, тому програми 
залишаються переносними. 
 Модуль configparser. 
Модуль надає клас ConfigParser, що реалізує базову мову конфігурації, який 
надає структуру, аналогічну Microsoft Windows INI файлів. Його можна 
використовувати для написання програм Python, які можуть легко налаштовуватися 
кінцевими користувачами. 
 Модуль dataclass. 
Одна з нових можливостей, що з'явилися в Python 3.7 , - класи даних (Data classes). 
Вони мають автоматизувати генерацію коду класів, які використовуються для 
зберігання даних. Незважаючи на те, що вони застосовують інші механізми роботи, їх 
можна порівняти з "змінними іменованими кортежами зі значеннями за умовчанням". 
 
3.2. Розробка алгоритму для приховування даних у аудіосигналах за допомогою 
Telegram-Бота 
Почнемо розробку Telegram-Бота зі створення репозиторію та потрібних нам у 
майбуньому папок. Створюємо папку app у якій будуть знаходитися файл 
config_reader.py з парсером токену бота та папку handlers, де буде зберігатися значуща 
частина нашого коду, також створимо файл bot.py: 
Лист 
БІ81.22.18008.248 ПЗ 43 
Змін. Лист № докум. Підпис Дата 
 
Рисунок 3.7. – Створюємо репозиторій 
 
Створення алгоритму bot.py 
Перейдемо до наповнення файлу bot.py. Спочатку імопртуємо потрібні нам 
бібліотеки: 
import asyncio 
from aiogram import Bot, Dispatcher 
from aiogram.types import BotCommand 
from aiogram.contrib.fsm_storage.memory import MemoryStorage 
Далі створимо функцію set_commands: 
 
Рисунок 3.8. - Функція set_commands 
Лист 
БІ81.22.18008.248 ПЗ 44 
Змін. Лист № докум. Підпис Дата 
Ключове слово await дозволяє співпрограмі віддати контроль у головний цикл, 
який містить порядок виконання всіх сопрограмм. 
Якщо Python зустрічає ключове слово await то це можна описати так: - 
"відкласти виконання коду співпрограми process() до тих пір, поки я не отримаю 
результат виконання func(). У цей час я займуся чимось іншим". 
 Перед назвою функції ставимо async - це означає, що  ми використовуємо 
асинхронну обробку даних за допомогою імпортованої бібліотеки  asyncio. В функцію 
вводимо дані нашого бота і створюємо словник commands з командами /encrypt, 
/decrypt, /cancel, /about. Усі команди ми налаштуємо у наступних кроках. 
 Далі створюємо виконавчу функцію main: 
 
Рисунок 3.9. – Функція main 
 
Змінна config = load_config("config/bot.ini") зчитує налаштування нашого бота 
по наступному шляху config/bot.ini. У bot.ini вказуємо наступні дані, які ми отримали 
у @BotFather: 
[tg_bot] 
token = Сформований токен нашого бота 
admin_id = Особистий id адміністратора 
 Далі ініціалізуємо змінну нашого бота, який тримає у собі токен: 
bot = Bot(token=config.tg_bot.token) 
Аби бот використовував потрібні дані ми також створюємо config_reader.py: 
Лист 
БІ81.22.18008.248 ПЗ 45 
Змін. Лист № докум. Підпис Дата 
 
Рисунок 3.10. – Попередньо створений config_reader.py 
 
Повернемося до main.py та створимо змінну диспетчера: 
dp = Dispatcher(bot, storage=MemoryStorage()) 
 Також створюємо наступні змінні, які ми будемо використовувати трохи 
пізніше: 
register_handlers_common(dp) 
register_handlers_encryption(dp) 
register_handlers_decryption(dp) 
Лист 
БІ81.22.18008.248 ПЗ 46 
Змін. Лист № докум. Підпис Дата 
 Для ініціалізації хендлерів ми повинні імопртувати їх з наших майбутніх 
створених файлів, це буде виглядати так: 
 from app.config_reader import load_config 
from app.handlers.encryption import register_handlers_encryption 
from app.handlers.decryption import register_handlers_decryption 
from app.handlers.common import register_handlers_common 
 Тепер закінчимо створення нашого файлу main.py циклом запуску: 
if __name__ == '__main__': 
      asyncio.run(main()) 
Створення алгоритму common.py 
У цьому розділі буде оглянуто створення функцій таких команд як: /start, 
/cancel, /about. 
Імпортуємо необхідні бібліотеки: 
from aiogram import Dispatcher, types 
from aiogram.dispatcher import FSMContext 
 Бачимо, що з’явився новий імпорт – FSMContext. Уявімо покрокове введення 
даних, де на початку бот «вмикає» режим очікування певної інформації від 
конкретного користувача, далі на кожному етапі перевіряє дані, що вводяться, а по 
команді /cancel припиняє очікувати черговий крок і повертається в основний режим. 
Цей процес називається кінцевим автоматом (або FSM - Finite State Machine). 
 Створимо першу функцію /start. Результат дії цієї функції користувач буде 
бачити одразу, як тільки запустить бота: 
 
Рисунок 3.11. – Створення функції cmd_start 
Лист 
БІ81.22.18008.248 ПЗ 47 
Змін. Лист № докум. Підпис Дата 
 Створимо наступну функцію cmd_cancel, вона буде відміняти попередні введені 
користувачем дан, та виходити з циклу: 
 
Рисунок 3.12. – Створення функції cmd_cancel 
 
Додаємо останню асинхронну функцію у common.py, називаємо її cmd_about, її 
головна мета – надати користувачеві усю необхідну та загальну інформацію для 
зручного користування ботом: 
 
Рисунок 3.13. - Створення функції cmd_about 
 
Останнім кроком є реєстрація створених асинхронних функцій: 
 
Рисунок 3.14. – Реєстрація функцій 
 
Лист 
БІ81.22.18008.248 ПЗ 48 
Змін. Лист № докум. Підпис Дата 
Створення алгоритму encryption.py 
У новому файлі encryption.py буде розроблено алгоритм шифрування даних при 
використанні Telegram-Боту, а почнемо, як завжди з імпорту бібліотек: 
 
Рисунок 3.15. – Імпорти у encryption.py 
 
Помічаємо знову новий імпорт from app.handlers.mask import create_mask. Це та 
сама створена маска з алгоритму шифрування. Для неї було створено окремий 
mask.py, він виглядає наступним чином: 
 
Рисунок 3.16. – Файл mask.py 
Лист 
БІ81.22.18008.248 ПЗ 49 
Змін. Лист № докум. Підпис Дата 
 Після імпортування бібліотек у encryption.py, додаймо вже знайомі нам змінні 
config та bot, і нові coding_variants, insert_text, insert_wav: 
config = load_config("config/bot.ini") 
bot = Bot(token=config.tg_bot.token, parse_mode="HTML") 
coding_variants = ["1", "2", "4", "8", "16"] 
insert_text = () 
insert_wav = () 
Змінні coding_variants, insert_text, insert_wav будуть контейнерами для наших 
даних, які ми будемо вносити аби зашифрувати повідомлення у звуковий файл. 
Далі створюємо клас Encrypt, у ньому алгоритм буде запамятовувати дані, які 
ввів користувач, аби потім їх використати. У ньому будуть зберігатися дані про вибір 
ступеню зашифровування, введений текст, відісланий аудіофайл та результат 
підтвердження своїх дій: 
 
Рисунок 3.17. – Створюємо клас Encrypt 
 
Наступним кроком створюємо асинхронну функцію coding_variant_chosen, яка 
буде виводити повідомлення "�� Оберіть ступінь зашифрування:" та виводити 
клавіатуру зі значеннями coding_variants = ["1", "2", "4", "8", "16"]: 
 
Рисунок 3.18. - Створюємо функцію coding_variant_chosen 
Лист 
БІ81.22.18008.248 ПЗ 50 
Змін. Лист № докум. Підпис Дата 
 Створення функції coding_variant_chosen буде робити первірку на коректність 
введення потрібного варіанту, запам’ятовувати обраний варіант (coding_variants = 
["1", "2", "4", "8", "16"]), приховувати клавіатуру введення ступеню кодування та 
виводити повідомлення "�� Теперь введіть текст:": 
 
Рисунок 3.19. – Створюємо функцію coding_variant_chosen 
 
 Наступна функція text_chosen запам’ятовує введений користувачем текст, який 
він хоче зашифрувати, виводить текст "�� Теперь відішліть мені свій .wav:" та 
переходить до наступної функції: 
 
Рисунок 3.20. – Створюємо функцію text_chosen 
 
Наступна функція wav_chosen є досить об’ємною. Вона вміщує в себе наступні 
дії: приймає на сервер екземпляр аудіофайлу, що був відправлений користувачем; 
виводить повідомлення 'Файл успішно збережено ��' та запам’ятовує цей файл для 
процесу зашифровування; виводить повідомлення з обраними варіантами дій, які 
виконував користувач та запитує чи згоден він почати процес зашифровування з 
Лист 
БІ81.22.18008.248 ПЗ 51 
Змін. Лист № докум. Підпис Дата 
даними параметрами; відтворює клавіатуру з варіантами "Так", "Ні". Алгоритм 
показаний далі: 
 
Рисунок 3.21. – Створюємо функцію wav_chosen 
 
Далі йде остання асинхронна функція yes_or_no (детальніше у додатках). У ній 
може бути 3 варіанти розвитку сценарію: користувач відповідає "Так", - починається 
зашифровування; "Ні" - відбувається відміна усіх минулих дій та повернення на 
початкову точку; якщо користувач відповів дещо інше, то йому відправляють 
попередження "Будь ласка, оберіть відповідь, використовуючи клавіатуру нижче" і 
дають знову вибір між "Так" або "Ні".  
При виборі варіанту, який погоджується на зашифровування виконується 
алгоритм, який був розроблений у минулій частині але з заміною деяких змінних на ті 
змінні, які ми вводили, мають новий вигляд, наприклад: 
Лист 
БІ81.22.18008.248 ПЗ 52 
Змін. Лист № докум. Підпис Дата 
degree = int(user_data['chosen_variant']) 
name_file = str(user_data['chosen_wav']) 
Коли процес зашифровування закінчився, бот відправляє зашифрований файл 
та повідомлення про успішне зашифровування: 
await message.answer_document(open(remove_wav + ' (' + str(degree) + " degree)" 
+ ".wav", 'rb')) 
await message.answer('Файл успішно зашифрований!') 
Вкінці файлу ми реєструємо наші хендлери: 
 
Рисунок 3.22. – Реєстрація хендлерів 
  
Створення алгоритму decryption.py 
Переходимо до останнього файлу - decryption.py. Він буде реалізовувати 
розшифровування даних. Цей файл має увесь знайомий набір імпорту бібліотек, як і в 
encryption.py і також має наступні змінні: 
config = load_config("config/bot.ini") 
bot = Bot(token=config.tg_bot.token, parse_mode="HTML") 
coding_variants = ["1", "2", "4", "8", "16"] 
insert_text = () 
insert_wav = () 
 Як і в encryption.py ми створюємо клас Encrypt зі значеннями обраного варіанту 
закодування, відісланим аудіофайлом та вибором "Так" або "Ні" на питання "Ви 
хочете розшифрувати:…, наступним ступенем кодування:…? ". 
 Ми маємо подібну функцію dec_start, яка схожа на enc_start з encryption.py, 
маємо coding_variant_chosen, wav_chosen та знову ж таки функцію yes_or_no з трьома 
Лист 
БІ81.22.18008.248 ПЗ 53 
Змін. Лист № докум. Підпис Дата 
сценаріми розвитку, як і в encryption.py. Наш алгоритм дуже подібний на попередній 
файл, який ми створювали, але в цьому файлі ми використовуємо розшифровування, 
тому беремо розроблений у другому розділі алгоритм та поміщаємо його у наш 
обробник, не забуваємо також відправити розшифрований файл користувачеві таким 
чином: 
reading = open('source_text.txt') 
await message.answer(reading.read()) 
 Вкінці файлу реєструємо хендлери: 
 
Рисунок 3.23. – Реєстрація хендлерів 
 
3.3. Аналіз функціонування алгоритму 
Перевіримо функціонування програми на шифрування та розшифрування, для 
цього запустимо бот, та на пристрої натискаємо кнопку “СТАРТ”. Одразу ж побачимо 
привітання, та запропонований вибір команд (для цього також можна використати 
кнопку меню, та переглянути усі команди). Натискаємо “Меню” та бачимо наступне: 
 
Рисунок 3.24. – Меню 
Лист 
БІ81.22.18008.248 ПЗ 54 
Змін. Лист № докум. Підпис Дата 
 Тепер натиснемо на кнопку “Інформація” та отримаємо наступне повідомлення 
від бота: 
 
Рисунок 3.25. - Інформація 
 
 Після уважного прочитання інформації перейдемо до зашифровування. Для 
цього натиснемо кнопку “Зашифрувати”. Одразу ж бачимо, що відкривається меню з 
кнопками, які дають обрати ступінь зашифровування: 
Лист 
БІ81.22.18008.248 ПЗ 55 
Змін. Лист № докум. Підпис Дата 
 
Рисунок 3.26. – Меню з кнопками ступнею кодування 
 
 Можемо перевірити, та ввести не коректну відповідь, побачимо наступне: 
 
Рисунок 3.27. – Перевірка на помилкову відповідь 
 
Далі вводимо усі потрібні дані та відсилаємо аудіофайл, отримаємо запитання 
чи згодні ми на обробку даних, відповідаємо “Так” і отримуємо наступне: 
Лист 
БІ81.22.18008.248 ПЗ 56 
Змін. Лист № докум. Підпис Дата 
 
Рисунок 3.28. – Результат роботи бота 
  
 Бот створив новий файл на сервері ,та відправив його користувачеві, тепер 
давайте розшифруємо дане повідомлення і отримаємо успішний результат: 
Лист 
БІ81.22.18008.248 ПЗ 57 
Змін. Лист № докум. Підпис Дата 
 
Рисунок 3.29. – Успішне розшифровування даних 
 
Тепер проведемо тестування на сприйняття зашифрованого аудіосигналу на 
слух людини, для цього відкриємо спеціальну програму, наприклад FL Studio — 
редактор-секвенсер для написання музики. Попередньо створюємо декілька файлів з 
Лист 
БІ81.22.18008.248 ПЗ 58 
Змін. Лист № докум. Підпис Дата 
різним ступенем зашифрування, бажано аби у початкового аудіосигналу був 
невеличкий відступ в початку, так точніше можна побачити результат. Спеціально для 
того аби побачити більш явний результат, я використаю великий за обсягом текст, 
який знайду на довільному сайті. Результати порівняння бачимо наступні: 
 
Рисунок 3.30. – Результат порівняння аудіосигналів 
 
Лист 
БІ81.22.18008.248 ПЗ 59 
Змін. Лист № докум. Підпис Дата 
По аналізу АЧХ (амплітудно-частотної характеристики) можна зробити 
наступні висновки: 
1 ступінь кодування – невеликий сигнал, який програма аналізу АЧХ не може 
проаналізувати, людина не зможе відчути його; 
2 ступінь кодування – так само невеликий сигнал, який програма не може 
проаналізувати; 
4 ступінь кодування – програма аналізу АЧХ бачить невеликий сигнал в області 
від 1 до 5,7 ГГц при -66,6 дБ. Не дивлячись на це, людина так само не зможе відчути 
цього сигналу; 
8 ступінь кодування – вже більший сигнал від 1 до 7,6 Гц при -42,1 дБ, але 
людина не здатна відчути його слуховою системою. 
16 ступінь кодування – розподілений сигнал від 1 до 9,3 Гц при 6,7 дБ та від 56,9 
до 24 кГц при гучості від -35,2 дБ до -24,5 дБ. Такий сигнал людина зі здоровим 
слухом точно відчує, але при цьому сигнал йде 0,4 секунди. 
Приклад аналізу АЧХ 8 та 16 ступеню кодування: 
 
Рисунок 3.31. – Результат порівняння АЧХ 8 та 16 ступеня 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 60 
Змін. Лист № докум. Підпис Дата 
3.4. Висновок 
При розробці Telegram-Боту не виникало труднощів, усі бібліотеки дуже 
допомагали, а сучасна підтримка нової технології розробки ботів з використанням 
асинхронного коду дає змогу оптимізувати роботу та заощаджує час на обробку 
даних.  
Також при розробці бота, було переглянуте декілька прикладів оформлення 
репозиторію та наповненню їх змістовною частиною. Це дає зрозуміти структуру бота 
не тільки досвідченим розробникам, а й тим, хто тільки починає свій шлях у цій справі. 
Тестування Telegram-бота дало зрозуміти, що він добре оптимізований, а 
аналізи амплітудно-частотної характеристики аудіосигналів дають змогу для 
створення деяких рекомендацій користування ботом. Із цього випливає, що 
найрозумнішим було б зашифровувати ступенем від першого до четвертого, але й 
навіть у деяких випадках можна використовувати восьмий ступінь кодування. 
Шістнадцятий ступінь кодування не варто використовувати для занадто довгих 
повідомлень, адже сама структура аудіосигналу переписується і відчувається для 
слухової системи людини, як незрозумілий білий шум. Це дає можливість 
усвідомлення деяким третім особам, що цей аудіосигнал використовувався для цілей 
стеганографічного запису. 
 
 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 61 
Змін. Лист № докум. Підпис Дата 
РОЗДІЛ 4. ОХОРОНА ПРАЦІ 
 
4.1 Аналіз небезпек та шкідливостей, які виникають в приміщені 
експериментального відділу 
В даному розділі розглядаються та аналізуються умови праці в приміщенні 
експериментального відділу, в якому проводяться різноманітні дослідження щодо 
розробки стеганографічної системи прихованої передачі звукових даних. Цей відділ 
розташовується на другому поверсі триповерхової цегляної будівлі.  
Основна робота з розробки та оптимізації подібних систем полягає в проведенні 
розрахунків з використанням спеціальних прикладних програм, обробці інформації, 
моделювання різноманітних процесів, розробці схем та алгоритмів. Подібні роботи 
потребують використання сучасної комп’ютерної техніки. Устаткування відділу 
складається з трьох комп'ютерів та двох друкувальних пристроїв.  
Кабінет відділу має наступні розміри: довжина 6 м,  ширина 3,5 м,  висота 3 м.  
Приміщення розраховане на трьох одночасно працюючих чоловік. Площа, яка 
припадає на одного працівника – 7 м2, об’єм – 21 м3, що відповідає ДСанПІН 3.3.2.007-
98  з розрахунку на одного працівника. 
Робота працівників відділу відноситься до категорії 1-а легких, тому що 
виконується сидячи, не потребує систематичної фізичної напруги або підняття і 
перенесення ваги. Енерговитрати при виконанні такої роботи складають приблизно 
150 ккал/год, це еквівалентно 172 Дж/сек. 
Мікроклімат у відділі визначається: температурою повітря, відносною 
вологістю, швидкістю руху повітря і інтенсивністю теплового випроміню-вання від 
нагрітих поверхонь. 
Фактичні значення основних параметрів мікроклімату в приміщенні відділу 
наступні: 
1. Температура повітря: в холодний період року – 18-19°С; в теплий період року 
– 26-30°С. 
Лист 
БІ81.22.18008.248 ПЗ 62 
Змін. Лист № докум. Підпис Дата 
2.  Вологість повітря: в холодний період року – 50-52%; в теплий період              
року – 45-48%. 
3. Швидкість руху повітря: в холодний період року – 0,05-0,1 м/с; в теплий 
період року – 0,1 м/с. 
Нормативні параметри мікроклімату в приміщенні відділу: 
1. Температура повітря: в холодний період року – 22-24°С; в теплий період року 
– 22-28°С. 
2. Вологість повітря: 40-60 %. 
3. Швидкість руху повітря: не більше 0,1м/с; 
Вище наведені фактичні значення задовольняють ДСН 3.3.6.042-99, за 
виключенням температури в холодний та теплий період року. Необхідно встановити 
систему кондиціонування і підігріву повітря, тому що в теплий період року 
температура повітря становить 25-30°С, а в холодний 18-19°С. 
Кабінет відділу відноситься до класу приміщень без підвищеної безпеки 
ураження електричним струмом, оскільки відповідає вимогам ПУЕ–17, зокрема, 
– відносна вологість повітря 50-60%; 
– кабінет має неструмопровідні дерев'яні поли (паркет); 
– немає утворень пилу, що проводить струм; 
– неможливість одночасного дотику з однієї сторони до металевих   конструкцій 
будинку, що мають з'єднання з землею, і з іншої сторони до корпусів 
електроустаткування. 
Вся електрична підводка до столів, де розташовані комп’ютери,  захищена від 
механічних ушкоджень.  
Наявність шкідливих речовин у повітрі робочої зони регламентує  ДСТУ-Н Б 
А.3.2-1:2007. Оскільки при роботі з комп’ютером не відбувається утворення і 
виділення в повітря загально-токсичних, подразнюючих, канцерогенних і інших 
шкідливих речовин, концентрація яких перевищувала б установлені норми і правила, 
Лист 
БІ81.22.18008.248 ПЗ 63 
Змін. Лист № докум. Підпис Дата 
тому повітря робочої зони відповідає вимогам ДСТУ-Н Б А.3.2-1:2007 і вимогам до 
ГДК  шкідливих речовин і пилу. 
При роботі комп’ютера характерні підвищені теплоутворення, що підтверджує 
необхідність системи кондиціонування повітря.  
При роботі працівника з комп’ютером  характеристика зорової праці відповідає 
високій  точності, тобто найменший розмір об'єкта розрізнення понад 0,3 мм до 0,5 
мм, що відповідає 3 розряду зорової праці, підрозряд в; контраст розрізнення об'єкта 
з фоном - великий, фон світлий. 
Приміщення розташоване в південній частині будинку, на стінах яких поклеєні 
шпалери блідо-рожевого кольору із коефіцієнтом відбиття 40-60%, шпалери мають 
матову структуру. Приміщення відділу має бічне природне освітлення через три вікна. 
Розміри кожного вікна: ширина 1,5 м; висота 2,2 м. Нормований коефіцієнт 
природного освітлення для ІІІ розряду зорової праці для території України дорівнює 
1,5%. Площа світлових отворів забезпечує необхідний КПО, фактичне значення якого 
становить 25-30 %, що є достатнім рівнем, обумовленим ДБН В.2.5-28-2018. Для 
темного часу доби передбачене штучне освітлення. Приміщення обладнане чотирма 
світильниками моделі ЛПП 2х58, кожний з яких має по дві люмінесцентні лампи 
денного світла, потужністю 58 Вт кожна. Фактичне значення штучного загального 
освітлення складає 330-340 лк, а нормативне значення – 300 лк. Отже, рівень 
штучного освітлення відповідає ДБН В.2.5-28-2018. 
При роботі в умовах вібрацій продуктивність праці знижується, зростає 
кількість травм. Не завжди відповідають нормам рівні вібрацій на органах управління. 
Зазвичай у спектрі вібрації переважають низькочастотні вібрації негативно діють на 
організм. Деякі види вібрації несприятливо впливають на нервову і серцево-судинну 
системи, вестибулярний апарат. Найбільш шкідливий вплив на організм людини надає 
вібрація, частота якої збігається з частотою власних коливань окремих 
органів. Виробнича вібрація, що характеризується значною амплітудою і тривалістю 
дії, викликає у працюючих дратівливість, безсоння, головний біль, ниючий біль в 
Лист 
БІ81.22.18008.248 ПЗ 64 
Змін. Лист № докум. Підпис Дата 
руках людей, що мають справу з вібруючим інструментом. При тривалому впливі 
вібрації перебудовується кісткова тканина: на рентгенограмах можна помітити смуги, 
схожі на сліди перелому - ділянки найбільшої напруги, де розм'якшується кісткова 
тканина. Зростає проникність дрібних кровоносних судин, порушується нервова 
регуляція, змінюється чутливість шкіри. При роботі з ручним механізованим 
інструментом може виникнути акроасфіксія (симптом мертвих пальців) - втрата 
чутливості, побіління пальців, кистей рук. При дії загальної вібрації більш виражені 
зміни з боку центральної нервової системи: з'являються запаморочення, шум у вухах, 
погіршення пам'яті, порушення координації рухів, вестибулярні розлади, схуднення. 
Джерела вібрації в даному відділі відсутні, тому рівень вібрації  відповідає 
вимогам ДСН 3.3.6.039-99.  
Для захисту людей від шкідливого впливу шуму необхідна регламентація його 
інтенсивності, спектрального складу, часу дії та інших параметрів. При гігієнічному 
нормуванні в якості допустимого встановлюють такий рівень шуму, вплив якого 
протягом тривалого часу не викликає змін у всьому 
комплексі фізіологічних показників, що відображають реакції найбільш чутливих до 
шуму систем організму. Санітарні норми обов'язкові для всіх міністерств, відомств 
і організацій, які проектують, будують і експлуатують житло та 
громадські будівлі, що розробляють проекти планування і забудови міст, 
мікрорайонів, житлових будинків, кварталів, комунікацій і т.д., а також для 
організацій, які проектують, виготовляють і експлуатують транспортні засоби, 
технологічне та інженерне обладнання будівель і побутові прилади. Ці організації 
зобов'язані передбачати і здійснювати необхідні заходи щодо зниження шуму до 
рівнів, встановлених нормами. 
В даному приміщенні рівень шуму визначається в основному шумом від 
друкувального пристрою і не перевищує 52-54 дБА, що відповідає вимогам ДСН 
3.3.6.037-99. 
Лист 
БІ81.22.18008.248 ПЗ 65 
Змін. Лист № докум. Підпис Дата 
Робоче місце обладнане відповідно до  вимог ДСТУ 8604:2015 «Дизайн і 
ергономіка. Робоче місце для виконання робіт у положенні сидячи. Загальні 
ергономічні вимоги». У даному кабінеті робочі місця розташовані таким чином, щоб 
у поле зору не потрапляли вікна й освітлювальні прилади. Екран монітору  розміщені 
під кутом 90-105о до вікна, у поле зору не потрапляють поверхні з дзеркальним 
відбиттям. Співвідношення яскравості екрана з найближчими поверхнями не 
перевищує 5:1, покриття столу матове з коефіцієнтом відбиття 0,3-0,4. Монітор 
розміщений так, щоб відстань від очей користувача до екрана складала не менше 700 
мм, кут зору 30о. Руки користувача розташовуються на робочому столі в 
горизонтальному положенні, передбачена  опора для спини. 
Приміщення відділу відноситься до категорії В - пожежонебезпечних 
приміщень, тому що є наявність горючих речовин: дерев'яні столи і стільці, дерев'яна 
підлога, віконна рама; приміщення сухе з відносною вологістю 50-60% (ДСТУ Б В.1.1-
36:2016). В даному приміщенні система пожежної сигналізації відсутня, тому її 
необхідно розробити. 
Згідно ДБН В 1.1.7-2016, при  виникненні пожежі люди евакуюються з 
приміщення шляхом виходу в коридор другого поверху, що веде на сходову клітку, 
яка має вихід назовні через вестибюль. 
До самостійної роботи допускаються працівники, які пройшли попередній 
медичний огляд, вступний протипожежний інструктаж та протипожежний інструктаж 
на робочому місці. 
За результатами аналізу умов праці робітника відділу, можна зробити висновок, 
що всі параметри приміщення відділу відповідають вимогам нормативних документів 
для даного типу роботи. Відхиленням від встановлених вимог є відсутність системи 
пожежної сигналізації. Виходячи з цього рекомендується в кабінеті розробити 
систему пожежної сигналізації.  
 
Лист 
БІ81.22.18008.248 ПЗ 66 
Змін. Лист № докум. Підпис Дата 
4.2 Розробка системи пожежної сигналізації в приміщенні 
експериментального відділу 
Основна задача встановлення охоронно-пожежної сигналізації – це захист 
будівлі від небажаного проникнення та виникнення загорання. 
Встановлення охоронно-пожежної сигналізації необхідне для здачі будівлі в 
експлуатацію. При встановленні даних систем діє багато обмежень, зумовлених 
певними нормативними актами: наприклад, обмеження на моделі встановлюваних 
датчиків та обладнання. Також регламентується кількість встановлюваних датчиків та 
місця їх розташування у приміщенні. 
Інформація зі всіх розташованих датчиків надходить в єдиний диспетчерський 
пульт. Якщо спрацює один з них, на екрані диспетчера з’явиться детальний план 
приміщення з наданням точного місця датчика, що спрацював, а також його тип. Якщо 
місце спрацювання було встановлене під охорону, то автоматично пройде сигнал на 
пульт позавідомчої охорони. Залежно від того, який датчик спрацював, пожежний чи 
охоронний, вже співробітники позавідомчої охорони приймають рішення про виклик 
пожежної охорони або оперативної групи охорони. 
Охоронні та пожежні датчики мають кілька станів – «тривога», «охорона», 
«обрив лінії», «не під охороною». Для чіткої реалізації таких станів необхідно 
використовувати сучасне спеціалізоване обладнання – контролери охоронно-
пожежної сигналізації. Їх інтеграція з системою автоматизації дозволить вести 
постійний контроль з диспетчерського пульта будівлі, а також своєчасно отримувати 
дані про нештатні ситуації, і в деякій мірі, приймати рішення для їх ліквідації. 
Наприклад, у випадку спрацювання пожежної сигналізації, система автоматизації 
виключить вентиляцію, щоб потоком повітря не сприяти загоранню, відключить 
подачу електрики у вказану зону, автоматично включить систему оповіщення та 
сигналізації, проаналізувавши ситуацію, через систему оповіщення, повідомить про 
шляхи евакуації персоналу та включить автономну систему пожежогасіння. 
Лист 
БІ81.22.18008.248 ПЗ 67 
Змін. Лист № докум. Підпис Дата 
Якщо пожежа виникла, то її розвиток є нерівномірним. Спочатку інтенсивність 
горіння невелика, але потім вона зростає і наступає лавиноподібний процес. Тому, чим 
раніше виявлена пожежа, тим менше збитки від неї. 
Протипожежний захист будинків, споруд, людей, які в них перебувають зокрема 
досягається застосуванням установок автоматичної пожежної сигналізації. 
Відповідно до ДБН В.2.5-56-2014 під «установкою пожежної сигналізації» 
розуміється сукупність технічних засобів, установлених на об'єкті, що захищається, 
для виявлення пожежі, оброблення, подавання в заданому вигляді повідомлення про 
пожежу на цьому об'єкті, спеціальної інформації та (чи) подавання команд на 
включення автоматичних установок пожежогасіння та технічних обладнань. 
При визначенні об'єктів, які підлягають обладнанню установками автоматичної 
пожежної сигналізації необхідно керуватися в першу чергу Переліком однотипних за 
призначенням об'єктів, які підлягають обладнанню автоматичними установками 
пожежогасіння та пожежної сигналізації. 
Цей перелік узагальнює вимоги щодо оснащення пожежною автоматикою 
будівель, споруд та приміщень, які найбільш поширені в різних галузях господарства 
незалежно від виду їх діяльності та форм власності. 
Система пожежної сигналізації складається з пожежних сповіщувачів 
(пристроїв для формування сигналу про пожежу), які включені у сигнальну лінію 
(шлейф), приймально-контрольного приладу, ліній зв'язку. 
Пожежні сповіщувачі перетворюють прояви пожежі (тепло, світло полум'я, 
дим) в електричний сигнал, який по лініях зв'язку надходить до контрольно-
приймального приладу. Контрольно-приймальний прилад здійснює приймання 
інформації від пожежних сповіщувачів, виробляє сигнал про виникнення пожежі чи 
несправності, передає цей сигнал та видає команди на інші пристрої (наприклад, 
включає автоматичні установки  пожежогасіння чи димовидалення). 
В залежності від проявів процесу горіння сповіщувачі можуть бути: 
Лист 
БІ81.22.18008.248 ПЗ 68 
Змін. Лист № докум. Підпис Дата 
- теплові, які реагують на певне значення температури та (чи) швидкість її 
наростання (рис. 4.1); 
 
Рисунок 4.1 – Тепловий пожежний сповіщувач ТПТ-2 
 
- димові, які реагують на аерозольні продукти горіння (рис. 4.2); 
 
Рисунок 4.2 – Димовий пожежний сповіщувач  ИПД-3.1 
 
- світлові, які реагують на електромагнітне випромінювання полум'я (рис. 4.3). 
 
Рисунок 4.3 – Світловий пожежний сповіщувач Астра-10 М 
Лист 
БІ81.22.18008.248 ПЗ 69 
Змін. Лист № докум. Підпис Дата 
- комбіновані сповіщувачі (рис.4.4) – сповіщувачі, які аналізують одночасно 
кілька різних явищ. 
 
Рисунок 4.4 – Сповіщувач пожежний комбінований ИП 212/101-78-А1 
 
Серед багатого різноманіття сучасних сповіщувачів пропонується використати 
сучасний пожежний сповіщувач Satel TSD-1 (рис. 4.5).  
TSD-1 - точковий сповіщувач призначений для виявлення ранньої стадії пожежі. 
Для цього, сповіщувач обладнаний фотоелектричним сенсором видимого диму і 
максимально-диференціальним температурним сенсором. Унікальна конструкція 
оптичної камери забезпечує високу чутливість, а прецизійний фільтр з нержавіючої 
сталі захищає камеру від проникнення бруду або комах. Налаштування сповіщувача 
за допомогою DIP-перемикачів і вбудовані кінцеві резистори спрощують його 
підключення до будь-якого ПКП з живленням 12 В. 
 
Рисунок 4.5 - Сповіщувач пожежний комбінований Satel TSD-1 
Лист 
БІ81.22.18008.248 ПЗ 70 
Змін. Лист № докум. Підпис Дата 
 
Технічні характеристики сповіщувача Satel TSD-1: 
- Габаритні розміри корпусу - 108 x 61 мм; 
- Діапазон робочих температур - -10 ... + 55 °C; 
- Споживання струму в режимі готовності - 0,25 мА; 
- Максимальне споживання струму - 24 мА; 
- Вага - 164 г; 
- Максимальна вологість повітря - 93 ± 3%; 
- Мінімальна порогова температура виклику тривоги - 54 °C; 
- Максимальна порогова температура виклику тривоги - 65 °C. 
Сигнали від приймально-контрольних приладів установок пожежогасіння та 
пожежної сигналізації виводять, за наявності технічної можливості, на пульти 
централізованого спостереження пожежної охорони. 
В якості охоронно-пожежного пульту контролю й керування в приміщенні 
експериментального відділу пропонується використати  пульт ТИРАС-2П (Рис. 4.6). 
 
Рисунок 4.6 –  Пульт контрольно-охоронно-пожежний ТИРАС-2П 
 
Технічні характеристики пульта «Тирас-2П»:  
–  габаритні  розміри приладу - 205х260х 75 мм; 
– маса (без акумулятора) - не більше 1.8 кг; 
– середнє напрацювання на відмову приладу - не менше 40 000 годин; 
Лист 
БІ81.22.18008.248 ПЗ 71 
Змін. Лист № докум. Підпис Дата 
–  середній термін служби - не менше 10 років; 
– електроживлення приладу здійснюється від мережі змінного струму напругою 
220 В, частотою 50 ± 1 Гц; 
– потужність, споживана від мережі змінного струму у всіх режимах, не більше 
15 Вт; 
– резервне електроживлення приладу здійснюється від джерела постійного 
струму (акумулятора) напругою 12 В, ємністю 2,3 А • год; 
– вихідна напруга ОЕП, В: 
– живлення від мережі - 13,5-13,9 В; 
– живлення від акумуляторної батареї - 9,5-13,8 В. 
– рівень пульсацій вихідної напруги - не більше 50 мВ; 
– максимальний тривалий вихідний струм навантаження (всі виходи і додаткові 
модулі) - не більше 210 мА; 
– максимальний короткочасний вихідний струм навантаження - не більше 330 
мА; 
– струм споживання від акумуляторної батареї у всіх режимах роботи  - не 
більше 120 мА; 
– прилад забезпечує автоматичний перехід на живлення від акумулятора у разі 
зникнення напруги мережі змінного струму, і зворотний перехід у разі відновлення 
мережі змінного струму, без помилкових сповіщень; 
– прилад має автоматичний зарядний пристрій. Час відновлення 80% ємності 
акумуляторної батареї не більше 24 годин, 100% ємності - не більше 72 годин; 
– всі клеми приладу, включаючи акумуляторні, мають захист від короткого 
замикання і перевантаження по струму; 
– відключення приладу від електроживлення здійснюється штепсельною 
вилкою або вимикачем стаціонарної проводки і зняттям клем з акумуляторної батареї. 
Лист 
БІ81.22.18008.248 ПЗ 72 
Змін. Лист № докум. Підпис Дата 
Умови експлуатації пристрою - призначений для безперервної цілодобової 
роботи в приміщеннях з кліматичними умовами. Діапазон робочих температур від 
мінус 50 до плюс 400 °С. 
Заходи безпеки при експлуатації пристрою: 
- під час встановлення та експлуатації приладу обслуговуючому персоналу 
необхідно керуватися «Правилами технічного експлуатування електроустановок 
споживачів» і «Правилами техніки безпеки при експлуатуванні електроустановок 
споживачів». 
- встановлення, зняття та ремонт приладу необхідно виконувати за умови 
відключеного напруги живлення. Роботи з установки, зняття та ремонту приладу 
повинні проводитися працівниками, які мають кваліфікаційну групу з техніки безпеки 
не нижче IV. Під час виконання робіт необхідно дотримуватися правил пожежної 
безпеки. 
Підключення входів і виходів: 
- сповіщувачі, які підключаються паралельно кінцевому резистору зони, 
повинні бути підключені через струмообмежуючі резистори ��д, опір яких буде 
залежати від типу сповіщувача. Опір додаткового резистора можна обчислити за 
формулою: 
Rд = 1 кОм – Rспов. 
де: Rспов. – внутрішній опір сповіщувача. 
Для двопровідних активних сповіщувачі,  Rспов зазвичай знаходиться в діапазоні 
(0,4 - 0,5) кОм. Вибір опору резистора Rд варто здійснювати зі стандартного ряду 
номіналів резисторів, найближчого меншого значення за Rспов. Деякі значення ряду 
Е12, Ом: 270, 330, 390, 470, 560, 680, 820. 
Оскільки Rспов. = 0,4 кОм, тому Rд = 1 кОм – 0,4 кОм = 0,6 кОм.. 
Із ряда Е12 вибираємо резистор з опором 560 Ом. 
Лист 
БІ81.22.18008.248 ПЗ 73 
Змін. Лист № докум. Підпис Дата 
Зони, які не використовуються, необхідно шунтувати резистором номіналом 1,5 
кОм (між клемою "0В" та клемою зони). В одній зоні не може бути встановлено 
більше 32 сповіщувачів. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 74 
Змін. Лист № докум. Підпис Дата 
ВИСНОВОК 
 
 Підсумовуючи вищеописане можна сказати, що у ході виконання дипломної 
роботи було проведено вирішення задач прикладного характеру на основі набутих в 
університеті та особисто здобутих знань, професійних умінь. Було проаналізовано 
вимоги до системи, програмного та апаратно-технічного забезпечення. 
 Провівши дослідження теорії побудови бота у Telegram було обрано мову 
програмування Python та наступні бібліотеки: OS, яка звертається до операційної 
системи; asyncio — бібліотека для написання паралельного коду за допомогою 
синтаксису async/await; aiogram — досить простий і повністю асинхронний 
фреймворк для Telegram Bot API, написаний на Python 3.7 з asyncio і aiohttp; модуль 
urllib.request, який визначає функції та класи, які допомагають відкривати URL-адреси 
(в основному HTTP); модуль, що надає клас ConfigParser, який реалізує базову мову 
конфігурації і надає структуру, аналогічну Microsoft Windows INI файлів; модуль 
dataclass; модуль FSM - Finite State Machine. 
Результатом дипломного проекту є цілком робоча стеганографічна система 
прихованої передачі звукових даних при використанні звичайного мессенджера 
Telegram та вбудованої у нього функції створення особистого Telegram-Бота, який 
було використано для вбудовування алгоритму зашифровування інформації. 
 
 
 
 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 75 
Змін. Лист № докум. Підпис Дата 
СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ 
 
1. Petitcolas, FAP; Anderson RJ; Kuhn MG (1999). "Information Hiding: A survey" 
[Електронний ресурс] Режим доступу: 
https://www.petitcolas.net/fabien/publications/ieee99-infohiding.pdf 
2. B.r., Roshan Shetty; J., Rohith; V., Mukund; Honwade, Rohan; Rangaswamy, Shanta 
(2009). "Steganography Using Sudoku Puzzle". [Електронний ресурс] Режим 
доступу: https://ieeexplore.ieee.org/document/5329073 
3. Giannoula, A.; Hatzinakos, D. (2003). "Compressive data hiding for video signals" 
[Електронний ресурс] Режим доступу: 
https://ieeexplore.ieee.org/document/1247015 
4. United States Department of Justice. [Електронний ресурс] Режим доступу: 
https://www.justice.gov/sites/default/files/opa/legacy/2010/06/28/062810complaint2
.pdf 
5. Abdul Hameed Bakier. Дата звернення: 18 лютого 2012 року. [Електронний 
ресурс] Режим доступу: https://jamestown.org/program/the-new-issue-of-technical-
mujahid-a-training-manual-for-jihadis/ 
6. Audio Steganography Used for Secure Data Transmission Pooja P. Balgurgi 
7. WAV [Електронний ресурс] Режим доступу:  https://uk.wikipedia.org/wiki/WAV 
8. Directshow Filters for Ogg Vorbis, Speex, Theora, FLAC, and WebM [Електронний 
ресурс] Режим доступу:  https://xiph.org/dshow/ 
9.  and Sonal K. Jagtap [Електронний ресурс] Режим доступу:  
https://link.springer.com/chapter/10.1007/978-81-322-0740-5_83 
 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 76 
Змін. Лист № докум. Підпис Дата 
ДОДАТКИ 
 
Додаток А (Лістинги файлів) 
Лістинг файлу bot.py 
import asyncio 
 
from aiogram import Bot, Dispatcher 
from aiogram.types import BotCommand 
from aiogram.contrib.fsm_storage.memory import MemoryStorage 
 
from app.config_reader import load_config 
from app.handlers.encryption import register_handlers_encryption 
from app.handlers.decryption import register_handlers_decryption 
from app.handlers.common import register_handlers_common 
 
 
async def set_commands(bot: Bot): 
    commands = [ 
        BotCommand(command="/encrypt", description="Зашифрувати"), 
        BotCommand(command="/decrypt", description="Розшифрувати"), 
        BotCommand(command="/cancel", description="Відміна поточної дії"), 
        BotCommand(command="/about", description="Інформація") 
    ] 
    await bot.set_my_commands(commands) 
 
 
async def main(): 
    config = load_config("config/bot.ini") 
    bot = Bot(token=config.tg_bot.token) 
    dp = Dispatcher(bot, storage=MemoryStorage()) 
    register_handlers_common(dp) 
    register_handlers_encryption(dp) 
    register_handlers_decryption(dp) 
    await set_commands(bot) 
    await dp.start_polling() 
 
 
if __name__ == '__main__': 
    asyncio.run(main()) 
 
Лістинг файлу bot.ini 
[tg_bot] 
token =   
admin_id =  
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 77 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу common.py 
from aiogram import Dispatcher, types 
from aiogram.dispatcher import FSMContext 
 
async def cmd_start(message: types.Message, state: FSMContext): 
    await state.finish() 
    await message.answer( 
        "Привіт, мене звати StegaSoundBot і я можу зашифрувати ваше повідомлення у 
звук." 
        "\nОберіть потрібну вам функцію:" 
        "\nЗашифрування (/encrypt) або розшифрування (/decrypt).", 
        reply_markup=types.ReplyKeyboardRemove() 
    ) 
 
 
async def cmd_cancel(message: types.Message, state: FSMContext): 
    await state.finish() 
    await message.answer("Дію відмінено!", reply_markup=types.ReplyKeyboardRemove()) 
 
 
async def cmd_about(message: types.Message, state: FSMContext): 
    await state.finish() 
    await message.answer('❗ІНФОРМАЦІЯ❗' 
                         '\n\nКрок 1: Введення тексту!' 
                        '\n\nКрок 2: Ступінь шифрування!' 
                        '\nОберіть ступінь шифрування (1/2/4/8/16), від цього буде 
залежати, яку' 
                        ' кількість біт у аудіозаписі ви зміните.' 
                        '\nПорада: оберіть найменший ступінь, щоб ваш аудіозапис 
виглядав якомога непомітнішим.' 
                        ' Якщо оберете ступінь шифрування - 16, то у аудіозаписі ви 
зможете почути' 
                        ' непотрібні шуми.' 
                        '\n\nКрок 3: .WAV файли!' 
                        '\nЗазвичай файл формату .wav має 16 бітний вигляд, але є 
випадки' 
                        ' при яких файл також може зберігатися у 24 та 32 бітному 
вигляді, ' 
                        'якщо це так, то зашифрувати повідомлення у файл буде 
неможливо.' 
                        '\n\n❗ВАЖЛИВО❗' 
                        '\n\nЯкщо бот не відповідає вам після того як ви надіслали 
йому файл .wav, то вам слід ' 
                        'перевірити чи дійсно ви надіслали файл з потрібним форматом' 
                        '\nЯкщо файл дійсно .wav, то зачекайте деякий час, поки бот 
завантажує його на сервер ��', 
                         reply_markup=types.ReplyKeyboardRemove()) 
 
 
def register_handlers_common(dp: Dispatcher): 
    dp.register_message_handler(cmd_start, commands="start", state="*") 
    dp.register_message_handler(cmd_cancel, commands="cancel", state="*") 
    dp.register_message_handler(cmd_about, commands="about", state="*") 
 
 
Лист 
БІ81.22.18008.248 ПЗ 78 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу mask.py 
def create_mask(degree):  
    text_mask = 0b1111111111111111 
    sample_mask = 0b1111111111111111 
 
    text_mask <<= (16 - degree) 
    text_mask %= 65536 
 
    sample_mask >>= degree 
    sample_mask <<= degree 
 
    return text_mask, sample_mask 
 
Лістинг файлу encryption.py 
import urllib 
import os 
from urllib import request 
from aiogram import Dispatcher, types 
 
from app.handlers.mask import create_mask 
 
from aiogram.dispatcher import FSMContext 
from aiogram.dispatcher.filters.state import State, StatesGroup 
 
from app.config_reader import load_config 
from aiogram import Bot 
 
config = load_config("config/bot.ini") 
bot = Bot(token=config.tg_bot.token, parse_mode="HTML") 
 
coding_variants = ["1", "2", "4", "8", "16"] 
insert_text = () 
insert_wav = () 
 
 
class Encrypt(StatesGroup): 
    waiting_for_coding_variant = State() 
    waiting_for_insert_text = State() 
    waiting_for_insert_wav = State() 
    waiting_for_choise = State() 
 
 
async def enc_start(message: types.Message): 
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) 
    for name in coding_variants: 
        keyboard.add(name) 
    await message.answer("�� Оберіть ступінь зашифрування:", reply_markup=keyboard) 
    await Encrypt.waiting_for_coding_variant.set() 
 
 
async def coding_variant_chosen(message: types.Message, state: FSMContext): 
    if message.text.lower() not in coding_variants: 
        await message.answer("Будь ласка, оберіть ступінь, використовуючи клавіатуру  
 
Лист 
БІ81.22.18008.248 ПЗ 79 
Змін. Лист № докум. Підпис Дата 
 
Лістинг файлу encryption.py (продовження) 
нижче.") 
        return 
    await state.update_data(chosen_variant=message.text.lower()) 
 
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) 
    for size in insert_text: 
        keyboard.add(size) 
    await Encrypt.next() 
    await message.answer("�� Теперь введіть текст:", 
reply_markup=types.ReplyKeyboardRemove()) 
 
 
async def text_chosen(message: types.Message, state: FSMContext): 
    await state.update_data(chosen_text=message.text.format()) 
    await Encrypt.next() 
    await message.answer("�� Теперь відішліть мені свій .wav:") 
 
 
async def wav_chosen(message: types.Message, state: FSMContext): 
    config = load_config("config/bot.ini") 
    # ------------Прийом документів---------------- 
 
    document_id = message.document.file_id 
    file_info = await bot.get_file(document_id) 
    fi = file_info.file_path 
    name = message.document.file_name 
    urllib.request.urlretrieve( 
        f'https://api.telegram.org/file/bot{config.tg_bot.token}/{fi}', f'./{name}') 
 
    await bot.send_message(message.from_user.id, 'Файл успішно збережено ��') 
 
    await state.update_data(chosen_wav=name) 
 
    user_data = await state.get_data() 
    await message.answer(f"�� Ви хочете закодувати цей текст: 
{user_data['chosen_text']} " 
                         f"\n\n�� Наступним ступенем кодування: 
{user_data['chosen_variant']}" 
                         f"\n\n�� Використовуючи цей файл: 
{user_data['chosen_wav']}?") 
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) 
    for name in ["Так", "Ні"]: 
        keyboard.add(name) 
    await message.answer("Згодні?", reply_markup=keyboard) 
    await Encrypt.next() 
 
 
async def yes_or_no(message: types.Message, state: FSMContext): 
    if message.text == "Так": 
        await message.answer("Переходимо до шифрування", 
reply_markup=types.ReplyKeyboardRemove()) 
 
        user_data = await state.get_data() 
        # -------------Обраний ступінь-------------- 
Лист 
БІ81.22.18008.248 ПЗ 80 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу encryption.py (продовження) 
        degree = int(user_data['chosen_variant']) 
 
        await message.answer(f"\nВикористовуємо {degree}-ий ступінь кодування..." 
                             f"\nЯкщо бот нічого вам не відсилає, перевірте 
правильність ступеню кодування") 
 
        # -------------Обраний WAV-------------- 
        name_file = str(user_data['chosen_wav']) 
        src_file = open(name_file, 'rb')  
 
        await message.answer(f"\nВикористовуємо {name_file} для вшиття тексту...") 
 
        lenght = len(name_file) 
        remove_wav = name_file[:lenght-4] 
        dst_file = open(remove_wav + ' (' + str(degree) + " degree)" + ".wav", 'wb') 
 
        # дізнаємося розмір файлу, записуємо його 
        text_len = os.stat('source_text.txt').st_size 
 
        # перші байти файлу у яких знаходиться інформація про файл 
        wav_info = src_file.read(44) 
 
        data_len = int.from_bytes(wav_info[40:44], byteorder='little') 
 
        if text_len > data_len * degree / 16: 
            await message.answer('Занадто велике повідомлення для шифрування') 
            src_file.close() 
            return False 
 
        # ----------------------Обраний текст-------------- 
        os.system(r'nul>source_text.txt') 
 
        dest_file = r"source_text.txt" 
 
        with open(dest_file, 'a') as f: 
            f.write(user_data['chosen_text']) 
 
        await message.answer(f"\nВшиваємо текст...") 
        text = open('source_text.txt', 'r') 
 
        # Копіюємо інформацію з оригінального файлу у контейнер 
        dst_file.write(wav_info) 
 
        # Зчитуємо кілкість інформації 
        data = src_file.read(data_len) 
 
        # Створюємо дві маски: текстову і для звукового семплу 
        text_mask, sample_mask = create_mask(degree) 
 
        while True: 
            # Зчитуємо перший символ тексту 
            txt_symbol = text.read(1) 
            if not txt_symbol: 
                break 
 
            # Показує символ і його двійкове представлення 
 
Лист 
БІ81.22.18008.248 ПЗ 81 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу encryption.py (продовження) 
            print("Символ {0}, у бінарному значенні {1:b}".format(txt_symbol, 
ord(txt_symbol))) 
            # ord - перетворює символ char в int ASCII 
            txt_symbol = ord(txt_symbol) 
            # Зміщуємо символ на 8 біт вліво, аби він став на першу позицію 
            txt_symbol <<= 8 
 
            # Якщо степінь кодування 16 
            if degree == 16: 
                another_symbol = text.read(1) 
                # Якщо другий символ є останнім у тексті і не значить ніякої 
інформації, 
                # то ми беремо і заповнюємо його незначущими нулями 
                if not another_symbol: 
                    another_symbol = 0b0 
                # Інакше ми перетворюємо символ char в int ASCII 
                else: 
                    print("Символ {0}, у бінарному значенні 
{1:b}".format(another_symbol, ord(another_symbol))) 
                    another_symbol = ord(another_symbol) 
 
                txt_symbol |= another_symbol 
            for step in range(0, 16, degree): 
                # Якщо ми пройшли перший байт і якщо txt_symbol це нулі, то виходимо 
з циклу 
                if step == 8 and not txt_symbol: 
                    break 
 
                # Зчитуємо семпл і перетворюємо його в int 
                sample = int.from_bytes(data[:2], byteorder='little') & sample_mask 
                # Робимо зріз ,щоб змістити data на два символи вправо 
                data = data[2:] 
                # Отримуємо біти які потрібно зашифрувати у семплі 
                bits = txt_symbol & text_mask 
                # Зміщуємо символ вправо аби вони з'явилися на останніх позиціях 
                bits >>= (16 - degree) 
 
                # Записуємо біти у наш семпл за допомогою логічного додавання 
                sample |= bits 
 
                # Записуємо два байти, які у нас вийшли у попередніх кроках, у 
контейнер 
                # І знову робимо перетворення з int у байти 
                dst_file.write(sample.to_bytes(2, byteorder='little')) 
                txt_symbol = (txt_symbol << degree) % 65536 
 
        # Наприкінці циклу ми записуємо опис особистої інформації файлу: виконавець, 
рік, жанр та інше 
        dst_file.write(data) 
        dst_file.write(src_file.read()) 
 
        src_file.close() 
        dst_file.close() 
 
        await message.answer_document(open(remove_wav + ' (' + str(degree) + " 
degree)" + ".wav", 'rb')) 
         
Лист 
БІ81.22.18008.248 ПЗ 82 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу encryption.py (продовження) 
await message.answer('Файл успішно зашифрований!') 
 
    elif message.text == "Ні": 
        await state.finish() 
        await message.answer("Дію відмінено!", 
reply_markup=types.ReplyKeyboardRemove()) 
 
    else: 
        await message.answer("Будь ласка, оберіть відповідь, використовуючи 
клавіатуру нижче.") 
        return 
    await state.finish() 
 
 
def register_handlers_encryption(dp: Dispatcher): 
    dp.register_message_handler(enc_start, commands="encrypt", state="*") 
    dp.register_message_handler(coding_variant_chosen, 
state=Encrypt.waiting_for_coding_variant) 
    dp.register_message_handler(text_chosen, state=Encrypt.waiting_for_insert_text) 
    dp.register_message_handler(wav_chosen, content_types=['document'], 
state=Encrypt.waiting_for_insert_wav) 
    dp.register_message_handler(yes_or_no, state=Encrypt.waiting_for_choise) 
 
Лістинг файлу decryption.py 
import urllib 
import os 
from urllib import request 
from aiogram import Dispatcher, types 
 
from app.handlers.mask import create_mask 
 
from aiogram.dispatcher import FSMContext 
from aiogram.dispatcher.filters.state import State, StatesGroup 
 
from app.config_reader import load_config 
from aiogram import Bot 
 
config = load_config("config/bot.ini") 
bot = Bot(token=config.tg_bot.token, parse_mode="HTML") 
 
coding_variants = ["1", "2", "4", "8", "16"] 
insert_text = () 
insert_wav = () 
 
 
class Decrypt(StatesGroup): 
    waiting_for_coding_variant = State() 
    waiting_for_insert_wav = State() 
    waiting_for_choise = State() 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 83 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу decryption.py (продовження) 
async def dec_start(message: types.Message): 
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) 
    for name in coding_variants: 
        keyboard.add(name) 
    await message.answer("�� Оберіть ступінь зашифрування:", reply_markup=keyboard) 
 
    await Decrypt.waiting_for_coding_variant.set() 
 
 
async def coding_variant_chosen(message: types.Message, state: FSMContext): 
    if message.text.lower() not in coding_variants: 
        await message.answer("Будь ласка, оберіть ступінь, використовуючи клавіатуру 
нижче.") 
        return 
    await state.update_data(chosen_variant=message.text.lower()) 
 
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) 
    for size in insert_text: 
        keyboard.add(size) 
    await Decrypt.next() 
    await message.answer("�� Теперь відішліть мені свій .wav:", 
reply_markup=types.ReplyKeyboardRemove()) 
 
 
async def wav_chosen(message: types.Message, state: FSMContext): 
    config = load_config("config/bot.ini") 
    # ------------Прийом документів---------------- 
 
    document_id = message.document.file_id 
    file_info = await bot.get_file(document_id) 
    fi = file_info.file_path 
    name = message.document.file_name 
    urllib.request.urlretrieve( 
        f'https://api.telegram.org/file/bot{config.tg_bot.token}/{fi}', f'./{name}') 
    await bot.send_message(message.from_user.id, 'Файл успішно збережено ��') 
 
    await state.update_data(chosen_wav=name) 
 
    user_data = await state.get_data() 
    await message.answer(f"�� Ви хочете розшифрувати: {user_data['chosen_wav']}" 
                         f"\n�� Наступним ступенем кодування: 
{user_data['chosen_variant']}") 
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True) 
    for name in ["Так", "Ні"]: 
        keyboard.add(name) 
    await message.answer("Згодні?", reply_markup=keyboard) 
    await Decrypt.next() 
 
 
async def yes_or_no(message: types.Message, state: FSMContext): 
    if message.text == "Так": 
        await message.answer("Переходимо до розшифрування", 
reply_markup=types.ReplyKeyboardRemove()) 
 
        user_data = await state.get_data() 
 
Лист 
БІ81.22.18008.248 ПЗ 84 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу decryption.py (продовження) 
        # -------------Обраний ступінь-------------- 
        degree = int(user_data['chosen_variant']) 
        await message.answer(f"\nВикористовуємо {degree}-ий ступінь кодування...") 
        name_file = str(user_data['chosen_wav']) 
        wav_file = open(name_file, 'rb') 
        wav_info = wav_file.read(44) 
 
        data_len = int.from_bytes(wav_info[40:44], byteorder='little') 
 
        to_read = os.stat('source_text.txt').st_size 
 
        if to_read >= data_len * degree / 16: 
            print('Надто багато символів, щоб прочитати ��') 
            wav_file.close() 
            return 
 
        text = open('decrypted_text.txt', 'w') 
 
        text_mask, sample_mask = create_mask(degree) 
        # Інвертуємо нулі на одиниці, а одиниці на нулі 
        sample_mask = ~sample_mask 
 
        data = wav_file.read(data_len) 
 
        read = 0 
        while read < to_read: 
            two_symbols = 0 
            for step in range(0, 16, degree): 
                sample = int.from_bytes(data[:2], byteorder='little') & sample_mask 
                data = data[2:] 
 
                two_symbols <<= degree 
                two_symbols |= sample 
 
            first_symbol = two_symbols >> 8 
 
            text.write(chr(first_symbol)) 
            read += 1 
 
            if to_read - read > 0: 
                second_symbol = two_symbols & 0b0000000011111111 
                print("Другий символ - '{1:c}'={1:b}".format(read + 1, 
second_symbol), end='\n') 
                text.write(chr(second_symbol)) 
                read += 1 
 
        text.close() 
        wav_file.close() 
 
        text.close() 
        wav_file.close() 
 
        reading = open('source_text.txt') 
 
 
Лист 
БІ81.22.18008.248 ПЗ 85 
Змін. Лист № докум. Підпис Дата 
Лістинг файлу decryption.py (продовження) 
     
        await message.answer(reading.read()) 
 
     elif message.text == "Ні": 
     
 await state.finish() 
        await message.answer("Дію відмінено!", 
reply_markup=types.ReplyKeyboardRemove()) 
 
    else: 
        await message.answer("Будь ласка, оберіть відповідь, використовуючи 
клавіатуру нижче!") 
        return 
 
    await state.finish() 
 
 
def register_handlers_decryption(dp: Dispatcher): 
    dp.register_message_handler(dec_start, commands="decrypt", state="*") 
    dp.register_message_handler(coding_variant_chosen, 
state=Decrypt.waiting_for_coding_variant) 
    dp.register_message_handler(wav_chosen, content_types=['document'], 
state=Decrypt.waiting_for_insert_wav) 
    dp.register_message_handler(yes_or_no, state=Decrypt.waiting_for_choise) 
 
Лістинг файлу config_reader.py 
import configparser 
from dataclasses import dataclass 
 
 
@dataclass 
class TgBot: 
    token: str 
    admin_id: int 
 
 
@dataclass 
class Config: 
    tg_bot: TgBot 
 
 
def load_config(path: str): 
    config = configparser.ConfigParser() 
    config.read(path) 
 
    tg_bot = config["tg_bot"] 
 
    return Config( 
        tg_bot=TgBot( 
            token=tg_bot["token"], 
            admin_id=int(tg_bot["admin_id"]) 
        ) 
    ) 
 
 
Лист 
БІ81.22.18008.248 ПЗ 86 
Змін. Лист № докум. Підпис Дата 
Додаток Б (Ілюстративний матеріал) 
 
 
 Лист 
БІ81.22.18008.248 ПЗ 87 
Змін. Лист № докум. Підпис Дата 
 
 
 
 
Лист 
БІ81.22.18008.248 ПЗ 88 
Змін. Лист № докум. Підпис Дата 
 
 
 
 Лист 
БІ81.22.18008.248 ПЗ 89 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 90 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 91 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 92 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 93 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 94 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 95 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 96 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 97 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 98 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 99 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 100 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 101 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 102 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 103 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 104 
Змін. Лист № докум. Підпис Дата 
 
 Лист 
БІ81.22.18008.248 ПЗ 105 
Змін. Лист № докум. Підпис Дата 
 
 
Лист 
БІ81.22.18008.248 ПЗ 106 
Змін. Лист № докум. Підпис Дата 
 
Лист 
БІ81.22.18008.248 ПЗ 107 
Змін. Лист № докум. Підпис Дата