Как сделать шифратор на питоне

Добавил пользователь Алексей Ф.
Обновлено: 10.09.2024

Создать программу, которая запрашивает у пользователя произвольную строку символов.
Далее программа ее шифрует и выводит на экран в зашифрованном виде. Шифрование происходит путем замены каждого символа символом, который находится на 5 позиций правее в предопределенной таблице шифрования.
Таблица шифрования задается программистом в виде одномерного списка символов латинского алфавита от a до z . Если при выборе символа для шифровки таблица шифрования заканчивается, то циклически переходить к ее началу.
Отсутствующие в таблице шифрования символы, записываются в результирующую строку без изменений. Регистр игнорируется.
Таблица шифрования (a,b,c,d. x,y,z,0,1,2,3,4,5,6,7,8,9) .
Например: Исходная строка, которую ввел пользователь: 'secret' , 'Office 365' Зашифрованная строка, которую выдала программа: 'xjhwjy' , 'tkknhj 8ba'
Примечание: т.н. таблица шифрования может быть представлена как строка или список.

Не мог понять как заставить python учитывать пробелы, но не менять их.

2 ответа 2

То, что в вопросе описано называется Шифром Цезаря:

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

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

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

На приведенной ниже блок-схеме показано, как мы можем добиться этого для безопасного хранения паролей в нашем приложении!

Hash функция

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

Изучив концепцию, давайте теперь посмотрим на использование этого модуля!

Хэш-библиотека Python

Нам нужно импортировать этот модуль, который поставляется непосредственно с установкой Python.

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

Атрибут algorithms_available выводит на печать каждый алгоритм, используемый в системе, включая другие программы, такие как ssh и OpenSSL .

Атрибут algorithms_guaranteed перечисляет все алгоритмы в модуле.

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

А теперь перейдем к шифрованию строк.

Шифрование строк с использованием хэш-библиотеки Python

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

В этой статье мы будем использовать алгоритм SHA-256, который дает хэш 256 бит.

Метод message.update() НЕ работает для небайтовых строк, поэтому вам нужно закодировать его с помощью string.encode() , если вы не передаете его напрямую.

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

Теперь вы можете распространить это на другие алгоритмы хеширования, которые приведены в документации.

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

Прежде чем приступить к выполнению работы

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

При выполнении работ мы будем придерживаться простого подхода к ветвлению под названием GitHub flow (есть и другие подходы, например, gitflow). Приступая к новой практической работе создавайте ветку с именем этой работы:

Чтобы отобразить список локальных веток можно воспользоваться командой git branch :

Символ * указывает на какой ветке вы находитесь. Для переключения между ветками используйте команду git checkout имя_ветки .

Шифр Цезаря

Сдвиг трёх последних букв алфавита:

Используя шифр Цезаря, слово PYTHON будет закодировано следующим образом:

Вам необходимо написать тело для следующих двух функций в файле caesar.py :

Воспользуйтесь встроенными функциями ord() и chr() . Функция ord() позволяет получить код указанного символа, а chr() работает наоборот - возвращает символ по его коду.

О кодировках можно почитать тут и тут.

Проверить работу функций можно с помощью примеров, приведенных в доктестах (текст внутри функции, который заключен в тройные кавычки и похож на работу с интерпретатором в интерактивном режиме). Запустить доктесты можно с помощью следующей команды (при условии, что файл с программой называется caesar.py ):

Доктесты обычно играют роль примеров и не используются в качестве полноценного фреймворка для автоматического тестирования. Поэтому мы будем использовать стандартную библиотеку unittest для тестирования наших приложений (наиболее популярной альтернативой является pytest). Для запуска тестов можно воспользоваться следующей командой:

или для запуска всех тестов:

Также обратите свое внимание на официальное руководство по стилю pep8 (некоторые пояснения по оформлению кода можно найти здесь).

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

Вы можете воспользоваться приложением Source Tree для наглядного отслеживания вносимых изменений.

Также не забывайте периодически отправлять ваши изменения на сервер:

Шифр Виженера

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

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

RSA шифрование

Одним из современных методов шифрования является алгоритм шифрования RSA, названный так по первым буквам фамилий его авторов (Rivest, Shamir и Adleman).

Мы не будем вдаваться в подробности работы этого алгоритма, но следующего объяснения должно быть достаточно для понимания принципов шифрования с открытым ключом:

