Проект шифр напиши программу которая будет шифровать введенное пользователем сообщение

Обновлено: 11.05.2024

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

Шифр Цезаря на языке Си

В этой статье я расскажу про шифрование текста на языке C методом сдвига символов (также известный как шифр Цезаря). Пользователь вводит натуральное число n — это количество символов, на которое мы сдвигаем данный символ. Например, если n = 2, то буква ‘б’ превращается в букву ‘г’. Будем считать, что буквы идут по кругу, то есть за буквой ‘я’ следует буква ‘а’. Программа должна уметь как зашифровывать, так и расшифровывать текст. Шифровать будем только русские и английские буквы (другие символы: знаки препинания, пробелы и т.п. — шифровать не будем, оставим их без изменения). Ввод/вывод производим из файла.

Приступим к написанию программы. Подключим необходимые библиотеки и определим две константы — количество букв в английском и русском алфавитах соответственно.

Примечание. Константу RUS сделаем равной 32, потому что буква ‘ё’ в таблице символов ASCII в кодировке Windows 1251 находится за границей русского алфавита.

Теперь напишем функцию, которая будет шифровать текст из входного файла. В качестве аргумента она будет принимать число n — количество символов, на которое сдвигать символы в тексте:

Мне, лично, давно была интересна тема шифрования информации, однако, каждый раз погрузившись в эту тему, я осознавал насколько это сложно и понял, что лучше начать с чего-то более простого. Я, лично, планирую написать некоторое количество статей на эту тему, в которых я покажу вам различные алгоритмы шифрования и их реализацию в Python, продемонстрирую и разберу свой проект, созданный в этом направлении. Итак, начнем.

Для начала, я бы хотел рассказать вам какие уже известные алгоритмы мы рассмотрим, в моих статьях. Список вам представлен ниже:

Шифр Цезаря

Итак, после небольшого введения в цикл, я предлагаю все-таки перейти к основной теме сегодняшней статьи, а именно к Шифру Цезаря.

Что это такое?

Шифр Цезаря - это простой тип подстановочного шифра, где каждая буква обычного текста заменяется буквой с фиксированным числом позиций вниз по алфавиту. Принцип его действия можно увидеть в следующей иллюстрации:


Какими особенностями он обладает?

У Шифра Цезаря, как у алгоритма шифрования, я могу выделить две основные особенности. Первая особенность - это простота и доступность метода шифрования, который, возможно поможет вам погрузится в эту тему, вторая особенность - это, собственно говоря, сам метод шифрования.

Программная реализация

В интернете существует огромное множество уроков, связанных с криптографией в питоне, однако, я написал максимально простой и интуитивно понятный код, структуру которого я вам продемонстрирую.

Начнем, пожалуй, с создания алфавита. Для этого вы можете скопировать приведенную ниже строку или написать все руками.

Модернизация

Вот мы и написали программу, однако она имеет очень большой недостаток: "При использовании последних букв(русских), программа выведет вам английские буквы. Давайте это исправим.

Для начала создадим переменную lang, в которой будем задавать язык нашего шифра, а так же разделим английский и русский алфавиты.

Теперь нам надо создать условие, которое проверит выбранный язык и применит его, то есть обратится к нужному нам алфавиту. Для этого пишем само условие и добавляем алгоритм шифрования, с помощью которого будет выполнено шифрование:

По сути, дешифровка - это алгоритм обратный шифровке. Давайте немного переделаем наш код (итоговый вид вы можете увидеть выше).

Для начала, я предлагаю сделать "косметическую" часть нашей переделки. Для этого перемещаемся в самое начало кода:

Остальное можно оставить так же, но если у вас есть желание, то можете поменять названия переменных.

По большому счету, самые 'большие' изменения у нас произойдут в той части кода, где у нас находится алгоритм, где нам нужно просто поменять знак "+" на знак "-". Итак, переходим к самому циклу:

Итоговый вид программы

Итак, вот мы и написали простейшую программу для шифрования методом Цезаря. Ниже я размещу общий вид программы без моих комментариев, чтобы вы еще раз смогли сравнить свою программу с моей:

