Шифр Цезаря - это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом вправо на 3, А была бы заменена на Г, Б станет Д, и так далее. Величину сдвига можно рассматривать как ключ шифрования.
Это один из самых простых и наиболее широко известных методов шифрования. При этом шифр считается крайне неэффективным.
Шифр Цезаря может быть легко взломан даже в случае, когда взломщик знает только зашифрованный текст. Можно рассмотреть две ситуации:
- Взломщик знает (или предполагает), что использовался простой шифр подстановки, но не знает, что это - схема Цезаря.
- Взломщик знает, что использовался шифр Цезаря, но не знает значение сдвига.
В первом случае шифр может быть взломан, используя те же самые методы что и для простого шифра подстановки, такие как частотный анализ и т. д. Используя эти методы, взломщик, вероятно, быстро заметит регулярность в решении и поймёт, что используемый шифр - это шифр Цезаря.
Распределение букв в типичном образце текста на английском языке имеет характерный и предсказуемый вид. Шифр Цезаря «поворачивает» это распределение, и возможно определить сдвиг, проверяя график частотностей для каждого из возможных сдвигов.
Ниже представлен небольшой скрипт с подробными комментариями.
Реализация скрипта на языке Python
def encrypt(text, shift):
result = ""
for char in text:
if char.isalpha():
ascii_offset = ord('a') if char.islower() else ord('A')
encrypted_char = chr((ord(char) - ascii_offset + shift) % 26 + ascii_offset)
result += encrypted_char
else:
result += char
return result
text = input("Введите текст на английском. Текст не должен содержать цифры и знаки препинания: ")
# Проверяем, что введенный текст содержит только английские символы и пробелы
while not all(char.isalpha() or char.isspace() for char in text):
text = input("Введен некорректный текст. Введите текст на английском: ")
shift = input("Введите смещение (целое число): ")
# Проверяем, что введенное смещение - целое число
while not shift.isdigit():
shift = input("Введен некорректный сдвиг. Введите целое число: ")
shift = int(shift)
encrypted_text = encrypt(text, shift)
print(f"Зашифрованный текст: {encrypted_text}")
Ниже представлен небольшой скрипт с подробными комментариями.
Реализация скрипта на языке Ruby
# Текст и количество символов, на которое сдвигаем
def encrypt(text, shift)
result = ""
text.each_char do |char|
if char.match?(/[[:alpha:]]/)
ascii_offset = char.downcase == char ? 'a'.ord : 'A'.ord
encrypted_char = ((char.ord - ascii_offset + shift) % 26 + ascii_offset).chr
result += encrypted_char
else
result += char
end
end
result
end
puts "Введите текст на английском. Текст не должен содержать цифры и знаки препинания:"
text = gets.chomp
# Буквы и пробелы с помощью регулярного выражения!
until text.match?(/\A[[:alpha:] ]+\z/)
puts "Введен некорректный текст. Введите текст на английском:"
text = gets.chomp
end
puts "Введите смещение (целое число):"
shift = gets.chomp
until shift.match?(/\A\d+\z/)
puts "Введен некорректный сдвиг. Введите целое число:"
shift = gets.chomp
end
shift = shift.to_i
encrypted_text = encrypt(text, shift)
puts "Зашифрованный текст: #{encrypted_text}"