Show your kid a padlock. This is a kind of lock that locks when you click it (i.e it doesn't require a key) but requires the key to open the lock.

So, I can send these padlocks to all my friends who want to communicate with me. I will send them only the lock but will keep the key with me.

My friends can write me messages, put it in a box, lock it with my padlock (by clicking it) and send it to me, even over high risk networks. If the box is intercepted, it's contents will not be compromised since I still have the key with me.

When the box reaches me, I can open my padlock with my key and read the contents. This way, I can send padlocks (public keys) to people outside which they can use to lock boxes (encrypt messages) without being in danger of the contents being compromised as the padlock key (the private key) is always with me and never exchanged over the network.

Работу алгоритма можно разбить на три шага:

  1. Генерация ключей
  2. Шифрование
  3. Расшифровка

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

Если вы закончили работу над функцией is_prime(n) , то запустите тесты и сделайте коммит:

Для фиксации изменений мы использовали команду git commit -am , которая является аналогом последовательности команд git add . и git commit -m .

После того как были выбраны два простых числа требуется найти их произведение n = p * q :

Затем вычисляется функция Эйлера по формуе:

Далее выбирается число e , отвечающее следующим критериям:

Определить, являются ли числа взаимно простыми можно с помощью алгоритма Евклида. Для этого необходимо вычислить наибольший общий делитель (НОД) и проверить равен ли он единице. На этом этапе вашей задачей является реализация данного алгоритма:

Не забудьте зафиксировать реализацию функции gcd(a, b) :

Заключительным этапом на шаге генерации ключей является вычисление d такого что d * e mod phi = 1 . Для его вычисления используется расширенный (обобщенный) алгоритм Евклида (см. стр. 23 этого учебного пособия с подробными объяснениями).

Таким образом, полученные пары (e,n) и (d,n) являются открытым и закрытым ключами соответственно.

Снова запустите тесты и зафиксируйте изменения:

После выполнения всех заданий

После выполнения всех заданий отправьте изменения на сервер:

Затем создайте пул-реквест либо с поммощью веб-формы, либо с помощью gh, как это было описано в предыдущей работе. Не забудьте проверить, что нет ошибок при выполнении шагов на вкладке Checks . Сообщите Коннору, что вы готовы к код ревью:


Если ваш пул-реквест был одобрен, то примените изменения к мастер-ветке ( Merge pull request ), удалите ветку homework01 как в репозитории так и локально:

DES - это симметричный алгоритм шифрования [то есть отправитель и получатель имеют один и тот же ключ]. Его основной принцип состоит в том, чтобы разделить данные, подлежащие шифрованию, на n 64-битных блоков, а затем использовать 56-битный ключ для шифрования один за другим. Для каждого 64-битного блока получите n 64-битных блоков зашифрованного текста и, наконец, объедините блоки зашифрованного текста, чтобы получить окончательный зашифрованный текст.

шифрование

Процесс шифрования

Процесс шифрования DES получает поле открытого текста и 64-битный ключ, и строка открытого текста будет преобразована в каждый 64-битный блок. Процесс шифрования осуществляется в единицах блока, подвергается преобразованию начального состояния, 16 раундов циклического шифрования и преобразованию конечного состояния. В конце каждый 64-битный блок будет зашифрован в 64-битный блок зашифрованного текста, а полученный блок зашифрованного текста будет объединен для получения окончательного зашифрованного результата.


1. Обработка текстовых данных processing_encode_input

Во-первых, необходимо преобразовать открытый текст строки в двоичный и разделить его на группы по 64 бита.Если не хватает 64 бита, добавьте нули.

2. Переход начального состояния

Преобразование начального состояния заключается в изменении порядка начальных 64-битных блоков в соответствии с правилами [Таблица подстановки IP].

3. 16 раундов итерации циклического шифрования.


Процесс каждого раунда циклического шифрования:

  1. Разделите 64-битный блок, полученный после замены начального состояния или последнего цикла, на левый и правый 32-битные подблоки Left и Right
  2. Right преобразуется функцией f для получения 32-битной строки, эта строка подвергается операции XOR с Left, чтобы получить Right следующего раунда
  3. Используйте право в этом раунде исходного видения как левое в следующем раунде
  4. Склейка левого окна вправо для перехода к следующему раунду
  • После последнего раунда шифрования левое поле и правое поле меняются местами, поэтому измените его перед выполнением замены окончательного состояния.

3.1 функция f


Функция f состоит из трех частей:

  1. Расширенная замена
  2. Замена S-бокса
  3. Замена коробки P
3.1.1 Расширенная замена

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

Тогда после второго небольшого расширения

3.1.2 Замена S-бокса


Замена S-бокса состоит из двух этапов:

Ключ k e y i _i k e y i Усиление


Ключевое преобразованиеЦель состоит в том, чтобы преобразовать 64-битный исходный ключ в 56-битный ключ и выполнить замену

Следующая таблица является ключевой таблицей преобразования.

Выбор замены: После поворота ключа выполняется склейка 56-битной строки, и 48 бит могут быть выбраны в качестве окончательного варианта замены. k e y