Ожидаемый результат Зг кзугефхецих фгогх Щикгуя! Да здравствует салат Цезарь!

Вывод Makefile:5: recipe for target 'run' failed

3 ответа 3

Ожидаемый результат Зг кзугефхецих фгогх Щикгуя! Да здравствует салат Цезарь!

но это противоречит условию:

Шифр Цезаря заменяет каждую букву в тексте на букву, которая отстоит в алфавите на некоторое фиксированное число позиций

Смотрите сами: Д -> З - смещение на 4 позиции, а -> г - смещение на 3 позиции, з -> к - 3 позиции, д -> з - 4 позиции. Ну, вы поняли.

Я сделал смещение на фиксированое число позиций.

Вот вариант с рекурсией:

Рассмотрим подробнее второй вариант. Сначала я создал списки из русских букв верхнего и нижнего регистра. Далее идёт функция смещения ( shift ). Зачем функция? Чтобы не копипастить код, с различием только в списке букв для поиска.

Сама функция принимает на вход одну букву (ну, или надеется, что вы дадите 1 букву), список букв для поиска, смещение. Далее вычисляет индекс этой буквы в списке (метод find ), потом проверяет, можно ли получить букву, смещённую на n позиций. Если да - возвращает эту букву. Если же нет, определяет букву по принципу Э →А, Ю →Б, Я →В и т. д. и всё равно возвращает изменённую букву.

Функция back_shift делает тоже самое, только наоборот.

И теперь интересное - функция encrypt . Она получает текст и смещение.

Зачем n=3 , можно же просто n ? Нельзя. Благодаря этому функция использует стандартное смещение (3), если не указано пользовательское. Иначе вы бы получали ошибку:

Далее запускается цикл for, который проходится по всей строке. Он проверяет - если буква text[i] является маленькой - запускает функцию смещения, как для маленькой буквы. И соответственно также для больших букв. (Вот он, плюс использовать функцию! Иначе пришлось бы копировать кусок кода от шифрования маленьких букв и менять список на список больших. И так каждый раз, когда нужно поменять регистр или язык символов. С функцией можно просто передавать, как аргумент список других букв.)

И если буква не является ни большой, ни маленькой - значит это другой символ (пробел, точка, кавычки и т.д.). В таком случае ничего не меняется.

И расшифровка, тоже самое, только наоборот (где-то я это уже видел. )

А вот и часть кода, которая выполнится при старте программы (наконец-то мы её нашли!). Она просто ждёт ввода пользователя - запускает шифрование, а потом дешифрирование.

P.S - пример с рекурсией выглядит красиво, но будет работать чуть медленнее, и при строках не больше 2000 - 3000 символов. (Такие уж в python ограничения).

В этом руководстве мы рассмотрим один из методов шифрования в Python, называемый Caesar Cipher. Это часть криптографии.

Вступление

В этом методе каждый символ заменяется буквой с определенной фиксированной числовой позицией, которая находится после или перед буквой. Например, буква B заменяется на стоящую двумя позициями дальше D. D становится F и так далее. Этот метод назван в честь Юлия Цезаря, который использовал его для общения с официальными лицами.

Для реализации шифра Цезаря в Python используется алгоритм. Давайте в нем разберемся.

Особенность алгоритма шифрования Цезаря

Этот алгоритм состоит из нескольких функций, которые приведены ниже.

  • Метод довольно прост в применении.
  • Каждый текст заменяется фиксированным номером позиции вниз или вверх по алфавиту.
  • Это простой тип заменяющего шифра.

Для определения каждой последней части текста, который был перемещен вниз, требуется целочисленное значение. Это целочисленное значение также известно как сдвиг.

Мы можем представить эту концепцию с помощью модульной арифметики, сначала преобразовав букву в числа в соответствии со схемой: A = 0, B = 1, C = 2, D = 3 …… .. Z = 25.

Следующая математическая формула может использоваться для сдвига буквы n.

