logo

Шифр Цезаря в криптографії

  • Шифр Цезаря — це проста техніка шифрування, яку Юлій Цезар використовував для надсилання секретних повідомлень своїм союзникам. Він працює шляхом зміщення літер у текстовому повідомленні на певну кількість позицій, відомих як зсув або клавіша.
  • Техніка шифру Цезаря є одним із найперших і найпростіших методів техніки шифрування. Це просто тип шифру підстановки, тобто кожна літера певного тексту замінюється літерою з фіксованою кількістю позицій у алфавіті. Наприклад, зі зсувом на 1 A буде замінено на B, B стане C і так далі. Метод, очевидно, названий на честь Юлія Цезаря, який, очевидно, використовував його для спілкування зі своїми чиновниками.
  • Таким чином, щоб зашифрувати даний текст, нам потрібне ціле число, відоме як зсув, яке вказує на кількість позицій, на яку кожна літера тексту була переміщена вниз.
    Шифрування можна представити за допомогою модульної арифметики, спочатку перетворивши літери в числа за схемою A = 0, B = 1,…, Z = 25. Шифрування літери зсувом n можна описати математично як.
  • Наприклад, якщо зсув дорівнює 3, то буква A буде замінена літерою D, B стане E, C стане F і так далі. Алфавіт обертається так, що після Z починається знову з A.
  • Ось приклад використання шифру Цезаря для шифрування повідомлення HELLO зі зсувом 3:
  1. Запишіть повідомлення відкритим текстом: HELLO
  2. Виберіть значення зсуву. У цьому випадку ми будемо використовувати зсув 3.
  3. Замініть кожну літеру в текстовому повідомленні літерою, яка займає три позиції праворуч в алфавіті.

H стає K (зсув 3 від H)

E стає H (зсув 3 з E)



L стає O (зміщення 3 з L)

постпорядковий обхід бінарного дерева

L стає O (зміщення 3 з L)

O стає R (зміщення 3 з O)



4. Зашифроване повідомлення тепер KHOOR.

  • Щоб розшифрувати повідомлення, потрібно просто зрушити кожну літеру назад на таку ж кількість позицій. У цьому випадку ви б змістили кожну літеру в KHOOR назад на 3 позиції, щоб отримати вихідне повідомлення, HELLO.


E_n(x)=(x+n)mod 26
(Фаза шифрування зі зсувом n)

машинописний перемикач

D_n(x)=(x-n)mod 26
(Фаза дешифрування зі зсувом n)



Шифр Цезаря 3

Приклади:

 Text : ABCDEFGHIJKLMNOPQRSTUVWXYZ Shift : 23 Cipher : XYZABCDEFGHIJKLMNOPQRSTUVW Text : ATTACKATONCE Shift : 4 Cipher : EXXEGOEXSRGI>

Переваги:

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

Недоліки:

  • Він не захищений від сучасних методів дешифрування.
  • Вразливий до атак із відкритим текстом, коли зловмисник має доступ як до зашифрованих, так і до незашифрованих версій тих самих повідомлень.
  • Невелика кількість можливих ключів означає, що зловмисник може легко спробувати всі можливі ключі, доки не буде знайдено правильний, що робить його вразливим до атаки грубою силою.
  • Він не підходить для шифрування довгого тексту, оскільки його легко зламати.
  • Він не підходить для безпечного зв’язку, оскільки його легко зламати.
  • Не забезпечує конфіденційності, цілісності та автентичності в повідомленні.

Особливості шифру Цезаря:

  1. Шифр заміщення: шифр Цезаря — це тип шифру заміщення, де кожна літера у відкритому тексті замінюється літерою певної фіксованої кількості позицій нижче в алфавіті.
  2. Фіксований ключ: у шифрі Цезаря використовується фіксований ключ, який є кількістю позицій, на які зсуваються літери. Цей ключ відомий як відправнику, так і одержувачу.
  3. Симетричне шифрування: шифр Цезаря — це техніка симетричного шифрування, яка означає, що один і той же ключ використовується як для шифрування, так і для дешифрування.
  4. Обмежений простір ключів: шифр Цезаря має дуже обмежений простір ключів лише з 26 можливих ключів, оскільки в англійському алфавіті лише 26 літер.
  5. Вразливість до атак грубої сили: шифр Цезаря вразливий до атак грубої сили, оскільки існує лише 26 можливих ключів для спроби.
  6. Простота впровадження: шифр Цезаря дуже простий у застосуванні та вимагає лише простих арифметичних операцій, що робить його популярним вибором для простих завдань шифрування.

Правила для шифру Цезаря:

кіноактриса Каджал
  1. Виберіть число від 1 до 25. Це буде значення вашої зміни.
  2. Запишіть літери алфавіту по порядку, від А до Я.
  3. Зсув кожної літери алфавіту на значення зсуву. Наприклад, якщо значення зсуву дорівнює 3, A стане D, B стане E, C стане F тощо.
  4. Зашифруйте своє повідомлення, замінивши кожну літеру відповідною зміщеною літерою. Наприклад, якщо значення зсуву дорівнює 3, слово привіт перетвориться на khoor.
  5. Щоб розшифрувати повідомлення, просто поверніть процес у зворотному порядку, зсуваючи кожну літеру назад на таку саму величину. Наприклад, якщо значення shift дорівнює 3, зашифроване повідомлення khoor стане привітом.

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

  1. Виберіть значення зсуву від 1 до 25.
  2. Запишіть алфавіт у порядку від А до Я.
  3. Створіть новий алфавіт, зсуваючи кожну літеру вихідного алфавіту на значення зсуву. Наприклад, якщо значення зсуву дорівнює 3, новий алфавіт буде таким:
  4. A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
  5. Замініть кожну літеру повідомлення відповідною літерою з нового алфавіту. Наприклад, якщо значення зсуву дорівнює 3, слово привіт перетвориться на khoor.
  6. Щоб розшифрувати повідомлення, зсуньте кожну літеру назад на таку саму величину. Наприклад, якщо значення shift дорівнює 3, зашифроване повідомлення khoor стане привітом.

