diff --git a/lab_1/README.md b/lab_1/README.md deleted file mode 100644 index 771b789c..00000000 --- a/lab_1/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Основы информационной безопасности - -## Лабораторная №1 "Простейшие методы шифрований текстовых сообщений" - -В лабораторной работе изучается метод кодирования текста шифром простой подстановки и декодирования при помощи частотного анализа -текстовой последовательности. - -### Задание на лабораторную работу: -1. Закодировать любой связный текст (не менее 500 символов), любым произвольным шифром простой подстановки (моноалфавитная замена) или перестановки. -2. Расшифровать текст из методички, закодированный шифром простой подстановки (моноалфавитная замена) в соответсвии со своим вариантом. - -### Варианты заданий -Каждый студент выполняет задание индивидуально. -Номер варианта соответсвует позиции ФИО студента в списке группы. - -### Результаты выполнения лабораторной работы: -Итоговый репозиторий с результатами выполненной лабораторной работы должен содержать: -- исходные коды для выполнения обоих заданий лабораторной работы (подразумевается python), -- исходный шифруемый текст для задания 1, -- результат шифрования текста для задания 1, -- ключ шифрования текста для задания 1, -- исходный зашифрованный текст для задания 2 согласно варианту, -- результат дешифровки текста для задания 2, -- найденный ключ шифрования текста для задания 2. - -Подразумевается, что ключ шифрования для задания 1 доступен для редактирования пользователям вашего софта. -Поощряется применение практик построения приложения, полученных в предыдущем семестре в рамках курса "Прикладное программирование". - -Варианты заданий и теоретическая информация приведены в [методичке](https://github.com/itsecd/isb/blob/main/docs/ISB_Lab1.pdf). diff --git a/lab_2/README.md b/lab_2/README.md deleted file mode 100644 index f29c3325..00000000 --- a/lab_2/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Основы информационной безопасности - -## Лабораторная №2 "Статистический анализ псевдослучайных последовательностей" - -В лабораторной работе изучается метод генерации случайных зна-чений и проверки сгенерированных последовательностей на случайность на основе тестов NIST. -Цель работы – обучение общим принципам статисти-ческого анализа на примере генераторов случайных чисел и их применение в ИБ. - -### Задание на лабораторную работу: -1. Сгенерировать псевдослучайные последовательности с помощью стандартных ГПСЧ языков С/С++ и Java. -2. Написать программу на любом языке программирования, реализующую представленные три теста линейки NIST и проверить с их помощью сгенерированные последовательности: -2.1. Частотный побитовый тест. -2.2. Тест на одинаковые подряд идущие биты. -2.3. Тест на самую длинную последовательность единиц в блоке. -3. Сделать вывод по полученным результатам и написать отчет по выполненной работе. - -### Результаты выполнения лабораторной работы: -Итоговый репозиторий с результатами выполненной лабораторной работы должен содержать: -* Результат выполнения первой части задания: - - Сгенерированная случайная последовательность; - - Программный код генерации; -* Результат выполнения второй части задания: - - Программные коды тестов; - - Рассчитанные результаты тестов и полученные значения; -* Выводы по результатам тестирования. - -Теоретическая информация приведена в [методичке](https://github.com/itsecd/isb/blob/main/docs/ISB_Lab2.pdf). diff --git a/lab_3/asymmetric.py b/lab_3/asymmetric.py new file mode 100644 index 00000000..9e1871c7 --- /dev/null +++ b/lab_3/asymmetric.py @@ -0,0 +1,51 @@ +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import padding, rsa + + +class Asymmetric: + """ + Класс для реализации алгоритма асимметричного шифрования + """ + + @staticmethod + def generate_keys() -> tuple: + """ + генерация приватного и публичного ключа + :return: tuple - кортеж из приватного и публичного ключей + """ + private_key = rsa.generate_private_key( + public_exponent=65537, + key_size=2048 + ) + return private_key, private_key.public_key() + + @staticmethod + def encrypt_bytes(original_bytes: bytes, public_key) -> bytes: + """ + шифрование байтов данных через публичный ключ + :param original_bytes: исходные данные в байтах + :param public_key: публичный ключ + :return: зашифрованные байты + """ + return public_key.encrypt(original_bytes, + padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), + algorithm=hashes.SHA256(), + label=None + ) + ) + + @staticmethod + def decrypt(encrypt_text: bytes, private_key) -> bytes: + """ + дешифрование байтов данных через приватный ключ + :param encrypt_text: зашифрованные данные в байтах + :param private_key: приватный ключ + :return: расшифрованные байты + """ + dc_text = private_key.decrypt(encrypt_text, + padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), + algorithm=hashes.SHA256(), + label=None + ) + ) + return dc_text diff --git a/lab_3/config.py b/lab_3/config.py new file mode 100644 index 00000000..2d75ff46 --- /dev/null +++ b/lab_3/config.py @@ -0,0 +1,17 @@ +import json + +try: + with open("settings.json", 'r', encoding='utf-8') as js: + config = json.load(js) + + INITIAL_FILE = config["initial_file"] + ENCRYPTED_FILE = config["encrypted_file"] + DECRYPTED_FILE = config["decrypted_file"] + SYMMETRIC_KEY = config["symmetric_key"] + PUBLIC_PEM = config["public_key"] + PRIVATE_PEM = config["secret_key"] +except FileNotFoundError: + print("Файл settings.json не найден.") + +except Exception as ex: + print(f"Ошибка при загрузке конфигурационных данных: {ex}") diff --git a/lab_3/decryptedText.txt b/lab_3/decryptedText.txt new file mode 100644 index 00000000..405c6b0c --- /dev/null +++ b/lab_3/decryptedText.txt @@ -0,0 +1,167 @@ +Профессор Выбегалло кушал. На столе перед ним дымилась большая фотографическая кювета, +доверху наполненная пареными отрубями. Не обращая ни на кого специального внимания, он зачер- +пывал отруби широкой ладонью, уминал их пальцами, как плов, и образовавшийся комок отправлял +в ротовое отверстие, обильно посыпая крошками бороду. При этом он хрустел, чмокал, хрюкал, +всхрапывал, склонял голову набок и жмурился, словно от огромного наслаждения. Время от времени, +не переставая глотать и давиться, он приходил в волнение, хватал за края чан с отрубями и вёдра с +обратом, стоявшие рядом с ним на полу, и каждый раз придвигал их к себе всё ближе и ближе. На +другом конце стола молоденькая ведьма-практикантка Стелла с чистыми розовыми ушками, бледная +и заплаканная, с дрожащими губками, нарезала хлебные буханки огромными скибками и, отворачи- +ваясь, подносила их Выбегалле на вытянутых руках. Центральный автоклав был раскрыт, опрокинут, +и вокруг него растеклась обширная зеленоватая лужа. +Выбегалло вдруг произнёс неразборчиво: +– Эй, девка… эта… молока давай! Лей, значить, прямо сюда, в отрубя… Силь ву пле, значить… +Стелла торопливо подхватила ведро и плеснула в кювету обрат. +– Эх! – воскликнул профессор Выбегалло. – Посуда мала, значить! Ты, девка, как тебя, эта, +прямо в чан лей. Будем, значить, из чана кушать… +Стелла стала опрокидывать вёдра в чан с отрубями, а профессор, ухвативши кювету, как ложку, +принялся черпать отруби и отправлять в пасть, раскрывшуюся вдруг невероятно широко. +– Да позвоните же ему! – жалобно закричала Стелла. – Он же сейчас всё доест! +– Звонили уже, – сказали в толпе. – Ты лучше от него отойди всё-таки. Ступай сюда. +– Ну, он придёт? Придёт? +– Сказал, что выходит. Галоши, значить, надевает и выходит. Отойди от него, тебе говорят. +Я, наконец, понял, в чём дело. Это не был профессор Выбегалло. Это был новорождённый ка- +давр, модель Человека, неудовлетворённого желудочно. И слава богу, а то я уж было подумал, что +профессора хватил мозговой паралич. Как следствие напряжённых занятий. +Стелла осторожненько отошла. Её схватили за плечи и втянули в толпу. Она спряталась за моей +спиной, вцепившись мне в локоть, и я немедленно расправил плечи, хотя не понимал ещё, в чём дело +и чего она так боится. Кадавр жрал. В лаборатории, полной народа, стояла потрясённая тишина, и +было слышно только, как он сопит и хрустит, словно лошадь, и скребёт кюветой по стенкам чана. +Мы смотрели. Он слез со стула и погрузил голову в чан. Женщины отвернулись. Лилечке Новосме- +ховой стало плохо, и её вывели в коридор. Потом ясный голос Эдика Амперяна произнёс: +– Хорошо. Будем логичны. Сейчас он прикончит отруби, потом доест хлеб. А потом? +В передних рядах возникло движение. Толпа потеснилась к дверям. Я начал понимать. Стелла +сказала тоненьким голоском: +– Ещё селёдочные головы есть… +– Много? +– Две тонны. +– М-да, – сказал Эдик. – И где же они? +– Они должны подаваться по конвейеру, – сказала Стелла. – Но я пробовала, а конвейер сло- +ман… +– Между прочим, – сказал Роман громко, – уже в течение двух минут я пытаюсь его пассивизи- +ровать, и совершенно безрезультатно… +– Я тоже, – сказал Эдик. +– Поэтому, – сказал Роман, – было бы очень хорошо, если бы кто-нибудь из особо брезгливых +занялся починкой конвейера. Как паллиатив. Есть тут кто-нибудь ещё из магистров? Эдика я вижу. +Ещё кто-нибудь есть? Корнеев! Виктор Павлович, ты здесь? +– Нет его. Может быть, за Фёдором Симеоновичем сбегать? +– Я думаю, пока не стоит беспокоить. Справимся как-нибудь. Эдик, давай-ка вместе, сосредо- +точенно. +– В каком режиме? +– В режиме торможения. Вплоть до тетануса. Ребята, помогайте все, кто умеет. +– Одну минутку, – сказал Эдик. – А если мы его повредим? +– Да-да-да, – сказал я. – Вы уж лучше не надо. Пусть уж он лучше меня сожрёт. +– Не беспокойся, не беспокойся. Мы будем осторожны. Эдик, давай на прикосновениях. В одно +касание. +– Начали, – сказал Эдик. +Стало ещё тише. Кадавр ворочался в чане, а за стеной переговаривались и постукивали добро- +вольцы, возившиеся с конвейером. Прошла минута. Кадавр вылез из чана, утёр бороду, сонно по- +смотрел на нас и вдруг ловким движением, неимоверно далеко вытянув руку, сцапал последнюю бу- +ханку хлеба. Затем он рокочуще отрыгнул и откинулся на спинку стула, сложив руки на огромном +вздувшемся животе. По лицу его разлилось блаженство. Он посапывал и бессмысленно улыбался. Он +был несомненно счастлив, как бывает счастлив предельно уставший человек, добравшийся наконец +до желанной постели. +– Подействовало, кажется, – с облегчённым вздохом сказал кто-то в толпе. +Роман с сомнением поджал губы. +– У меня нет такого впечатления, – вежливо сказал Эдик. +– Может быть, у него завод кончился? – сказал я с надеждой. +Стелла жалобно сообщила: +– Это просто релаксация… Пароксизм довольства. Он скоро опять проснётся. +– Слабаки вы, магистры, – сказал мужественный голос. – Пустите-ка меня, пойду Фёдора Си- +меоновича позову. +Все переглядывались, неуверенно улыбаясь. Роман задумчиво играл умклайдетом, катая его на +ладони. Стелла дрожала, шепча: «Что ж это будет? Саша, я боюсь!» Что касается меня, то я выпячи- +вал грудь, хмурил брови и боролся со страстным желанием позвонить Модесту Матвеевичу. Мне +ужасно хотелось снять с себя ответственность. Это была слабость, и я был бессилен перед ней. Мо- +дест Матвеевич представлялся мне сейчас совсем в особом свете, и я с надеждой вспоминал защи- +щённую в прошлом месяце магистерскую диссертацию «О соотношении законов природы и законов +администрации», где в частности доказывалось, что сплошь и рядом административные законы в си- +лу своей специфической непреклонности оказываются действеннее природных и магических законо- +мерностей. Я был убеждён, что стоило бы Модесту Матвеевичу появиться здесь и заорать на упыря: +«Вы это прекратите, товарищ Выбегалло!» – как упырь немедленно бы прекратил. +– Роман, – сказал я небрежно, – я думаю, что в крайнем случае ты способен его дематериализо- +вать? +Роман засмеялся и похлопал меня по плечу. +– Не трусь, – сказал он. – Это всё игрушки. С Выбегаллой только связываться неохота… Этого +ты не бойся, ты вон того бойся! – Он указал на второй автоклав, мирно пощёлкивающий в углу. +Между тем кадавр вдруг беспокойно зашевелился. Стелла тихонько взвизгнула и прижалась ко +мне. Глаза кадавра раскрылись. Сначала он нагнулся и заглянул в чан. Потом погремел пустыми вёд- +рами. Потом замер и некоторое время сидел неподвижно. Выражение довольства на его лице смени- +лось выражением горькой обиды. Он приподнялся, быстро обнюхал, шевеля ноздрями, стол и, вытя- +нув длинный красный язык, слизнул крошки. +– Ну, держись, ребята… – прошептали в толпе. +Кадавр сунул руку в чан, вытащил кювету, осмотрел её со всех сторон и осторожно откусил +край. Брови его страдальчески поднялись. Он откусил ещё кусок и захрустел. Лицо его посинело, +словно бы от сильного раздражения, глаза увлажнились, но он кусал раз за разом, пока не сжевал всю +кювету. С минуту он сидел в задумчивости, пробуя пальцами зубы, затем медленно прошёлся взгля- +дом по замершей толпе. Нехороший у него был взгляд – оценивающий, выбирающий какой-то. Во- +лодя Почкин непроизвольно произнёс: «Но-но, тихо, ты…» И тут пустые прозрачные глаза упёрлись +в Стеллу, и она испустила вопль, тот самый душераздирающий вопль, переходящий в ультразвук, +который мы с Романом уже слышали в приёмной директора четырьмя этажами ниже. Я содрогнулся. +Кадавра это тоже смутило: он опустил глаза и нервно забарабанил пальцами по столу. +В дверях раздался шум, все задвигались, и сквозь толпу, расталкивая зазевавшихся, выдирая +сосульки из бороды, полез Амвросий Амбруазович Выбегалло. Настоящий. От него пахло водкой, +зипуном и морозом. +– Милай! – закричал он. – Что же это, а? Кель сетуасьен!9 Стелла, что же ты, эта, смотришь!.. +Где селёдка? У него же потребности!.. У него же они растут!.. Мои труды читать надо! +Он приблизился к кадавру, и кадавр сейчас же принялся жадно его обнюхивать. Выбегалло от- +дал ему зипун. +– Потребности надо удовлетворять! – говорил он, торопливо щёлкая переключателями на пуль- +те конвейера. – Почему сразу не дала? Ох уж эти ле фам, ле фам!..10 Кто сказал, что сломан? И не +сломан вовсе, а заговорён. Чтоб, значить, не всякому пользоваться, потому что, эта, потребности у +всех, а селёдка – для модели… +В стене открылось окошечко, затарахтел конвейер, и прямо на пол полился поток благоухаю- +щих селёдочных голов. Глаза кадавра сверкнули. Он пал на четвереньки, дробной рысью подскакал к +окошечку и взялся за дело. Выбегалло, стоя рядом, хлопал в ладоши, радостно вскрикивал и время от +времени, переполняясь чувствами, принимался чесать кадавра за ухом. +Толпа облегчённо вздыхала и шевелилась. Выяснилось, что Выбегалло привёл с собой двух +корреспондентов областной газеты. Корреспонденты были знакомые – Г. Проницательный и Б. Питомник. От них тоже пахло водкой. Сверкая блицами, они принялись фотографировать и записывать +в книжечки. Г. Проницательный и Б. Питомник специализировались по науке. Г. Проницательный +был прославлен фразой: «Оорт первый взглянул на звёздное небо и заметил, что Галактика вращает- +ся». Ему же принадлежали: литературная запись повествования Мерлина о путешествии с председа- +телем райсовета и интервью, взятое (по неграмотности) у дубля Ойры-Ойры. Интервью имело назва- +ние «Человек с большой буквы» и начиналось словами: «Как всякий истинный учёный, он был +немногословен…» Б. Питомник паразитировал на Выбегалле. Его боевые очерки о самонадевающей- +ся обуви, о самовыдергивающе-самоукладывающейся в грузовики моркови и о других проектах Вы- +бегаллы были широко известны в области, а статья «Волшебник из Соловца» появилась даже в одном +из центральных журналов. +Когда у кадавра наступил очередной пароксизм довольства и он задремал, подоспевшие лабо- +ранты Выбегаллы, с корнем выдранные из-за новогодних столов и потому очень неприветливые, то- +ропливо нарядили его в чёрную пару и подсунули под него стул. Корреспонденты поставили Выбе- +галлу рядом, положили его руки на плечи кадавра и, нацелясь объективами, попросили продолжать. +– Главное – что? – с готовностью провозгласил Выбегалло. – Главное, чтобы человек был сча- +стлив. Замечаю это в скобках: счастье есть понятие человеческое. А что есть человек, философски +говоря? Человек, товарищи, есть хомо сапиенс, который может и хочет. Может, эта, всё, что хочет, а +хочет всё, что может. Нес па, товарищи? Ежели он, то есть человек, может всё, что хочет, а хочет всё, +что может, то он и есть счастлив. Так мы его и определим. Что мы здесь, товарищи, перед собою +имеем? Мы имеем модель. Но эта модель, товарищи, хочет, и это уже хорошо. Так сказать, экселент, +эксви, шармант11. И ещё, товарищи, вы сами видите, что она может. И это ещё лучше, потому что раз +так, то она… он, значить, счастливый. Имеется метафизический переход от несчастья к счастью, и +это нас не может удивлять, потому что счастливыми не рождаются, а счастливыми, эта, становятся. +Благодаря заботам и правильному к тебе отношению. Вот оно сейчас просыпается… Оно хочет. И +потому оно пока несчастливо. Но оно может, и через это «может» совершается диалектический ска- +чок. Во, во!.. Смотрите! Видали, как оно может? Ух ты, мой милый, ух ты, мой радостный!.. Во, во! +Вот как оно может! Минут десять-пятнадцать оно может… Вы, там, товарищ Питомник, свой фото- +аппаратик отложите, а возьмите вы киноаппаратик, потому как здесь мы имеем процесс… здесь у нас +всё в движении! Покой у нас, как и полагается быть, относителен, движение у нас абсолютно. Вот +так. Теперь оно смогло и диалектически переходит к счастью. К довольству, то есть. Видите, оно гла- +за закрыло. Наслаждается. Ему хорошо. Я вам научно утверждаю, что готов был бы с ним поменять- +ся. В данный, конечно, момент… Вы, товарищ Проницательный, всё, что я говорю, записывайте, а +потом дайте мне. Я приглажу и ссылки вставлю… Вот теперь оно дремлет, но это ещё не всё. По- +требности должны идти у нас как вглубь, так и вширь. Это, значить, будет единственно верный про- +цесс. Он ди ке12, Выбегалло, мол, против духовного мира. Это, товарищи, ярлык. Нам, товарищи, +давно пора забыть такие манеры в научной дискуссии. Все мы знаем, что материальное идёт впереди, +а духовное идёт позади. Сатур вентур, как известно, нон студит либентур13. Что мы, применительно к +данному случаю, переведём так: голодной куме всё хлеб на уме… +– Наоборот, – сказал Ойра-Ойра. +Некоторое время Выбегалло пусто смотрел на него, затем сказал: +– Эту реплику из зала мы, товарищи, сейчас отметём с негодованием. Как неорганизованную. +Не будем отвлекаться от главного – от практики. Оставим теорию лицам, в ней недостаточно подко- +ванным. Я продолжаю и перехожу к следующей ступени эксперимента. Поясняю для прессы. Исходя +из материалистической идеи о том, что временное удовлетворение матпотребностей произошло, +можно переходить к удовлетворению духпотребностей. То есть посмотреть кино, телевизор, послу- +шать народную музыку или попеть самому и даже почитать какую-нибудь книгу, скажем, «Кроко- +дил» или там газету… Мы, товарищи, не забываем, что ко всему этому надо иметь способности, в то +время как удовлетворение матпотребностей особенных способностей не требует, они всегда есть, ибо +природа следует материализму. Пока насчёт духовных способностей данной модели мы сказать ничего не можем, поскольку её рациональное зерно есть желудочная неудовлетворённость. Но эти дух- +способности мы сейчас у неё вычленим. \ No newline at end of file diff --git a/lab_3/encryptedSymmetricKey.bin b/lab_3/encryptedSymmetricKey.bin new file mode 100644 index 00000000..adb2ab4c Binary files /dev/null and b/lab_3/encryptedSymmetricKey.bin differ diff --git a/lab_3/encryptedText.bin b/lab_3/encryptedText.bin new file mode 100644 index 00000000..79dc378b Binary files /dev/null and b/lab_3/encryptedText.bin differ diff --git a/lab_3/fileOrganization.py b/lab_3/fileOrganization.py new file mode 100644 index 00000000..36396d4d --- /dev/null +++ b/lab_3/fileOrganization.py @@ -0,0 +1,149 @@ +import os + +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.serialization import load_pem_public_key, load_pem_private_key + +from config import PUBLIC_PEM, PRIVATE_PEM + + +class FileOrganizer: + """ + класс для работы с файлами - чтение и запись + """ + @staticmethod + def serialization_public_key(public_key) -> None: + """ + сериализация публичного ключа + :param public_key: + :return: None + """ + try: + with open(PUBLIC_PEM, 'wb') as public_out: + public_out.write(public_key.public_bytes(encoding=serialization.Encoding.PEM, + format=serialization.PublicFormat.SubjectPublicKeyInfo) + ) + except Exception as ex: + print(f"Ошибка при сериализации публичного ключа: {ex}") + + @staticmethod + def deserialization_public_key(): + """ + десериализация публичного ключа + :return: публичный ключ в байтах + """ + try: + with open(PUBLIC_PEM, 'rb') as pem_in: + public_bytes = pem_in.read() + return load_pem_public_key(public_bytes) + except Exception as ex: + print(f"Ошибка при десериализации публичного ключа: {ex}") + + @staticmethod + def serialization_private_key(private_key) -> None: + """ + сериализация приватного ключа + :param private_key: приватный ключ + :return: None + """ + try: + with open(PRIVATE_PEM, 'wb') as private_out: + private_out.write(private_key.private_bytes(encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.NoEncryption()) + ) + except Exception as ex: + print(f"Ошибка при сериализации приватного ключа: {ex}") + + @staticmethod + def deserialization_private_key(): + """ + десериализация приватного ключа + :return: приватный ключ в байтах + """ + try: + with open(PRIVATE_PEM, 'rb') as pem_in: + private_bytes = pem_in.read() + return load_pem_private_key(private_bytes, password=None, ) + except Exception as ex: + print(f"Ошибка при десериализации приватного ключа: {ex}") + + @staticmethod + def save_bytes_to_file(data: bytes, file_path: str) -> None: + """ + сохранения байтов в файле + :param data: данные в байтах + :param file_path: путь к файлу для сохранения + :return: None + """ + try: + with open(file_path, 'wb') as f: + f.write(data) + except FileNotFoundError: + print(f"Файл не найден: {file_path}") + except Exception as ex: + print(f"Ошибка при сохранении байтов в файл в функции save_bytes_to_file : {ex}") + + @staticmethod + def load_bytes_from_file(file_path: str) -> bytes: + """ + считывание байтов из файла + :param file_path: путь к файлу + :return: байты, содержащиеся в файле + """ + try: + with open(file_path, 'rb') as f: + return f.read() + except FileNotFoundError: + print(f"Файл не найден: {file_path}") + except Exception as ex: + print(f"Ошибка при выводе байтов из файла в функции load_bytes_from_file: {ex}") + + @staticmethod + def check_file_not_empty(file_path: str) -> bool: + """ + проверка на наличие данных в файле + :param file_path: путь к файлу + :return: bool - результат проверки + """ + try: + if os.path.getsize(file_path) == 0: + print(f"Ошибка! Файл - {file_path} - пустой") + return False + + return True + except FileNotFoundError: + print(f"Файл не найден: {file_path}") + except Exception as ex: + print(f"Ошибка при проверке файла в функции check_file_not_empty: {ex}") + + @staticmethod + def read_txt_file(file_path: str) -> str: + """ + считывание строки из текстового файла + :param file_path: путь к файлу + :return: строка, содержащаяся в нем + """ + try: + with open(file_path, 'r', encoding='utf-8') as file: + return file.read() + except FileNotFoundError: + print(f"Файл не найден: {file_path}") + + except Exception as ex: + print(f"Ошибка при чтении файла в функции read_txt_file: {ex}") + + @staticmethod + def write_file_txt(data: str, file_path: str) -> None: + """ + запись данных в текстовый файл + :param data: строка для записи + :param file_path: путь к файлу + :return: None + """ + try: + with open(file_path, 'w', encoding='utf-8') as file: + file.write(data) + except FileNotFoundError: + print(f"Файл не найден: {file_path}") + except Exception as ex: + print(f"Ошибка при записи данных в файл в функции write_file_txt: {ex}") diff --git a/lab_3/main.py b/lab_3/main.py new file mode 100644 index 00000000..aa8ac0f4 --- /dev/null +++ b/lab_3/main.py @@ -0,0 +1,37 @@ +import argparse +from scenarios import Scenario + + +def main(): + """ + Главная функция программы. Реализует парсинг аргументов командной строки, + на основе которых запускает тот или иной сюжет гибридного шифрования + :return: + """ + parser = argparse.ArgumentParser() + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('-gen', '--generation', help='Запуск режима генерации ключей', action='store_true') + group.add_argument('-enc', '--encryption', help='Запуск режима шифрования', action='store_true') + group.add_argument('-dec', '--decryption', help='Запуск режима дешифрования', action='store_true') + + args = parser.parse_args() + status = False + if args.generation: + status = Scenario.generate_keys() + elif args.encryption: + status = Scenario.encrypt_data() + elif args.decryption: + status = Scenario.decrypt_data() + else: + print("Была выбрана неизвестная операция") + + if status: + print("Операция успешно завершилась") + else: + print("Операция завершилась с ошибкой") + + return 0 + + +if __name__ == '__main__': + main() diff --git a/lab_3/originalText.txt b/lab_3/originalText.txt new file mode 100644 index 00000000..405c6b0c --- /dev/null +++ b/lab_3/originalText.txt @@ -0,0 +1,167 @@ +Профессор Выбегалло кушал. На столе перед ним дымилась большая фотографическая кювета, +доверху наполненная пареными отрубями. Не обращая ни на кого специального внимания, он зачер- +пывал отруби широкой ладонью, уминал их пальцами, как плов, и образовавшийся комок отправлял +в ротовое отверстие, обильно посыпая крошками бороду. При этом он хрустел, чмокал, хрюкал, +всхрапывал, склонял голову набок и жмурился, словно от огромного наслаждения. Время от времени, +не переставая глотать и давиться, он приходил в волнение, хватал за края чан с отрубями и вёдра с +обратом, стоявшие рядом с ним на полу, и каждый раз придвигал их к себе всё ближе и ближе. На +другом конце стола молоденькая ведьма-практикантка Стелла с чистыми розовыми ушками, бледная +и заплаканная, с дрожащими губками, нарезала хлебные буханки огромными скибками и, отворачи- +ваясь, подносила их Выбегалле на вытянутых руках. Центральный автоклав был раскрыт, опрокинут, +и вокруг него растеклась обширная зеленоватая лужа. +Выбегалло вдруг произнёс неразборчиво: +– Эй, девка… эта… молока давай! Лей, значить, прямо сюда, в отрубя… Силь ву пле, значить… +Стелла торопливо подхватила ведро и плеснула в кювету обрат. +– Эх! – воскликнул профессор Выбегалло. – Посуда мала, значить! Ты, девка, как тебя, эта, +прямо в чан лей. Будем, значить, из чана кушать… +Стелла стала опрокидывать вёдра в чан с отрубями, а профессор, ухвативши кювету, как ложку, +принялся черпать отруби и отправлять в пасть, раскрывшуюся вдруг невероятно широко. +– Да позвоните же ему! – жалобно закричала Стелла. – Он же сейчас всё доест! +– Звонили уже, – сказали в толпе. – Ты лучше от него отойди всё-таки. Ступай сюда. +– Ну, он придёт? Придёт? +– Сказал, что выходит. Галоши, значить, надевает и выходит. Отойди от него, тебе говорят. +Я, наконец, понял, в чём дело. Это не был профессор Выбегалло. Это был новорождённый ка- +давр, модель Человека, неудовлетворённого желудочно. И слава богу, а то я уж было подумал, что +профессора хватил мозговой паралич. Как следствие напряжённых занятий. +Стелла осторожненько отошла. Её схватили за плечи и втянули в толпу. Она спряталась за моей +спиной, вцепившись мне в локоть, и я немедленно расправил плечи, хотя не понимал ещё, в чём дело +и чего она так боится. Кадавр жрал. В лаборатории, полной народа, стояла потрясённая тишина, и +было слышно только, как он сопит и хрустит, словно лошадь, и скребёт кюветой по стенкам чана. +Мы смотрели. Он слез со стула и погрузил голову в чан. Женщины отвернулись. Лилечке Новосме- +ховой стало плохо, и её вывели в коридор. Потом ясный голос Эдика Амперяна произнёс: +– Хорошо. Будем логичны. Сейчас он прикончит отруби, потом доест хлеб. А потом? +В передних рядах возникло движение. Толпа потеснилась к дверям. Я начал понимать. Стелла +сказала тоненьким голоском: +– Ещё селёдочные головы есть… +– Много? +– Две тонны. +– М-да, – сказал Эдик. – И где же они? +– Они должны подаваться по конвейеру, – сказала Стелла. – Но я пробовала, а конвейер сло- +ман… +– Между прочим, – сказал Роман громко, – уже в течение двух минут я пытаюсь его пассивизи- +ровать, и совершенно безрезультатно… +– Я тоже, – сказал Эдик. +– Поэтому, – сказал Роман, – было бы очень хорошо, если бы кто-нибудь из особо брезгливых +занялся починкой конвейера. Как паллиатив. Есть тут кто-нибудь ещё из магистров? Эдика я вижу. +Ещё кто-нибудь есть? Корнеев! Виктор Павлович, ты здесь? +– Нет его. Может быть, за Фёдором Симеоновичем сбегать? +– Я думаю, пока не стоит беспокоить. Справимся как-нибудь. Эдик, давай-ка вместе, сосредо- +точенно. +– В каком режиме? +– В режиме торможения. Вплоть до тетануса. Ребята, помогайте все, кто умеет. +– Одну минутку, – сказал Эдик. – А если мы его повредим? +– Да-да-да, – сказал я. – Вы уж лучше не надо. Пусть уж он лучше меня сожрёт. +– Не беспокойся, не беспокойся. Мы будем осторожны. Эдик, давай на прикосновениях. В одно +касание. +– Начали, – сказал Эдик. +Стало ещё тише. Кадавр ворочался в чане, а за стеной переговаривались и постукивали добро- +вольцы, возившиеся с конвейером. Прошла минута. Кадавр вылез из чана, утёр бороду, сонно по- +смотрел на нас и вдруг ловким движением, неимоверно далеко вытянув руку, сцапал последнюю бу- +ханку хлеба. Затем он рокочуще отрыгнул и откинулся на спинку стула, сложив руки на огромном +вздувшемся животе. По лицу его разлилось блаженство. Он посапывал и бессмысленно улыбался. Он +был несомненно счастлив, как бывает счастлив предельно уставший человек, добравшийся наконец +до желанной постели. +– Подействовало, кажется, – с облегчённым вздохом сказал кто-то в толпе. +Роман с сомнением поджал губы. +– У меня нет такого впечатления, – вежливо сказал Эдик. +– Может быть, у него завод кончился? – сказал я с надеждой. +Стелла жалобно сообщила: +– Это просто релаксация… Пароксизм довольства. Он скоро опять проснётся. +– Слабаки вы, магистры, – сказал мужественный голос. – Пустите-ка меня, пойду Фёдора Си- +меоновича позову. +Все переглядывались, неуверенно улыбаясь. Роман задумчиво играл умклайдетом, катая его на +ладони. Стелла дрожала, шепча: «Что ж это будет? Саша, я боюсь!» Что касается меня, то я выпячи- +вал грудь, хмурил брови и боролся со страстным желанием позвонить Модесту Матвеевичу. Мне +ужасно хотелось снять с себя ответственность. Это была слабость, и я был бессилен перед ней. Мо- +дест Матвеевич представлялся мне сейчас совсем в особом свете, и я с надеждой вспоминал защи- +щённую в прошлом месяце магистерскую диссертацию «О соотношении законов природы и законов +администрации», где в частности доказывалось, что сплошь и рядом административные законы в си- +лу своей специфической непреклонности оказываются действеннее природных и магических законо- +мерностей. Я был убеждён, что стоило бы Модесту Матвеевичу появиться здесь и заорать на упыря: +«Вы это прекратите, товарищ Выбегалло!» – как упырь немедленно бы прекратил. +– Роман, – сказал я небрежно, – я думаю, что в крайнем случае ты способен его дематериализо- +вать? +Роман засмеялся и похлопал меня по плечу. +– Не трусь, – сказал он. – Это всё игрушки. С Выбегаллой только связываться неохота… Этого +ты не бойся, ты вон того бойся! – Он указал на второй автоклав, мирно пощёлкивающий в углу. +Между тем кадавр вдруг беспокойно зашевелился. Стелла тихонько взвизгнула и прижалась ко +мне. Глаза кадавра раскрылись. Сначала он нагнулся и заглянул в чан. Потом погремел пустыми вёд- +рами. Потом замер и некоторое время сидел неподвижно. Выражение довольства на его лице смени- +лось выражением горькой обиды. Он приподнялся, быстро обнюхал, шевеля ноздрями, стол и, вытя- +нув длинный красный язык, слизнул крошки. +– Ну, держись, ребята… – прошептали в толпе. +Кадавр сунул руку в чан, вытащил кювету, осмотрел её со всех сторон и осторожно откусил +край. Брови его страдальчески поднялись. Он откусил ещё кусок и захрустел. Лицо его посинело, +словно бы от сильного раздражения, глаза увлажнились, но он кусал раз за разом, пока не сжевал всю +кювету. С минуту он сидел в задумчивости, пробуя пальцами зубы, затем медленно прошёлся взгля- +дом по замершей толпе. Нехороший у него был взгляд – оценивающий, выбирающий какой-то. Во- +лодя Почкин непроизвольно произнёс: «Но-но, тихо, ты…» И тут пустые прозрачные глаза упёрлись +в Стеллу, и она испустила вопль, тот самый душераздирающий вопль, переходящий в ультразвук, +который мы с Романом уже слышали в приёмной директора четырьмя этажами ниже. Я содрогнулся. +Кадавра это тоже смутило: он опустил глаза и нервно забарабанил пальцами по столу. +В дверях раздался шум, все задвигались, и сквозь толпу, расталкивая зазевавшихся, выдирая +сосульки из бороды, полез Амвросий Амбруазович Выбегалло. Настоящий. От него пахло водкой, +зипуном и морозом. +– Милай! – закричал он. – Что же это, а? Кель сетуасьен!9 Стелла, что же ты, эта, смотришь!.. +Где селёдка? У него же потребности!.. У него же они растут!.. Мои труды читать надо! +Он приблизился к кадавру, и кадавр сейчас же принялся жадно его обнюхивать. Выбегалло от- +дал ему зипун. +– Потребности надо удовлетворять! – говорил он, торопливо щёлкая переключателями на пуль- +те конвейера. – Почему сразу не дала? Ох уж эти ле фам, ле фам!..10 Кто сказал, что сломан? И не +сломан вовсе, а заговорён. Чтоб, значить, не всякому пользоваться, потому что, эта, потребности у +всех, а селёдка – для модели… +В стене открылось окошечко, затарахтел конвейер, и прямо на пол полился поток благоухаю- +щих селёдочных голов. Глаза кадавра сверкнули. Он пал на четвереньки, дробной рысью подскакал к +окошечку и взялся за дело. Выбегалло, стоя рядом, хлопал в ладоши, радостно вскрикивал и время от +времени, переполняясь чувствами, принимался чесать кадавра за ухом. +Толпа облегчённо вздыхала и шевелилась. Выяснилось, что Выбегалло привёл с собой двух +корреспондентов областной газеты. Корреспонденты были знакомые – Г. Проницательный и Б. Питомник. От них тоже пахло водкой. Сверкая блицами, они принялись фотографировать и записывать +в книжечки. Г. Проницательный и Б. Питомник специализировались по науке. Г. Проницательный +был прославлен фразой: «Оорт первый взглянул на звёздное небо и заметил, что Галактика вращает- +ся». Ему же принадлежали: литературная запись повествования Мерлина о путешествии с председа- +телем райсовета и интервью, взятое (по неграмотности) у дубля Ойры-Ойры. Интервью имело назва- +ние «Человек с большой буквы» и начиналось словами: «Как всякий истинный учёный, он был +немногословен…» Б. Питомник паразитировал на Выбегалле. Его боевые очерки о самонадевающей- +ся обуви, о самовыдергивающе-самоукладывающейся в грузовики моркови и о других проектах Вы- +бегаллы были широко известны в области, а статья «Волшебник из Соловца» появилась даже в одном +из центральных журналов. +Когда у кадавра наступил очередной пароксизм довольства и он задремал, подоспевшие лабо- +ранты Выбегаллы, с корнем выдранные из-за новогодних столов и потому очень неприветливые, то- +ропливо нарядили его в чёрную пару и подсунули под него стул. Корреспонденты поставили Выбе- +галлу рядом, положили его руки на плечи кадавра и, нацелясь объективами, попросили продолжать. +– Главное – что? – с готовностью провозгласил Выбегалло. – Главное, чтобы человек был сча- +стлив. Замечаю это в скобках: счастье есть понятие человеческое. А что есть человек, философски +говоря? Человек, товарищи, есть хомо сапиенс, который может и хочет. Может, эта, всё, что хочет, а +хочет всё, что может. Нес па, товарищи? Ежели он, то есть человек, может всё, что хочет, а хочет всё, +что может, то он и есть счастлив. Так мы его и определим. Что мы здесь, товарищи, перед собою +имеем? Мы имеем модель. Но эта модель, товарищи, хочет, и это уже хорошо. Так сказать, экселент, +эксви, шармант11. И ещё, товарищи, вы сами видите, что она может. И это ещё лучше, потому что раз +так, то она… он, значить, счастливый. Имеется метафизический переход от несчастья к счастью, и +это нас не может удивлять, потому что счастливыми не рождаются, а счастливыми, эта, становятся. +Благодаря заботам и правильному к тебе отношению. Вот оно сейчас просыпается… Оно хочет. И +потому оно пока несчастливо. Но оно может, и через это «может» совершается диалектический ска- +чок. Во, во!.. Смотрите! Видали, как оно может? Ух ты, мой милый, ух ты, мой радостный!.. Во, во! +Вот как оно может! Минут десять-пятнадцать оно может… Вы, там, товарищ Питомник, свой фото- +аппаратик отложите, а возьмите вы киноаппаратик, потому как здесь мы имеем процесс… здесь у нас +всё в движении! Покой у нас, как и полагается быть, относителен, движение у нас абсолютно. Вот +так. Теперь оно смогло и диалектически переходит к счастью. К довольству, то есть. Видите, оно гла- +за закрыло. Наслаждается. Ему хорошо. Я вам научно утверждаю, что готов был бы с ним поменять- +ся. В данный, конечно, момент… Вы, товарищ Проницательный, всё, что я говорю, записывайте, а +потом дайте мне. Я приглажу и ссылки вставлю… Вот теперь оно дремлет, но это ещё не всё. По- +требности должны идти у нас как вглубь, так и вширь. Это, значить, будет единственно верный про- +цесс. Он ди ке12, Выбегалло, мол, против духовного мира. Это, товарищи, ярлык. Нам, товарищи, +давно пора забыть такие манеры в научной дискуссии. Все мы знаем, что материальное идёт впереди, +а духовное идёт позади. Сатур вентур, как известно, нон студит либентур13. Что мы, применительно к +данному случаю, переведём так: голодной куме всё хлеб на уме… +– Наоборот, – сказал Ойра-Ойра. +Некоторое время Выбегалло пусто смотрел на него, затем сказал: +– Эту реплику из зала мы, товарищи, сейчас отметём с негодованием. Как неорганизованную. +Не будем отвлекаться от главного – от практики. Оставим теорию лицам, в ней недостаточно подко- +ванным. Я продолжаю и перехожу к следующей ступени эксперимента. Поясняю для прессы. Исходя +из материалистической идеи о том, что временное удовлетворение матпотребностей произошло, +можно переходить к удовлетворению духпотребностей. То есть посмотреть кино, телевизор, послу- +шать народную музыку или попеть самому и даже почитать какую-нибудь книгу, скажем, «Кроко- +дил» или там газету… Мы, товарищи, не забываем, что ко всему этому надо иметь способности, в то +время как удовлетворение матпотребностей особенных способностей не требует, они всегда есть, ибо +природа следует материализму. Пока насчёт духовных способностей данной модели мы сказать ничего не можем, поскольку её рациональное зерно есть желудочная неудовлетворённость. Но эти дух- +способности мы сейчас у неё вычленим. \ No newline at end of file diff --git a/lab_3/privateKey.pem b/lab_3/privateKey.pem new file mode 100644 index 00000000..d54269a5 --- /dev/null +++ b/lab_3/privateKey.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEA3mtS8yUpIyWWw3IzBy9mED489+Mk6yvCpp498KKaCvxxeVV3 +FyQgumXeth8zjqH0qwYVYcaxspK+xLXUPi6RSsBTX6uTGGpZz3+4I2NhWKP0zL/b +kOzfz4xvzFfbzStqpaWqJtERudSA7n9vCL55OCqJp+srjHKbei+u32N1QSGT9iS8 +lV2kDXzMLkuVuVuCmC/Dr6Fyoz2CgWXBSpMMzG6FSE6NN8K58qQoM0A2mKwpEfxm +6M9yL0AbmwjRCD+6OmJgqGm33aqNU9flmMtyWYg98w6XhPPyLyZmSVOYbcKTw7E0 +DswA4hedNnmxI4jidHIDMWGMiLdJdT/u/wZKnQIDAQABAoIBAA/57pHni+5p30v3 +soGkHnUxO0jlCHxZ/tfgCvvzehQq8O2xvWWsoyswcRBs6lOm/3+fZr7Ium/kyY4w +r2euCaKwcOyw0taQoRXeCziDhXUMBeQFLfzZfvQWFtu7Pd8dbMIsRa4XG2pZQM+g +2LVslSF7MLsekdi7TL64mRuTtdLxN7EMg9dnU7p034vdbr6iq94qVW4zo2nH+/XG +NDFmzzXIHUpwyi5tTodJCjQ2v3g355eijGVo8B8fdIpfhmSpZ5SBxfBG1Q/B4OeM +2M0wbf8lVp5TunzJVW4dESQygwMOgVybsAdCkPPCHPsQdtm6/utN8h/6l2fkVez2 +pgzal4ECgYEA+m+9QNZmoTzhAm9JDpKwvrK7NamnhtrlAeZ8xWMcAdGNaxXZ6C/2 +CB75xu8ksFzOgmFMiV8bnpJr2crJgPxYG9IPPdLSQ1LY3E8Pzg9y2LpqUM9kjTlU +UhAzQ75Etreksk//YJLUZuWd4NufD0Rs8i1UHMrc4WSKTShjSe5MRd0CgYEA41w/ +Wx8hCmK5wIP66JlAxp/PHyNPrJGW3VagHWW2CZ2SDh8Xba+KFHgxRfrivYOn7sU8 +RravT64lONKb/brxJki1wnDV5M6+nz1n9C/LcXvp+lFaU8p6R+rTTtl+raM34R6V +z/PKj+9ro1RwpdStIOfSJpMSa288aZ4agLYXq8ECgYEAnNpVZ4GhgAVYTKUU1drM +dnQNSxv6QD1jR6Brr1lW1lDASTzDYWiAqS91c8KecRN/iCuWu0dlThkZEaywLmhe +avZS837SkLYX+0xNcts8LD/9jKWIreclR8y7vwcxlFtK/R+brInqHJReINKNOgu6 +TKhVUT9Bvq2w7YiJP2nQPcUCgYEA3egiWjCW0gkr3W+zjCRQKcy+nlibogXzZpLu +8eJc+yOU8z17Y24KahIpnXDSrz/5vz04qJgTocSJxd0hrVMxnTkoVeBFk+4J9Wg8 +twOTIG9eHhga/l9IXDshBPuY/aapmop8lBwRX8zBlQeMbv6V/+Djpwyy1LMcFsXe +fjO8BMECgYEA5oHwSwQU+uielGao8aiyAawLRe9ja6gOrs+d6lvsAlP/tYaclt0/ +Db/oD4HKPjp0uyqwXYRSB/pHZZctkCRRPgQKfuJ8h4SkXhQNFoLB6WI7E5CsCvvr +oRGqD5KhKLlvOUmxZU6qAbRTUSoujv6qjwCd8/11tY1HJheTKtcqixw= +-----END RSA PRIVATE KEY----- diff --git a/lab_3/publicKey.pem b/lab_3/publicKey.pem new file mode 100644 index 00000000..7b43b7fe --- /dev/null +++ b/lab_3/publicKey.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3mtS8yUpIyWWw3IzBy9m +ED489+Mk6yvCpp498KKaCvxxeVV3FyQgumXeth8zjqH0qwYVYcaxspK+xLXUPi6R +SsBTX6uTGGpZz3+4I2NhWKP0zL/bkOzfz4xvzFfbzStqpaWqJtERudSA7n9vCL55 +OCqJp+srjHKbei+u32N1QSGT9iS8lV2kDXzMLkuVuVuCmC/Dr6Fyoz2CgWXBSpMM +zG6FSE6NN8K58qQoM0A2mKwpEfxm6M9yL0AbmwjRCD+6OmJgqGm33aqNU9flmMty +WYg98w6XhPPyLyZmSVOYbcKTw7E0DswA4hedNnmxI4jidHIDMWGMiLdJdT/u/wZK +nQIDAQAB +-----END PUBLIC KEY----- diff --git a/lab_3/scenarios.py b/lab_3/scenarios.py new file mode 100644 index 00000000..6b5edd95 --- /dev/null +++ b/lab_3/scenarios.py @@ -0,0 +1,123 @@ +from asymmetric import Asymmetric +from config import ( + DECRYPTED_FILE, + ENCRYPTED_FILE, + INITIAL_FILE, + PRIVATE_PEM, + SYMMETRIC_KEY +) +from fileOrganization import FileOrganizer +from symmetric import Symmetric + + +class Scenario: + """ + класс реализует три сюжета гибридной системы шифрования: + генерация ключей, шифрование данных, дешифрование данных + """ + + @staticmethod + def generate_keys() -> bool: + """ + Сюжет генерации ключей гибридной системы и шифрования симметричного ключа + :arg: None + :return: bool - корректность выполнения + """ + print("Запуск генерации ключей") + try: + sym_key = Symmetric.generate_key() + print("Сгенерирован симметричный ключ") + + private_key, public_ley = Asymmetric.generate_keys() + print("Сгенерированы асимметричные ключи") + + FileOrganizer.serialization_public_key(public_ley) + FileOrganizer.serialization_private_key(private_key) + print("Сериализованы публичный и приватный ключи") + + cipher_sym_key = Asymmetric.encrypt_bytes(sym_key, public_ley) + FileOrganizer.save_bytes_to_file(cipher_sym_key, SYMMETRIC_KEY) + print("Зашифрован и сохранен симметричный ключ") + + print("Конец генерации ключей") + + except Exception as ex: + print(f"Ошибка при генерации ключей: {ex}") + return False + return True + + @staticmethod + def encrypt_data() -> bool: + """ + Сюжет шифрования данных симметричным шифрованием + :return: bool - корректность выполнения + """ + print("Запуск шифрования данных") + try: + if not (FileOrganizer.check_file_not_empty(SYMMETRIC_KEY) + and FileOrganizer.check_file_not_empty(PRIVATE_PEM)): + print("При шифровании были найдены пустые файлы ключей") + return False + + private_key = FileOrganizer.deserialization_private_key() + print("Приватный ключ был десериализован") + + original_sym_key = Asymmetric.decrypt( + FileOrganizer.load_bytes_from_file(SYMMETRIC_KEY), + private_key + ) + print("Симметричный ключ был извлечен и дешифрован") + + original_data = FileOrganizer.read_txt_file(INITIAL_FILE) + print("Исходный текст считан") + + c_data_bytes = Symmetric.encrypt(original_data, original_sym_key) + print("Исходный текст зашифрован симметричным алгоритмом ") + + FileOrganizer.save_bytes_to_file(c_data_bytes, ENCRYPTED_FILE) + print("Исходный текст зашифрован симметричным алгоритмом ") + + print("Конец шифрования данных") + + except Exception as ex: + print(f"Ошибка при шифровании данных: {ex}") + return False + + return True + + @staticmethod + def decrypt_data(): + """ + Сюжет дешифрования шифротекста + :return: bool - корректность выполнения + """ + print("Запуск дешифрования данных") + try: + if not FileOrganizer.check_file_not_empty(ENCRYPTED_FILE): + print("Файл с зашифрованными данными пустой") + return False + + private_key = FileOrganizer.deserialization_private_key() + print("Приватный ключ был десериализован") + + original_sym_key = Asymmetric.decrypt( + FileOrganizer.load_bytes_from_file(SYMMETRIC_KEY), + private_key + ) + print("Симметричный ключ был извлечен и дешифрован") + + c_data_bytes = FileOrganizer.load_bytes_from_file(ENCRYPTED_FILE) + original_data_bytes = Symmetric.decrypt(c_data_bytes, original_sym_key) + original_data = original_data_bytes.decode('utf-8') + print("Зашифрованный байты были извлечены и конвертированы в текст") + + FileOrganizer.write_file_txt(original_data, DECRYPTED_FILE) + print("Данные были записаны в файл с дешифрованным текстом") + + print("Конец дешифрования данных") + + except Exception as ex: + print(f"Ошибка при дешифровании данных: {ex}") + return False + + return True diff --git a/lab_3/settings.json b/lab_3/settings.json new file mode 100644 index 00000000..b80e081d --- /dev/null +++ b/lab_3/settings.json @@ -0,0 +1,8 @@ +{ + "initial_file":"originalText.txt", + "encrypted_file":"encryptedText.bin", + "decrypted_file":"decryptedText.txt", + "symmetric_key":"encryptedSymmetricKey.bin", + "public_key":"publicKey.pem", + "secret_key":"privateKey.pem" +} \ No newline at end of file diff --git a/lab_3/symmetric.py b/lab_3/symmetric.py new file mode 100644 index 00000000..b4d3efe1 --- /dev/null +++ b/lab_3/symmetric.py @@ -0,0 +1,56 @@ +import os + +from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes +from cryptography.hazmat.primitives import padding + + +class Symmetric: + """ + класс для реализации алгоритма симметричного шифрования IDEA + """ + + @staticmethod + def encrypt(original_data: str, key: bytes) -> bytes: + """ + шифрование строки данных симметричным ключом + :param original_data: строка исходных даннных + :param key: симметричный ключ в байтах + :return: зашифрованные данные в байтах + величина iv в виде приставки + """ + iv = os.urandom(8) + cipher = Cipher(algorithms.IDEA(key), modes.CBC(iv)) + encryptor = cipher.encryptor() + # паддинг + padder = padding.ANSIX923(64).padder() + text = bytes(original_data, 'UTF-8') + padded_text = padder.update(text) + padder.finalize() + # шифрование + c_text = encryptor.update(padded_text) + encryptor.finalize() + return iv + c_text + + @staticmethod + def decrypt(encrypt_text: bytes, key) -> bytes: + """ + дешифрование данных в байтах симметричным ключом + :param encrypt_text: байты - зашифрованные данные + :param key: симметричный ключ в байтах + :return: исходные данные в байтах + """ + iv = encrypt_text[:8] # выделяем iv + cipher = Cipher(algorithms.IDEA(key), modes.CBC(iv)) + decryptor = cipher.decryptor() + # дешифрование + dc_text = decryptor.update(encrypt_text[8:]) + decryptor.finalize() + # убираем паддинги, которые добавили при шифровании + unpadder = padding.ANSIX923(64).unpadder() + unpadded_dc_text = unpadder.update(dc_text) + unpadder.finalize() + + return unpadded_dc_text + + @staticmethod + def generate_key() -> bytes: + """ + генерация симметричного ключа + :return: ключ в виде байтов + """ + return os.urandom(16) diff --git a/lab_4/README.md b/lab_4/README.md deleted file mode 100644 index 7bbc6fb9..00000000 --- a/lab_4/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Основы информационной безопасности - -## Лабораторная №4 "Поиск колизии хеш-функции" - -В данной лабораторной работе вы попытаетесь восстановить номер банковской карты по ее хешу с использованием дополнительной информации о типе карты, типе платежной системы и ее банке-эмитенте. - -Требования к функционалу реализуемого софта, варианты заданий, теоретическая справка и примеры кода приведены в [ноутбуке](https://github.com/itsecd/isb/blob/main/docs/ISB_Lab4.ipynb).