Как расшифровать?

Расшифровка такая же, как и шифрование. Мы можем создать функцию, которая выполнит сдвиг по противоположному пути, чтобы расшифровать исходный текст. Однако мы можем использовать циклическое свойство шифра под модулем.

Эту же функцию можно использовать для расшифровки. Вместо этого мы изменим значение сдвига так, чтобы сдвиг = 26 – сдвиг.

Шифр Цезаря в Python

Давайте разберемся в следующем примере –

Приведенный выше код проходил символ за раз. Он передавал каждый символ по правилу в зависимости от процедуры шифрования и дешифрования текста.

Мы определили несколько конкретных наборов позиций, которые генерируют зашифрованный текст.

Нарушение алгоритма шифрования Цезаря

Взломать зашифрованный текст можно разными способами. Один из способов – это метод грубой силы, который включает в себя проверку всех возможных ключей дешифрования. Этот прием не такой сложный и не требует больших усилий.

Транспонирующий шифр

Алгоритм шифрования транспонирования – это метод, при котором алфавитный порядок в открытом тексте перестраивается для формирования зашифрованного текста. Этот алгоритм не поддерживает настоящие текстовые алфавиты.

Давайте разберемся с этим алгоритмом на примере.

Мы возьмем простой пример под названием столбчатый шифр транспозиции, в котором мы пишем каждый символ текста по горизонтали с указанной шириной алфавита. Вертикально написанные тексты являются зашифрованными, что создает совершенно непохожий на зашифрованный текст.

Давайте возьмем простой текст и применим технику простого столбчатого транспонирования, как показано ниже.

Цезарь Шифр в Python

Мы разместили простой текст по горизонтали, и зашифрованный текст создается с вертикальным форматом: hotnejpt.lao.lvi. Чтобы расшифровать это, получатель должен использовать ту же таблицу для расшифровки текста.

В приведенном выше коде мы создали функцию с именем split_len(), которая выдавала текстовый символ, размещенный в формате столбцов или строк.

Метод encode() создал зашифрованный текст с ключом, определяющим количество столбцов, и мы распечатали каждый зашифрованный текст, прочитав каждый столбец.

Примечание. Техника транспонирования призвана значительно улучшить криптобезопасность. Криптоаналитики замечают, что повторное шифрование зашифрованного текста с использованием того же шифра транспозиции показывает лучшую безопасность.

Нажмите, чтобы узнать подробности

Актуальность исследования: Ещё до нашей эры была большая востребованность людьми спрятать текстовую информацию от посторонних глаз при её передаче или хранении. В нашей эре в течение войн была необходимость защитить информацию во время её передачи от сил противника. Сейчас, когда наш мир полностью пользуется интернетом и повсюду идёт её информация, тайно передавать важную информацию и поддерживать конфиденциальность от мошенников встаёт очень острой и важной проблемой.

Изученность проблемы: На протяжении многих лет было много разнообразных учёных криптологов, занимающихся как новыми более совершенными способами шифрования, так и дешифрованием важнейших исторических документов. Такими были Дэвид Кан, Дмитрий Витальевич Скляров, Фред Коэн. Что доказывает интерес учёных в данной проблеме.

Цель работы: Изучение истории криптографии и некоторых основных способов шифрования текстовой информации, с которых зарождалась сама наука. Разработать программу по шифрованию текстовой информации на основе одного из способов шифрования, используя язык олимпиадного программирования.

Задачи работы:

-ознакомиться с материалом о зарождении и истории наук криптографии и криптоанализа;

-изучить первые способы шифрования текстовой информации;

-разработать стартовую программу для шифрования текстовой информации на основе одного из изученных шифров;

Объект исследования: криптография и криптоанализ.

Предмет исследования: способы шифрования текстовой информациия.

Гипотеза исследования: если воспользоваться алгоритмом шифрования одного из изученных шифров и изученный язык олимпиадного программирования, то в конечном итоге я смогу получить программу для шифрования текстовой информации.

