Шифр Цезаря
Ограничение времени 1 секунда
Ограничение памяти 64Mb
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Как известно, Цезарь тоже пользовался шифрованием сообщений, причем у него был свой способ. Сначала выбирается шаг шифрования (число), а затем все буквы послания заменяются на буквы, отстоящие от них в алфавите на шаг шифрования. Например, при шаге шифрования 3 (таким чаще всего пользовался Цезарь), буква А заменяется на букву Г, буква Б – на букву Д.
Обратите внимание, что алфавит «зациклен», то есть при сдвиге буквы Я на шаг 3 получится буква В.
Напишите программу, которая будет зашифровывать послание с помощью шифра Цезаря с заданным шагом шифрования.
Формат ввода
Две строки. Первая содержит шаг шифрования, вторая – послание.
Формат вывода
Строка с зашифрованным посланием.
Пример 1
Ввод Вывод
3
АБВ
ГДЕ
Пример 2
Ввод Вывод
5
На дворе трава, на траве дрова!
Те йзухк чхезе, те чхезк йхузе!
Примечания
Символы русского алфавита расположены в стандартной для Python таблице кодировки подряд, то есть номера, выдаваемые функцией ord(symbol), идут подряд. Буква «ё» идёт в таблице кодировки отдельно от основного алфавита. При решении задачи считайте, что буквы «ё» в русском алфавите нет.
Есть код, но он не работает:
n = int(input() message = input() for i in message: if not i.isalpha(): print(i, end='') continue if ord(i) + n > 1071 and ord(i) 1071 or ord(i) + n > 1103 and ord(i) 1103: i = chr(ord(i) - 32) i = chr(ord(i) + n) print(i, end='')
Реализация шифра Цезаря
Напишите функцию encryptCaesar(msg, shift), которая кодирует сообщение шифром Цезаря. Шифр Цезаря заменяет каждую букву в тексте на букву, которая отстоит в алфавите на некоторое фиксированное число позиций.
В функцию передается сообщение и сдвиг алфавита. Если сдвиг не указан, то пусть ваша функция кодирует сдвиг алфавита на 3 позиции:
Все символы, кроме русских букв должны остаться неизменными. Маленькие буквы должны превращаться в маленькие, большие — в большие.
Напишите также функцию декодирования decryptCaesar(msg, shift), также использующую сдвиг по умолчанию. При написании функции декодирования используйте вашу функцию кодирования.
Пример
Ввод
Да здравствует салат Цезарь!
3
Вывод
Зг кзугефхецих фгогх Щикгуя!
Да здравствует салат Цезарь!
Реализация шифра DES на Python
Помогите исправить ошибки в коде, пожалуйста. class Des: import random .
Реализация шифра Цезаря — не могу записать в файл\из файла
Есть такая программа, найденная на просторах интернета Реализация шифра Цезаря # -*- coding.
Зашифровать послание с помощью шифра Цезаря с заданным шагом шифрования
Как известно, Цезарь тоже пользовался шифрованием сообщений, причем у него был свой способ. Сначала.
Реализация шифра гаммирования
Помогите разобраться) Нужно написать реализацию шифра гаммирования. Как я это себе представляю.
Сообщение было отмечено Pavlin234 как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
llst = ['а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'] blst = ['А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'] def encryptCaesar(msg, shift=3): ret = "" for x in msg: if x in llst: ind = llst.index(x) ret += llst[ind+shift] elif x in blst: ind = blst.index(x) ret += blst[ind+shift] else: ret += x return ret def decryptCaesar(msg, shift=3): ret = "" for x in msg: if x in llst: ind = llst.index(x) ret += llst[ind-shift] elif x in blst: ind = blst.index(x) ret += blst[ind-shift] else: ret += x return ret print(encryptCaesar("Да здравствует салат Цезарь!")) print(decryptCaesar("Зг кзугефхецих фгогх Щикгуя!"))
Ввод должен быть из двух частей:
Вводится print(encryptCaesar(«Да здравствует салат Цезарь!»))
А затем число shift! Оно может быть 3, 6, 73 и даже 0
Сообщение было отмечено Pavlin234 как решение
Решение
# в виде списка (ё\Ё по умолчанию нет) lower_cyrillic = [chr(i) for i in range(ord('а'), ord('я') + 1)] #lower_cyrillic.insert(6,'ё') upper_cyrillic = [chr(i) for i in range(ord('А'), ord('Я') + 1)] #upper_cyrillic.insert(6,'Ё') # или в виде строки (ё\Ё по умолчанию нет) lower_cyrillic = ''.join(map(chr, range(ord('а'), ord('я') + 1))) upper_cyrillic = ''.join(map(chr, range(ord('А'), ord('Я') + 1)))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
def alphabet(shift): return lower_cyrillic[shift:] + \ lower_cyrillic[:shift] + \ upper_cyrillic[shift:] + \ upper_cyrillic[:shift] def coding(typ="enc",shift=3): a1 = lower_cyrillic + upper_cyrillic a2 = alphabet(shift) t = { "enc":str.maketrans(a1,a2), "dec":str.maketrans(a2,a1) } return t[typ] print("Да здравствует салат Цезарь!".translate(coding("enc"))) print("Зг кзугефхецих фгогх Щикгуя!".translate(coding("dec"))) #Зг кзугефхецих фгогх Щикгуя! #Да здравствует салат Цезарь!
Garry Galler, главная проблема моего кода, все таки, то что к индексу прибавляются значения без всяких приверок и то, что он сработал это просто случайность.
В вашем варианте сделано красиво, но что работает только до сдвига 31.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
llst = ['а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'] blst = ['А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я'] def encryptCaesar(msg, shift): ret = "" for x in msg: if x in llst: ind = llst.index(x)%len(llst) ret += llst[(ind+shift)%len(llst)] elif x in blst: ind = blst.index(x)%len(llst) ret += blst[(ind+shift)%len(llst)] else: ret += x return ret def decryptCaesar(msg, shift): ret = "" for x in msg: if x in llst: ind = llst.index(x) ret += llst[ind-shift] elif x in blst: ind = blst.index(x) ret += blst[ind-shift] else: ret += x return ret #print(encryptCaesar("Да здравствует салат Цезарь!", 3)) #print(decryptCaesar("Зг кзугефхецих фгогх Щикгуя!", 3))
Спасибо, Garry Galler и Zedta
Сообщение от Zedta
При сдвиге на 32 (мощность алфавита) получаем исходный алфавит — тут все логично.
Чтобы работало и при сдвигах более 32 — можно изменить функцию создания алфавита на такую:
def alphabet(shift): shift = shift % len(lower_cyrillic) return lower_cyrillic[shift:] + \ lower_cyrillic[:shift] + \ upper_cyrillic[shift:] + \ upper_cyrillic[:shift]
print("Да здравствует салат Цезарь!".translate(coding("enc",35))) print("Зг кзугефхецих фгогх Щикгуя!".translate(coding("dec",35))) #Зг кзугефхецих фгогх Щикгуя! #Да здравствует салат Цезарь!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
count = 0 def encrypt_caesar(msg, shift=3): big_lett, small_lett = '', '' if (count != 0 and shift 0) or (count == 0 and shift >= 0): if shift 0: shift *= (-1) big_lett = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' small_lett = 'абвгдежзийклмнопрстуфхцчшщъыьэюя' elif count != 0 or (shift 0 and count == 0): if shift 0: shift *= (-1) big_lett = 'ЯЮЭЬЫЪЩШЧЦХФУТСРПОНМЛКЙИЗЖЕДГВБА' small_lett = 'яюэьыъщшчцхфутсрпонмлкйизжедгвба' mess, res, alph = list(msg), [], ' ' for el in mess: if not el.isalpha(): res.append(el) else: if el.isupper(): alph = big_lett elif el.islower(): alph = small_lett new_ind = alph.index(el) + shift if shift > 32: a = (32 * (new_ind // 32)) res.append(alph[new_ind - (32 * (new_ind // 32))]) else: if new_ind > 31: res.append(alph[new_ind - 32]) else: res.append(alph[new_ind]) return ''.join(res) def decrypt_caesar(msg, shift=3): global count count = 1 return encrypt_caesar(msg, shift)
Абсолютно долбанутое решение, но работает с любым shift и проходит любые тесты. Наслаждайтесь, если можно так выразиться )))
def encrypt_caesar(msg, shift=3):
small_symbols1 = «абвгдежзийклмнопрстуфхцчшщъыьэюя»
big_symbols1 = «АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ»
shift = shift % len(small_symbols1)
small_symbols2 = small_symbols1[shift:] + small_symbols1[:shift]
big_symbols2 = big_symbols1[shift:] + big_symbols1[:shift]
translation = msg.maketrans(small_symbols1 + big_symbols1, small_symbols2 + big_symbols2)
return msg.translate(translation)
def decrypt_caesar(msg, shift=3):
return encrypt_caesar(msg, -1 * shift)
Добавлено через 36 секунд
1 2 3 4 5 6 7 8 9 10 11 12
def encrypt_caesar(msg, shift=3): small_symbols1 = "абвгдежзийклмнопрстуфхцчшщъыьэюя" big_symbols1 = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" shift = shift % len(small_symbols1) small_symbols2 = small_symbols1[shift:] + small_symbols1[:shift] big_symbols2 = big_symbols1[shift:] + big_symbols1[:shift] translation = msg.maketrans(small_symbols1 + big_symbols1, small_symbols2 + big_symbols2) return msg.translate(translation) def decrypt_caesar(msg, shift=3): return encrypt_caesar(msg, -1 * shift)
Python. Задача про Цезаря
в классическом алгоритме Юлия Цезаря каждый символ исходного секретного сообщения заменяется символом из того же алфавита, отстоящим на три позиции далее. Например, для русского алфавита буква А будет заменена на букву Г,Б-на Д и т.д.
Данный алгоритм относится к алгоритмам замены. Символ «.» в конце строчки означает признак завершения шифрования.
Например, если исходный текст был таким:
Zb Ra Cx Dyk., то результат шифрования должен быть следующий:
Ce Ud Fa Gbn.
Реализовать алгоритм Юлия Цезаря на языке Python для букв русского и английского алфавита.
Программу написать коментируя каждую строчку.
bukvi = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ’ # алфавит
soobhenie = input(«Сообщение для шифровки >> «).upper() # ввод сообщения
shifr = » # наш шифр
for i in soobhenie: # занимаемся преобразованием введенного нами сообщения
mesto = bukvi.find(i)
new_mesto = mesto + 3
if i in bukvi:
shifr = shifr + bukvi[new_mesto]
else:
shifr = shifr + i
print(shifr) # выводим полученный шифр
У шифра Цезаря логика не хитрая.
def caesar_cipher(string, user_step):
char_list = [(letters[(letters.index(sym) + user_step) % len(letters)]
if sym in letters else ‘ ‘)
for sym in string]
new_str = »
for i_char in char_list:
new_str += i_char
return new_str
letters = ‘абвгдеёжзийклмнопрстуфхцчшщъыьэюя’
word = input(‘Введите сообщение: ‘)
step = int(input(‘Введите сдвиг: ‘))
output_str = caesar_cipher(word, step)
print(‘Зашифрованная строка: ‘, output_str)