- Шифрование сообщений в Python. От простого к сложному. Шифр Цезаря
- Шифр Цезаря
- Что это такое?
- Какими особенностями он обладает?
- Программная реализация
- Дешифровка сообщения
- Итоговый вид программы
- Итог
- Шифровать строку Python
- Используйте Simple Crypt для шифрования строки в Python
- Используйте библиотеку cryptocode для шифрования строки в Python
- Используйте пакет Cryptography для шифрования строки в Python
- Используйте алгоритм RSA для шифрования строки в Python
- Сопутствующая статья — Python String
Шифрование сообщений в Python. От простого к сложному. Шифр Цезаря
Мне, лично, давно была интересна тема шифрования информации, однако, каждый раз погрузившись в эту тему, я осознавал насколько это сложно и понял, что лучше начать с чего-то более простого. Я, лично, планирую написать некоторое количество статей на эту тему, в которых я покажу вам различные алгоритмы шифрования и их реализацию в Python, продемонстрирую и разберу свой проект, созданный в этом направлении. Итак, начнем.
Для начала, я бы хотел рассказать вам какие уже известные алгоритмы мы рассмотрим, в моих статьях. Список вам представлен ниже:
- Шифр Цезаря
- Шифр Виженера
- Шифр замены
- Омофонический шифр
- RSA шифрование
Шифр Цезаря
Итак, после небольшого введения в цикл, я предлагаю все-таки перейти к основной теме сегодняшней статьи, а именно к Шифру Цезаря.
Что это такое?
Шифр Цезаря — это простой тип подстановочного шифра, где каждая буква обычного текста заменяется буквой с фиксированным числом позиций вниз по алфавиту. Принцип его действия можно увидеть в следующей иллюстрации:
Какими особенностями он обладает?
У Шифра Цезаря, как у алгоритма шифрования, я могу выделить две основные особенности. Первая особенность — это простота и доступность метода шифрования, который, возможно поможет вам погрузится в эту тему, вторая особенность — это, собственно говоря, сам метод шифрования.
Программная реализация
В интернете существует огромное множество уроков, связанных с криптографией в питоне, однако, я написал максимально простой и интуитивно понятный код, структуру которого я вам продемонстрирую.
Начнем, пожалуй, с создания алфавита. Для этого вы можете скопировать приведенную ниже строку или написать все руками.
alfavit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' # Создаем алфавит
Далее, нам нужно обозначить программе шаг, то есть смещение при шифровании. Так, например, если мы напишем букву «а» в сообщении, тот при шаге «2», программа выведет нам букву «в».
Итак, создаем переменную smeshenie, которая будет вручную задаваться пользователем, и message, куда будет помещаться наше сообщение, и, с помощью метода upper(), возводим все символы в нашем сообщении в верхний регистр, чтобы у нас не было ошибок. Потом создаем просто пустую переменную itog, куда мы буем выводить зашифрованное сообщение. Для этого пишем следующее:
smeshenie = int(input('Шаг шифровки: ')) #Создаем переменную с шагом шифровки message = input("Сообщение для шифровки: ").upper() #создаем переменнную, куда запишем наше сообщение itog = '' #создаем переменную для вывода итогового сообщения
Итак, теперь переходим к самому алгоритму шифровки. Первым делом создаем цикл for , где мы определим место букв, задействованных в сообщении, в нашем списке alfavit, после чего определяем их новые места (далее я постараюсь насытить код с пояснениями):
for i in message: mesto = alfavit.find(i) #Вычисляем места символов в списке new_mesto = mesto + smeshenie #Сдвигаем символы на указанный в переменной smeshenie шаг
Далее, мы создаем внутри нашего цикла условие if , в нем мы записываем в список itog мы записываем наше сообщение уже в зашифрованном виде и выводим его:
for i in message: mesto = alfavit.find(i) new_mesto = mesto + smeshenie if i in alfavit: itog += alfavit[new_mesto] # Задаем значения в итог else: itog += i print (itog)
Модернизация
Вот мы и написали программу, однако она имеет очень большой недостаток: «При использовании последних букв(русских), программа выведет вам английские буквы. Давайте это исправим.
Для начала создадим переменную lang, в которой будем задавать язык нашего шифра, а так же разделим английский и русский алфавиты.
alfavit_EU = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ' alfavit_RU = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' smeshenie = int(input('Шаг шифровки: ')) message = input("Сообщение для шифровки: ").upper() itog = '' lang = input('Выберите язык RU/EU: ') #Добавляем возможность выбора языка
Теперь нам надо создать условие, которое проверит выбранный язык и применит его, то есть обратится к нужному нам алфавиту. Для этого пишем само условие и добавляем алгоритм шифрования, с помощью которого будет выполнено шифрование:
if lang == 'RU': for i in message: mesto = alfavit_RU.find(i) # Алгоритм для шифрования сообщения на русском new_mesto = mesto + smeshenie if i in alfavit_RU: itog += alfavit_RU[new_mesto] else: itog += i else: for i in message: mesto = alfavit_EU.find(i) # Алгоритм для шифрования сообщения на английском new_mesto = mesto + smeshenie if i in alfavit_EU: itog += alfavit_EU[new_mesto] else: itog += i
Дешифровка сообщения
Возможно это прозвучит несколько смешно, но мы смогли только зашифровать сообщение, а насчет его дешифровки мы особо не задумывались, но теперь дело дошло и до неё.
По сути, дешифровка — это алгоритм обратный шифровке. Давайте немного переделаем наш код (итоговый вид вы можете увидеть выше).
Для начала, я предлагаю сделать «косметическую» часть нашей переделки. Для этого перемещаемся в самое начало кода:
alfavit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' smeshenie = int(input('Шаг шифровки: ')) message = input("Сообщение для ДЕшифровки: ").upper() #заменяем слово шифровка, на дешифровка itog = ''
Остальное можно оставить так же, но если у вас есть желание, то можете поменять названия переменных.
По большому счету, самые ‘большие’ изменения у нас произойдут в той части кода, где у нас находится алгоритм, где нам нужно просто поменять знак «+» на знак «-«. Итак, переходим к самому циклу:
if lang == 'RU': for i in message: mesto = alfavit_RU.find(i) new_mesto = mesto + smeshenie # Меняем знак + на знак - if i in alfavit_RU: itog += alfavit_RU[new_mesto] else: itog += i else: for i in message: mesto = alfavit_EU.find(i) # Меняем знак + на знак - new_mesto = mesto + smeshenie if i in alfavit_EU: itog += alfavit_EU[new_mesto] else: itog += i
Итоговый вид программы
Итак, вот мы и написали простейшую программу для шифрования методом Цезаря. Ниже я размещу общий вид программы без моих комментариев, чтобы вы еще раз смогли сравнить свою программу с моей:
alfavit_EU = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ' alfavit_RU = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' smeshenie = int(input('Шаг шифровки: ')) message = input("Сообщение для ДЕшифровки: ").upper() itog = '' lang = input('Выберите язык RU/EU: ') if lang == 'RU': for i in message: mesto = alfavit_RU.find(i) new_mesto = mesto + smeshenie if i in alfavit_RU: itog += alfavit_RU[new_mesto] else: itog += i else: for i in message: mesto = alfavit_EU.find(i) new_mesto = mesto + smeshenie if i in alfavit_EU: itog += alfavit_EU[new_mesto] else: itog += i print (itog)
Итог
Вы успешно написали алгоритм шифровки и дешифровки сообщения на Python с помощью метода Цезаря. В следующей статье мы с вами рассмотрим Шифр Виженера, а также разберем его реализацию на Python, а пока я предлагаю вам написать в комментариях варианты модернизации программы(код или просо предложения и пожелания). Я обязательно учту ваше мнение.
Шифровать строку Python
- Используйте Simple Crypt для шифрования строки в Python
- Используйте библиотеку cryptocode для шифрования строки в Python
- Используйте пакет Cryptography для шифрования строки в Python
- Используйте алгоритм RSA для шифрования строки в Python
Шифрование можно определить как процесс преобразования обычного текста в зашифрованный текст. По сути, он используется для кодирования данных. Для процесса шифрования требуется ключ, который позже можно использовать для расшифровки исходного сообщения.
В этой статье будут обсуждаться различные методы, которые вы можете использовать для шифрования строки в Python.
Используйте Simple Crypt для шифрования строки в Python
Использование модуля Simple Crypt — это самый быстрый и простой способ добиться процесса шифрования для Python 2.7 и 3. Этот метод преобразует открытый текст в зашифрованный текст за секунды с помощью одной строчки кода.
Модуль PyCrypto предоставляет реализацию алгоритма для этой библиотеки и использует шифр AES256 . Этот метод включает проверку HMAC с помощью шифра SHA256 для уведомления об изменении или модификации зашифрованного текста.
Simple Crypt имеет две функции: encrypt и decrypt . Чтобы использовать обе эти функции, необходимо установить модули pycrypto и simplecrypt.
Следующий код использует simplecrypt для шифрования строки в Python:
from simplecrypt import encrypt, decrypt passkey = 'wow' str1 = 'I am okay' cipher = encrypt(passkey, str1) print(cipher)
Результатом этого кода будет кластер случайных букв.
Для декодирования / дешифрования зашифрованного текста мы будем использовать следующую команду:
Используйте библиотеку cryptocode для шифрования строки в Python
Термин cryptocode — это простая библиотека, которая позволяет нам безопасно и просто шифровать и расшифровывать строки в Python 3 или выше. Помните, что эту библиотеку необходимо установить вручную; это можно сделать с помощью команды pip .
Программа ниже использует библиотеку cryptocode для шифрования строки в Python:
import cryptocode str_encoded = cryptocode.encrypt("I am okay","wow") ## And then to decode it: str_decoded = cryptocode.decrypt(str_encoded, "wow") print(str_decoded)
Первым параметром функции будет строка, которую необходимо зашифровать. Второй параметр должен быть ключом, который будет использоваться для расшифровки.
Используйте пакет Cryptography для шифрования строки в Python
Cryptography — это пакет Python, который можно использовать для шифрования с симметричным ключом. Шифрование с симметричным ключом — это способ использования одного и того же ключа для процесса кодирования и декодирования.
Для использования этого метода шифрования необходимо установить библиотеку Cryptography ; это можно сделать с помощью команды pip .
Следующий код использует функции пакета cryptography для шифрования строки в Python:
from cryptography.fernet import Fernet str1 = "I am okay" key = Fernet.generate_key() fernet = Fernet(key) enctex = fernet.encrypt(str1.encode()) dectex = fernet.decrypt(enctex).decode() print("The primordial string: ", str1) print("The Encrypted message: ", enctex) print("The Decrypted message: ", dectex)
The primordial string: I am okay The Encrypted message: The Decrypted message: I am okay
В приведенном выше коде мы импортируем Fernet из модуля cryptography.fernet . Затем мы генерируем ключ шифрования, который будет использоваться как для кодирования, так и для целей декодирования. Экземпляр класса Fernet создается с ключом шифрования. Затем строка шифруется экземпляром Fernet. Наконец, он расшифровывается с помощью экземпляра класса Fernet.
Шифрование с симметричным ключом — это простой способ шифрования строки. Единственный недостаток в том, что он сравнительно менее безопасен. Любой, у кого есть ключ, может прочитать зашифрованный текст.
Используйте алгоритм RSA для шифрования строки в Python
Алгоритм RSA в Python реализует шифрование с асимметричным ключом. Шифрование с асимметричным ключом использует два разных ключа для процесса шифрования и дешифрования.
Эти два ключа — Закрытый ключ и Открытый ключ. Открытый ключ является открытым и используется в процессе шифрования. Любой, у кого есть открытый ключ, может зашифровать и отправить данные; закрытый ключ есть только у получателя. Кроме того, кто-то, имеющий к нему доступ, также может расшифровать данные.
Для использования этого метода сначала необходимо установить библиотеку rsa . Вы можете использовать общую команду pip для установки этой библиотеки.
Следующий код использует алгоритм RSA для шифрования строки в Python:
import rsa pubkey, privkey = rsa.newkeys(512) str1 = "I am okay" enctex = rsa.encrypt(str1.encode(),pubkey) dectex = rsa.decrypt(enctex, privkey).decode() print("The primordial string: ", str1) print("The Encrypted message: ", enctex) print("The Decrypted message: ", dectex)
The primordial string: I am okay The Encrypted message: The Decrypted message: I am okay
В приведенном выше коде импортируется модуль rsa , а открытый и закрытый ключи генерируются с помощью функции rsa.newkeys() . Затем строка шифруется с помощью открытого ключа. Затем строку можно расшифровать, используя только закрытый ключ. Открытый и закрытый ключи в этой программе — pubkey и privkey соответственно.
Шифрование с асимметричным ключом обеспечивает лучшую безопасность, чем шифрование с симметричным ключом. Как и в первом случае, конкретный закрытый ключ доступен только получателю и используется для дешифрования. В то время как в последнем существует только один ключ, что делает процесс дешифрования более простым и менее защищенным от атак третьих лиц в середине между отправителем и получателем.
Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.