Новизна работы: после изучения способов шифрования текстовой информации мы проведём проверку заинтересованности респондентов в олимпиадном программировании или в такой науке как криптография и создадим программу для шифрования текстовой информации на основе полиалфавитного шифра.

Практическая значимость исследования: программа для шифрования текстовой информации позволит людям быстро и удобно шифровать текст для некоммерческого использования, исключительно для индивидуального развлечения и увлечения в тайнописи между людьми или группами людей.

ГЛАВА I ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ШИФРОВАНИЯ ТЕКСТОВОЙ ИНФОРМАЦИИ

1.1 ИСТОРИЯ РАЗВИТИЯ ШИФРОВАНИЯ ТЕКСТОВОЙ ИНФОРМАЦИИ.

Текстовая информация, как мы знаем, зародилась очень давно. История началась в Месопотамии, на берегах рек Тигр и Евфрат, обеспечивающих водой райский сад Эдем. Это была родина шумеров. Нам неизвестно, откуда они пришли и когда поселились на плодородном полумесяце, но в 3 тысячелетии до нашей эры в этой цивилизации зародилось самое великое достижение человечества — письмо [22].

Немногим позже такой способ передачи информации стали использовать древние египтяне, а к 2000 году до н.э. письмо появилось и в Китае. Сначала информация передавалась с помощью иероглифов, а в I тысячелетии до нашей эры финикийцы придумали алфавит [23].

С появлением письма у людей появилась потребность скрывать информацию от посторонних глаз.

Всю историю шифрования текстовой информации включает в себя криптография. Во всех источниках информации мы можем видеть историю шифрования текстовой информации как историю криптографии. Поэтому вместо использования фразы “шифрование текстовой информации” в основном заменяют на термин “криптография”. Но сейчас понятие слова криптография наиболее широко чем просто “шифрование текстовой информации”. Криптография – это наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним), целостности данных (невозможности незаметного изменения информации), аутентификации (проверки подлинности авторства или иных свойств объекта), а также невозможности отказа от авторства. Благодаря тому, что криптография зародилась почти сразу после появления письма, эта наука является одной из самых древнейших и её история насчитывает тысячи лет [2] и наряду с ней появляется так же криптоанализ. Криптоанализом является наука о методах дешифровки зашифрованной информации с помощью предназначенного ключа [15]. Криптография и криптоанализ развивались и эволюционировали вдвоём параллельно.

Криптография в своей истории развития разделяется на периоды, в каждом из которых господствуется свой собственный шифр.

Первый период начался примерно с третьего тысячелетия до нашей эры. Где-то в это же время началось развитие письменности. Способы тайного письма были известны уже древним цивилизациям Индии, Египта и Месопотамии. Автор таблички с рецептом для изготовления глазури для гончарных изделий из Месопотамии использовал редкие обозначения, пропускал буквы, а имена заменял на цифры, чтобы скрыть написанное. В Древнем Египте элементы криптографии были обнаружены уже в надписях Старого и Среднего царств, а целые шифрованные тексты известны с периода XVIII династии [8]. А в древнеиндийских текстах среди 64 искусств названы способы изменения текста, некоторые из которых можно отнести к криптографическим. Так же шифрование текстовой информации Индии можно заметить в иудейских книгах, в том числе в книге пророка Иеремии, где использовался такой шифр текстовой информации как Атбаш [14].

Известны так же ещё несколько шифров, которые образовались до нашей эры.

Этот шифр использовался в войне Спарты против Афин в конце V века до нашей эры.

Скитала представляла собой длинный стержень, на который наматывалась лента из пергамента. На ленту наносился текст вдоль оси скиталы, так, что после разматывания текст становился нечитаемым. Для его восстановления требовалась скитала такого же диаметра.

Считается, что автором способа взлома шифра скиталы является Аристотель, который наматывал ленту на конусообразную палку до тех пор, пока не появлялись читаемые куски текста [6].

