logo

Caesarova šifra v kryptografii

  • Caesarova šifra je jednoduchá šifrovacia technika, ktorú používal Julius Caesar na posielanie tajných správ svojim spojencom. Funguje tak, že písmená v textovej správe sa posúvajú o určitý počet pozícií, ktoré sa nazývajú shift alebo kláves.
  • Technika Caesarovej šifry je jednou z prvých a najjednoduchších metód šifrovacej techniky. Je to jednoducho typ substitučnej šifry, t.j. každé písmeno daného textu je nahradené písmenom s pevným počtom pozícií nižšie v abecede. Napríklad s posunom o 1 by sa A nahradilo B, B by sa stalo C atď. Metóda je zrejme pomenovaná po Juliusovi Caesarovi, ktorý ju zrejme používal na komunikáciu so svojimi úradníkmi.
  • Na zašifrovanie daného textu teda potrebujeme celočíselnú hodnotu, známu ako posun, ktorý označuje počet pozícií, o ktoré sa každé písmeno textu posunulo nadol.
    Šifrovanie možno znázorniť pomocou modulárnej aritmetiky tak, že sa písmená najprv prevedú na čísla podľa schémy A = 0, B = 1,…, Z = 25. Šifrovanie písmena pomocou posunu n možno matematicky opísať ako.
  • Napríklad, ak je posun 3, potom písmeno A by bolo nahradené písmenom D, B by bolo E, C by bolo F atď. Abeceda je zabalená tak, že po Z začína späť na A.
  • Tu je príklad, ako použiť Caesarovu šifru na zašifrovanie správy HELLO s posunom o 3:
  1. Napíšte textovú správu: AHOJ
  2. Vyberte hodnotu posunu. V tomto prípade použijeme posun o 3.
  3. Nahraďte každé písmeno v textovej správe písmenom, ktoré je v abecede o tri pozície vpravo.

H sa zmení na K (posun 3 z H)

E sa zmení na H (posun 3 z E)



L sa zmení na O (posun 3 z L)

binárny strom prechodu zásielkového obchodu

L sa zmení na O (posun 3 z L)

O sa zmení na R (posun 3 z O)



hovno

4. Šifrovaná správa je teraz KHOOR.

  • Na dešifrovanie správy stačí posunúť každé písmeno späť o rovnaký počet pozícií. V tomto prípade by ste posunuli každé písmeno v KHOOR späť o 3 pozície, aby ste získali pôvodnú správu, HELLO.


E_n(x)=(x+n)mod 26
(Fáza šifrovania s posunom n)

D_n(x)=(x-n)mod 26
(Fáza dešifrovania s posunom n)



Caesarova šifra 3

Príklady:

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

Výhody:

  • Ľahko sa implementuje a používa, takže je vhodný pre začiatočníkov, aby sa dozvedeli o šifrovaní.
  • Dá sa fyzicky implementovať, napríklad pomocou sady rotujúcich diskov alebo sady kariet, známych ako scytale, čo môže byť v určitých situáciách užitočné.
  • Vyžaduje len malý súbor vopred zdieľaných informácií.
  • Dá sa ľahko upraviť na vytvorenie bezpečnejšieho variantu, napríklad použitím viacerých hodnôt posunu alebo kľúčových slov.

Nevýhody:

  • Nie je bezpečný proti moderným metódam dešifrovania.
  • Zraniteľné voči útokom so známym otvoreným textom, pri ktorých má útočník prístup k zašifrovaným aj nezašifrovaným verziám tých istých správ.
  • Malý počet možných kľúčov znamená, že útočník môže ľahko vyskúšať všetky možné kľúče, kým nenájde ten správny, čo ho robí zraniteľným voči útoku hrubou silou.
  • Nie je vhodný na šifrovanie dlhého textu, pretože by sa dal ľahko prelomiť.
  • Nie je vhodný na bezpečnú komunikáciu, pretože sa ľahko rozbije.
  • Neposkytuje dôvernosť, integritu a autentickosť správy.

