Python шифр цезаря код

Шифр Цезаря в Python – руководство по шифрованию

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

Вступление

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

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

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

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

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

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

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

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

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

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

Читайте также:  Java web start launcher это

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

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

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

def encypt_func(txt, s): result = "" # transverse the plain txt for i in range(len(txt)): char = txt[i] # encypt_func uppercase characters in plain txt if(char.isupper()): result += chr((ord(char) + s - 64) % 26 + 65) # encypt_func lowercase characters in plain txt else: result += chr((ord(char) + s - 96) % 26 + 97) return result # check the above function txt = "CEASER CIPHER EXAMPLE" s = 4 print("Plain txt : " + txt) print("Shift pattern : " + str(s)) print("Cipher: " + encypt_func(txt, s))
Plain txt : CEASER CIPHER EXAMPLE Shift pattern : 4 Cipher: HJFXJWsHNUMJWsJCFRUQJ

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

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

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

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

msg = 'rGMTLIVrHIQSGIEWIVGIEWIV' #encrypted msg LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for k in range(len(LETTERS)): transformation = '' for s in msg: if s in LETTERS: n = LETTERS.find(s) n = n - k if n < 0: n = n + len(LETTERS) transformation = transformation + LETTERS[n] else: transformation = transformation + s print('Hacking k #%s: %s' %(k, transformation))
Hacking k #25: rHNUMJWrIJRTHJFXJWHJFXJW

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

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

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

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

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

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

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

def split_len(sequence, length): return [sequence[i:i + length] for i in range(0, len(sequence), length)] def encode(k, plaintxt): order = < int(val): n for n, val in enumerate(k) >ciphertext = '' for index in sorted(order.ks()): for part in split_len(plaintxt, len(k)): try:ciphertext += part[order[index]] except IndexError: continue return ciphertext print(encode('3214', 'HELLO'))

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

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

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

Источник

Шифрование сообщений в 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, а пока я предлагаю вам написать в комментариях варианты модернизации программы(код или просо предложения и пожелания). Я обязательно учту ваше мнение.

Источник

Оцените статью