Второй период начинается в разных континентах по-разному. Так на Ближнем Востоке хронологические рамки второго периода криптографии начинаются с XI века, а в Европе с XV. В этом периоде наибольшую популярность имеет полиалфавитный шифр. Полиалфавитный шифр — это совокупность моноалфавитных шифров [9].

Таким образом возникла потребность в создании более совершенного способа защиты информации, и на смену моноалфавитным шифрам пришли полиалфавитные. В шестидесятых годах XV века итальянский учёный и архитектор Леон Баттиста Альберти, стремясь получить устойчивый к частотному криптоанализу шифр, одним из первых начал применять вместо одного моноалфавитного шифра два или более, переходя от одного к другому по некоторому правилу. Его называют отцом западной криптографии [13].

В Европе тоже было проделано много работ разных учёных и математиков о криптографии во втором периоде её развития.

Самым известным криптографом XVI века можно назвать Блеза де Виженера. В своём трактате 1585 года он описал шифр, подобный шифру Тритемия, однако изменил систему выбора конкретного шифра замены для каждой буквы. Одной из предложенных техник было использование букв другого открытого текста для выбора ключа каждой буквы исходного текста. Описанный шифр известен как шифр Виженера и, при длине случайного ключа, равной длине открытого текста, является абсолютно стойким шифром, что было математически доказано много позже (в XX веке в работах Шеннона).

В начале XIX века с приходом к власти Александра I вся криптографическая деятельность переходит в ведение Канцелярии Министерства иностранных дел Российской империи. Одним из наиболее значимых достижений ведомства стало дешифрование приказов и переписки Наполеона I во время Отечественной войны 1812 года. Примечательно также, что с 1803 года на службе в Канцелярии находился выдающийся российский ученый Павел Львович Шиллинг, которому приписывается изобретение биграммных шифров [11].

В 1863 году Фридрих Касиски опубликовал метод, впоследствии названный его именем, позволявший быстро и эффективно вскрывать практически любые шифры того времени. Метод состоял из двух частей — определение периода шифра и дешифровка текста с использованием частотного криптоанализа.

В начале 1920-х годов практически одновременно в разных странах появляются патенты и электромеханические машины, использующие принципы криптографического диска (ротора) и автоматизирующие процесс шифрования.

На создании электромеханических машинах происходит переход к господству нового, более современного шифра, а значит и переход на третий период развития криптографии. В силу создания электрических устройств скорость развития науки увеличивается в разы, поэтому оставшиеся периоды развития имеют малые по сравнению с первыми двумя периодами хронологические рамки. Поэтому третий период длится всего с начала XX-го века по середину XX-века. Этот период ознаменован внедрением в работу криптографа электромеханических устройств, но полиалфавитный шифр по-прежнему использовался в частности.

Хоть этот период длился совсем не так уж и много времени, он охватывал очень важные события всего мира – это две мировые войны.

До Первой мировой войны Россия, наряду с Францией, являлась лидером в области криптоанализа на государственном уровне. Англия, США, Германия и менее влиятельные государства вообще не имели государственной дешифровальной службы, а Австро-Венгрия читала, в основном, переписку соседних государств.

Наиболее драматическим моментом в криптографии Франции был июнь 1918 года, когда было жизненно необходимо узнать направление немецкого наступления на Париж. Жорж Панвэн сумел за несколько напряжённых дней, вскрыть немецкий шифр ADFGVX. В результате Париж был спасён. Жорж похудел тогда на 15 килограмм.

А в Германии немцы читали радиопередачи русских войск, что в частности, обеспечило сокрушительную победу немцев над превосходящими силами русской армии в Битве при Танненберге. Генерал Людендорф в своём распоряжении все русские депеши за день [18].

После Первой мировой войны все правительства стран засекретили всю информацию о криптографической деятельности. В период после Первой мировой войны и до конца 1940-х годов были лишь незначительные статьи в публичном чтении.

В СССР производились оба типа машин.

СССР знали об этом парке, так же и узнали дешифрованные немецкие данные, благодаря которым русские узнали о реванше Гитлера нападении на Курск и успели подготовиться к битве.