Процедура:

  • Переходьте по заданому тексту по одному символу за раз.
  • Для кожного символу трансформуйте вказаний символ відповідно до правила залежно від того, шифруємо чи розшифровуємо текст.
  • Повернути новий згенерований рядок.

Програма, яка отримує текст (рядок) і значення Shift (ціле число) і повертає зашифрований текст.

python __name__

C++

// A C++ program to illustrate Caesar Cipher Technique> #include> using> namespace> std;> // This function receives text and shift and> // returns the encrypted text> string encrypt(string text,>int> s)> {> >string result =>''>;> >// traverse text> >for> (>int> i = 0; i // apply transformation to each character // Encrypt Uppercase letters if (isupper(text[i])) result += char(int(text[i] + s - 65) % 26 + 65); // Encrypt Lowercase letters else result += char(int(text[i] + s - 97) % 26 + 97); } // Return the resulting string return result; } // Driver program to test the above function int main() { string text = 'ATTACKATONCE'; int s = 4; cout << 'Text : ' << text; cout << ' Shift: ' << s; cout << ' Cipher: ' << encrypt(text, s); return 0; }>
>
>

Java

//A Java Program to illustrate Caesar Cipher Technique> class> CaesarCipher> {> >// Encrypts text using a shift of s> >public> static> StringBuffer encrypt(String text,>int> s)> >{> >StringBuffer result=>new> StringBuffer();> >for> (>int> i=>0>; i { if (Character.isUpperCase(text.charAt(i))) { char ch = (char)(((int)text.charAt(i) + s - 65) % 26 + 65); result.append(ch); } else { char ch = (char)(((int)text.charAt(i) + s - 97) % 26 + 97); result.append(ch); } } return result; } // Driver code public static void main(String[] args) { String text = 'ATTACKATONCE'; int s = 4; System.out.println('Text : ' + text); System.out.println('Shift : ' + s); System.out.println('Cipher: ' + encrypt(text, s)); } }>
>
>

Python3

#A python program to illustrate Caesar Cipher Technique> def> encrypt(text,s):> >result>=> ''> ># traverse text> >for> i>in> range>(>len>(text)):> >char>=> text[i]> ># Encrypt uppercase characters> >if> (char.isupper()):> >result>+>=> chr>((>ord>(char)>+> s>->65>)>%> 26> +> 65>)> ># Encrypt lowercase characters> >else>:> >result>+>=> chr>((>ord>(char)>+> s>-> 97>)>%> 26> +> 97>)> >return> result> #check the above function> text>=> 'ATTACKATONCE'> s>=> 4> print> (>'Text : '> +> text)> print> (>'Shift : '> +> str>(s))> print> (>'Cipher: '> +> encrypt(text,s))>
>
>

C#

// A C# Program to illustrate Caesar Cipher Technique> using> System;> using> System.Text;> public> class> CaesarCipher> {> >// Encrypts text using a shift on s> >public> static> StringBuilder encrypt(String text,>int> s)> >{> >StringBuilder result=>new> StringBuilder();> >for> (>int> i=0; i { if (char.IsUpper(text[i])) { char ch = (char)(((int)text[i] + s - 65) % 26 + 65); result.Append(ch); } else { char ch = (char)(((int)text[i] + s - 97) % 26 + 97); result.Append(ch); } } return result; } // Driver code public static void Main(String[] args) { String text = 'ATTACKATONCE'; int s = 4; Console.WriteLine('Text : ' + text); Console.WriteLine('Shift : ' + s); Console.WriteLine('Cipher: ' + encrypt(text, s)); } } /* This code contributed by PrinciRaj1992 */>
>
>

PHP

// A PHP program to illustrate Caesar // Cipher Technique // This function receives text and shift // and returns the encrypted text function encrypt($text, $s) { $result = ''; // traverse text for ($i = 0; $i >
>
>

Javascript

> //A Javascript Program to illustrate Caesar Cipher Technique> > >// Encrypts text using a shift on s> >function> encrypt(text, s)> >{> >let result=>''> >for> (let i = 0; i { let char = text[i]; if (char.toUpperCase(text[i])) { let ch = String.fromCharCode((char.charCodeAt(0) + s-65) % 26 + 65); result += ch; } else { let ch = String.fromCharCode((char.charCodeAt(0) + s-97) % 26 + 97); result += ch; } } return result; } // Driver code let text = 'ATTACKATONCE'; let s = 4; document.write('Text : ' + text + ' '); document.write('Shift : ' + s + ' '); document.write('Cipher: ' + encrypt(text, s) + ' '); // This code is contributed by avanitrachhadiya2155>
>
>

Вихід
Text : ATTACKATONCE Shift: 4 Cipher: EXXEGOEXSRGI>

Часова складність: O(N), де N - довжина даного тексту
Допоміжні приміщення: O(N)

Як розшифрувати?
Ми можемо або написати іншу функцію decrypt, подібну до encrypt, яка застосує заданий зсув у протилежному напрямку, щоб розшифрувати вихідний текст. Однак ми можемо використовувати циклічну властивість шифру за модулем, отже, ми можемо просто спостерігати

Cipher(n) = De-cipher(26-n)>

Отже, ми можемо використати ту саму функцію для розшифровки, натомість ми змінимо значення shift таким чином, щоб shift = 26-shift (зверніться до цього для прикладу виконання на C++).