logo

Cezarjeva šifra v kriptografiji

  • Cezarjeva šifra je preprosta tehnika šifriranja, ki jo je uporabljal Julij Cezar za pošiljanje tajnih sporočil svojim zaveznikom. Deluje tako, da premakne črke v sporočilu z navadnim besedilom za določeno število položajev, kar je znano kot premik ali tipka.
  • Tehnika Caesar Cipher je ena najzgodnejših in najpreprostejših metod tehnike šifriranja. To je preprosto vrsta nadomestne šifre, tj. vsaka črka danega besedila se nadomesti s črko z določenim številom mest po abecedi. Na primer s premikom 1 bi A nadomestil B, B bi postal C itd. Metoda je očitno poimenovana po Juliju Cezarju, ki jo je očitno uporabljal za komunikacijo s svojimi uradniki.
  • Za šifriranje danega besedila torej potrebujemo celoštevilsko vrednost, znano kot premik, ki označuje, za koliko položajev je bila vsaka črka besedila premaknjena navzdol.
    Šifriranje lahko predstavimo z modularno aritmetiko tako, da črke najprej pretvorimo v številke, po shemi A = 0, B = 1,…, Z = 25. Šifriranje črke s premikom n lahko matematično opišemo kot.
  • Na primer, če je premik 3, bi črko A nadomestila črka D, B bi postal E, C bi postal F itd. Abeceda je ovita tako, da se za Z začne nazaj pri A.
  • Tukaj je primer, kako uporabiti Cezarjevo šifro za šifriranje sporočila HELLO s premikom 3:
  1. Zapišite sporočilo z navadnim besedilom: POZDRAVLJENI
  2. Izberite vrednost premika. V tem primeru bomo uporabili premik 3.
  3. Vsako črko v sporočilu z navadnim besedilom zamenjajte s črko, ki je v abecedi tri mesta na desni.

H postane K (premik 3 iz H)

E postane H (premik 3 iz E)



L postane O (premik 3 z L)

kode napak linux

L postane O (premik 3 z L)

O postane R (premik 3 z O)



java za zanko

4. Šifrirano sporočilo je zdaj KHOOR.

  • Če želite dešifrirati sporočilo, morate vsako črko preprosto premakniti nazaj za enako število mest. V tem primeru bi vsako črko v KHOOR premaknili nazaj za 3 položaje, da bi dobili prvotno sporočilo HELLO.


E_n(x)=(x+n)mod 26
(Faza šifriranja s premikom n)

D_n(x)=(x-n)mod 26
(faza dešifriranja s premikom n)



Cezarjeva šifra 3

Primeri:

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

Prednosti:

  • Enostaven za implementacijo in uporabo, zato je primeren za začetnike, da se naučijo šifriranja.
  • Lahko se fizično implementira, na primer z nizom vrtečih se diskov ali kompletom kart, znanih kot scytale, kar je lahko uporabno v določenih situacijah.
  • Zahteva le majhen nabor vnaprej deljenih informacij.
  • Preprosto ga je mogoče spremeniti, da ustvarite varnejšo različico, na primer z uporabo več vrednosti premika ali ključnih besed.

Slabosti:

  • Ni varen pred sodobnimi metodami dešifriranja.
  • Ranljivo za napade z znanim čistim besedilom, kjer ima napadalec dostop do šifrirane in nešifrirane različice istih sporočil.
  • Majhno število možnih ključev pomeni, da lahko napadalec zlahka preizkusi vse možne ključe, dokler ne najde pravega, zaradi česar je ranljiv za napad s surovo silo.
  • Ni primeren za šifriranje dolgega besedila, saj bi ga bilo enostavno vdreti.
  • Ni primeren za varno komunikacijo, saj se zlahka zlomi.
  • Ne zagotavlja zaupnosti, celovitosti in pristnosti v sporočilu.

Značilnosti cezarjeve šifre:

  1. Nadomestna šifra: Cezarjeva šifra je vrsta nadomestne šifre, kjer je vsaka črka v odprtem besedilu nadomeščena s črko na določenem številu mest navzdol po abecedi.
  2. Fiksni ključ: Cezarjeva šifra uporablja fiksni ključ, ki je število položajev, za katere so premaknjene črke. Ta ključ poznata tako pošiljatelj kot prejemnik.
  3. Simetrično šifriranje: Cezarjeva šifra je tehnika simetričnega šifriranja, kar pomeni, da se za šifriranje in dešifriranje uporablja isti ključ.
  4. Omejen prostor ključev: Cezarjeva šifra ima zelo omejen prostor ključev s samo 26 možnimi ključi, saj je v angleški abecedi le 26 črk.
  5. Ranljivost za napade s surovo silo: Cezarjeva šifra je ranljiva za napade s surovo silo, saj je na voljo le 26 možnih ključev, ki jih je treba preizkusiti.
  6. Enostavna implementacija: Cezarjevo šifro je zelo enostavno implementirati in zahteva le preproste aritmetične operacije, zaradi česar je priljubljena izbira za preprosta opravila šifriranja.

Pravila za Cezarjevo šifro:

delna diferenciacija v lateksu
  1. Izberite številko med 1 in 25. To bo vaša vrednost premika.
  2. Zapiši črke abecede po vrsti, od A do Ž.
  3. Vsako črko abecede premaknite za vrednost premika. Na primer, če je vrednost premika 3, bi A postal D, B bi postal E, C bi postal F itd.
  4. Šifrirajte svoje sporočilo tako, da vsako črko zamenjate z ustrezno premaknjeno črko. Na primer, če je vrednost premika 3, bi beseda hello postala khoor.
  5. Če želite dešifrirati sporočilo, preprosto obrnite postopek tako, da vsako črko premaknete nazaj za enako vrednost. Na primer, če je vrednost premika 3, bi šifrirano sporočilo khoor postalo hello.

Algoritem za Caesar Cipher:
Vnos:

dekodiranje js base64
  1. Izberite vrednost premika med 1 in 25.
  2. Zapiši abecedo po vrsti od A do Ž.
  3. Ustvarite novo abecedo tako, da vsako črko prvotne abecede premaknete za vrednost premika. Na primer, če je vrednost premika 3, bi bila nova abeceda:
  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. Zamenjajte vsako črko sporočila z ustrezno črko iz nove abecede. Na primer, če je vrednost premika 3, bi beseda hello postala khoor.
  6. Če želite dešifrirati sporočilo, premaknite vsako črko nazaj za enako vrednost. Na primer, če je vrednost premika 3, bi šifrirano sporočilo khoor postalo hello.

Postopek:

  • Prečkajte dano besedilo en znak naenkrat.
  • Za vsak znak transformirajte podani znak po pravilu, odvisno od tega, ali šifriramo ali dešifriramo besedilo.
  • Vrni nov ustvarjen niz.

Program, ki prejme besedilo (niz) in vrednost Shift (celo število) in vrne šifrirano besedilo.

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

Izhod
Text : ATTACKATONCE Shift: 4 Cipher: EXXEGOEXSRGI>

Časovna zahtevnost: O(N), kjer je N dolžina danega besedila
Pomožni prostor: O(N)

Kako dešifrirati?
Lahko napišemo drugo funkcijo decrypt, podobno šifriranju, ki bo uporabila dani premik v nasprotni smeri za dešifriranje izvirnega besedila. Lahko pa uporabimo ciklično lastnost šifre pod modulom, zato lahko preprosto opazujemo

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

Zato lahko uporabimo isto funkcijo za dešifriranje, namesto tega bomo spremenili vrednost premika tako, da bo premik = 26-premik (glejte to za vzorčno izvajanje v C++).