С окончанием Второй мировой войны приходит конец и третьему периоду развития криптографии. Четвёртый период начинается сразу с конца третьего и знаменуется переходом к математической криптографии. Длится он до 70-ых годов XX-го века.

В 1960-х годах начали появляться различные блочные шифры, которые обладали большей криптостойкостью по сравнению с результатом работы роторных машин. Однако они предполагали обязательное использование цифровых электронных устройств — ручные или полумеханические способы шифрования уже не использовались.

После проведения ещё нескольких важных работ, выпущенных в открытой печати четвёртый период заканчивается и начинается пятый период – переход к современной криптографии. Этот период не заканчивается и идёт по сей день. Здесь преобладает современная криптография – криптография с открытым ключом. Её появление знаменуется не только новыми техническими возможностями, но и сравнительно широким распространением криптографии для использования частными лицами.

Современная криптография образует отдельное научное направление на стыке математики и информатики — работы в этой области публикуются в научных журналах, организуются регулярные конференции. Практическое применение криптографии стало неотъемлемой частью жизни современного общества — её используют в таких отраслях, как электронная коммерция, электронный документооборот (включая цифровые подписи), телекоммуникации и других [4].

1.2 МЕТОДЫ ШИФРОВАНИЯ ТЕКСТОВОЙ ИНФОРМАЦИИ

Всю историю жизни человека в обществе передача информации была самым необходимым аспектом для существования. Текстовая информация была одной из самых важных и используемых способов передачи информации.

Текстовая информация – вид передачи информации, представляемый с помощью последовательности данных [5]. За это время было придумано множество разных способов спрятать свою текстовую информацию от посторонних глаз.

Я бы хотел показать вам шифров из двух классов шифрования: моноалфавитный и полиалфавитный.

1. Моноалфавитный шифр – класс методов шифрования, в которых текст шифруется по особому правилу. В основном используется замена положений букв в алфавите или в таблице символов. Затем каждую букву текста смотрят по положению в алфавите и меняют на другую букву шифрованного алфавита в том же положении. Таким простым способом шифруется весь текст. К такому принципу работы относится программа ROT13, шифр Цезаря, Атбаш. Данный способ шифрования является очень простым и отлично реализуемым, но при этом данный шифр слишком слаб и неинтересен [16].

Шифр Цезаря представляет собой сдвиг положений букв в алфавите вправо на 3 позиции. То есть буква ‘A’ заменяется на букву ‘D’, ‘B’ на ‘E’, ’C’ на’F’ и т.д.

Программа ROT13 разделяет английский алфавит 26 букв на две половинки. Затем эти две половинки склеиваются друг с другом в таблицу так, чтобы первый символ первой половины был в одном столбике с первым символом второй половины и так далее. Таким образом ‘A’ заменяется на ‘N’, ‘B’ на ‘O’ и наоборот.

В шифре Атбаш просто первый символ алфавита заменяется на последний, второй на предпоследний и т.д [14].

2. Полиалфавитный представляет класс шифров, в которых шифрование символа чередуется последовательностью моноалфавитных шифров. На каждый символ в тексте приходится свой простой метод замены текста. Так перечисленные способы моноалфавитного шифрования можно чередовать в тексте. К полиалфавитным можно отнести очень интересный знаменитый шифр Виженера, в котором используется таблица (квадрат Виженера) и ключ – кодовое слово [15].

Шифр системы Виженера тоже является очень простым. Используется специальная таблица, состоящая из количества строк и столбцов, равных количеству символов алфавита. Внутри таблицы в строчку написан алфавит, но через каждую строчку он смещается вправо на 1 столбец. Нам остаётся придумать любой текст и любое кодовое слово, которое будет являться ключом шифрования. Затем сравниваются длины кодового слова и текста. Если длина кодового слова будет меньше размера текста, то он продлевается повторением кодового слова до размера длины. После этого находится символ в тексте по столбцам и символ кодового слова по строчкам на той же позиции. В данных координатах будет находится символ зашифрованного текста [3].

Читайте также: