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:
- Napíšte textovú správu: AHOJ
- Vyberte hodnotu posunu. V tomto prípade použijeme posun o 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)
L sa zmení na O (posun 3 z L)
O sa zmení na R (posun 3 z O)
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.
(Fáza šifrovania s posunom n)
(Fáza dešifrovania s posunom n)
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:
- 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.
- 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.
- Symetrické šifrovanie: Caesarova šifra je symetrická šifrovacia technika, čo znamená, že na šifrovanie aj dešifrovanie sa používa rovnaký kľúč.
- 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.
- 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ť.
- 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:
- Vyberte číslo medzi 1 a 25. Toto bude vaša hodnota posunu.
- Zapíšte si písmená abecedy v poradí od A po Z.
- 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ď.
- 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.
- 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:
- Vyberte hodnotu posunu medzi 1 a 25.
- Napíšte abecedu v poradí od A po Z.
- 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:
- 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 - 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.
- 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++).