Vlastnosti cézarovej šifry:

  1. Substitučná šifra: Caesarova šifra je typom substitučnej šifry, kde každé písmeno v otvorenom texte je nahradené písmenom o určitý pevný počet pozícií nižšie v abecede.
  2. Pevný kľúč: Caesarova šifra používa pevný kľúč, čo je počet pozícií, o ktoré sú písmená posunuté. Tento kľúč je známy odosielateľovi aj príjemcovi.
  3. Symetrické šifrovanie: Caesarova šifra je symetrická šifrovacia technika, čo znamená, že na šifrovanie aj dešifrovanie sa používa rovnaký kľúč.
  4. Obmedzený kľúčový priestor: Caesarova šifra má veľmi obmedzený kľúčový priestor iba 26 možných kľúčov, keďže v anglickej abecede je len 26 písmen.
  5. Zraniteľná voči útokom hrubou silou: Caesarova šifra je zraniteľná voči útokom hrubou silou, pretože existuje len 26 možných kľúčov, ktoré môžete vyskúšať.
  6. Jednoduchá implementácia: Caesarova šifra sa veľmi ľahko implementuje a vyžaduje len jednoduché aritmetické operácie, vďaka čomu je obľúbenou voľbou pre jednoduché šifrovacie úlohy.

Pravidlá pre Caesarovu šifru:

vytlačiť vzor hviezdy
  1. Vyberte číslo medzi 1 a 25. Toto bude vaša hodnota posunu.
  2. Zapíšte si písmená abecedy v poradí od A po Z.
  3. Posuňte každé písmeno abecedy o hodnotu posunu. Napríklad, ak je hodnota posunu 3, A sa zmení na D, B sa zmení na E, C sa zmení na F atď.
  4. Zašifrujte svoju správu nahradením každého písmena zodpovedajúcim posunutým písmenom. Napríklad, ak je hodnota posunu 3, slovo ahoj sa zmení na khoor.
  5. Ak chcete správu dešifrovať, jednoducho zmeňte proces posunutím každého písmena späť o rovnakú hodnotu. Napríklad, ak je hodnota posunu 3, zašifrovaná správa khoor sa zmení na ahoj.

Algoritmus pre Caesarovu šifru:
Vstup:

čo je objekt java
  1. Vyberte hodnotu posunu medzi 1 a 25.
  2. Napíšte abecedu v poradí od A po Z.
  3. Vytvorte novú abecedu posunutím každého písmena pôvodnej abecedy o hodnotu posunu. Napríklad, ak je hodnota posunu 3, nová abeceda bude:
  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. Nahraďte každé písmeno správy zodpovedajúcim písmenom z novej abecedy. Napríklad, ak je hodnota posunu 3, slovo ahoj sa zmení na khoor.
  6. Ak chcete správu dešifrovať, posuňte každé písmeno späť o rovnakú hodnotu. Napríklad, ak je hodnota posunu 3, zašifrovaná správa khoor sa zmení na ahoj.

Postup:

  • Prechádzajte daným textom po jednom znaku.
  • Pre každý znak transformujte daný znak podľa pravidla v závislosti od toho, či text šifrujeme alebo dešifrujeme.
  • Vráti nový vygenerovaný reťazec.

Program, ktorý prijme text (reťazec) a hodnotu Shift (celé číslo) a vráti zašifrovaný text.

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>
>
>

Výkon
Text : ATTACKATONCE Shift: 4 Cipher: EXXEGOEXSRGI>

Časová zložitosť: O(N) kde N je dĺžka daného textu
Pomocný priestor: O(N)

Ako dešifrovať?
Môžeme napísať inú funkciu dešifrovať podobnú šifrovaniu, ktorá použije daný posun v opačnom smere na dešifrovanie pôvodného textu. Môžeme však použiť cyklickú vlastnosť šifry pod modulo, takže môžeme jednoducho pozorovať

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

Na dešifrovanie teda môžeme použiť rovnakú funkciu, namiesto toho upravíme hodnotu posunu tak, že shift = 26-shift (pozrite si ukážku spustenia v C++).