Vigenere Cipher je metoda šifriranja abecednega besedila. Uporablja preprosto obliko poliabecedna zamenjava . Poliabecedna šifra je katera koli šifra, ki temelji na substituciji in uporablja več substitucijskih abeced. Šifriranje izvirnega besedila se izvede z uporabo Vigenèrov kvadrat ali Vigenèrova miza .
- Tabela je sestavljena iz abeced, izpisanih 26-krat v različnih vrsticah, pri čemer je vsaka abeceda ciklično premaknjena v levo v primerjavi s prejšnjo abecedo, kar ustreza 26 možnim Cezarjevim šifram.
- Na različnih točkah postopka šifriranja šifra uporablja drugo abecedo iz ene od vrstic.
- Abeceda, uporabljena na vsaki točki, je odvisna od ponavljajoče se ključne besede.
primer:
Input : Plaintext : GEEKSFORGEEKS Keyword : AYUSH Output : Ciphertext : GCYCZFMLYLEIM For generating key, the given keyword is repeated in a circular manner until it matches the length of the plain text. The keyword 'AYUSH' generates the key 'AYUSHAYUSHAYU' The plain text is then encrypted using the process explained below.>
Šifriranje:
Prva črka odprtega besedila, G, je povezana z A, prvo črko ključa. Zato uporabite vrstico G in stolpec A Vigenèrovega kvadrata, in sicer G. Podobno je za drugo črko odprtega besedila uporabljena druga črka ključa, črka v vrstici E, stolpec Y pa je C. Preostanek golo besedilo je šifrirano na podoben način.
Tabela za šifriranje – Geeki

Dešifriranje:
Dešifriranje se izvede tako, da greste v vrstico v tabeli, ki ustreza ključu, poiščete položaj črke šifriranega besedila v tej vrstici in nato uporabite oznako stolpca kot odprto besedilo. Na primer, v vrstici A (iz AYUSH) se šifrirano besedilo G pojavi v stolpcu G, ki je prva črka odprtega besedila. Nato gremo v vrstico Y (iz AYUSH), poiščemo šifrirano besedilo C, ki ga najdemo v stolpcu E, zato je E druga črka odprtega besedila.
A več enostavna izvedba bi lahko bila algebraično vizualizacija Vigenèra s pretvorbo [A-Z] v števila [0–25].
Encryption The plaintext(P) and key(K) are added modulo 26. Ei = (Pi + Ki) mod 26 Decryption Di = (Ei - Ki) mod 26>
Opomba: Djazoznačuje odmik i-tega znaka odprtega besedila. Kot izravnava A je 0 in od B je 1 in tako naprej.
Spodaj je izvedba ideje.
C++
// C++ code to implement Vigenere Cipher> #include> using> namespace> std;> // This function generates the key in> // a cyclic manner until it's length isn't> // equal to the length of original text> string generateKey(string str, string key)> {> >int> x = str.size();> >for> (>int> i = 0; ; i++)> >{> >if> (x == i)> >i = 0;> >if> (key.size() == str.size())> >break>;> >key.push_back(key[i]);> >}> >return> key;> }> // This function returns the encrypted text> // generated with the help of the key> string cipherText(string str, string key)> {> >string cipher_text;> >for> (>int> i = 0; i { // converting in range 0-25 char x = (str[i] + key[i]) %26; // convert into alphabets(ASCII) x += 'A'; cipher_text.push_back(x); } return cipher_text; } // This function decrypts the encrypted text // and returns the original text string originalText(string cipher_text, string key) { string orig_text; for (int i = 0 ; i { // converting in range 0-25 char x = (cipher_text[i] - key[i] + 26) %26; // convert into alphabets(ASCII) x += 'A'; orig_text.push_back(x); } return orig_text; } // Driver program to test the above function int main() { string str = 'GEEKSFORGEEKS'; string keyword = 'AYUSH'; string key = generateKey(str, keyword); string cipher_text = cipherText(str, key); cout << 'Ciphertext : ' << cipher_text << '
'; cout << 'Original/Decrypted Text : ' << originalText(cipher_text, key); return 0; }> |
>
>
Java
// Java code to implement Vigenere Cipher> class> GFG> {> // This function generates the key in> // a cyclic manner until it's length isi'nt> // equal to the length of original text> static> String generateKey(String str, String key)> {> >int> x = str.length();> >for> (>int> i =>0>; ; i++)> >{> >if> (x == i)> >i =>0>;> >if> (key.length() == str.length())> >break>;> >key+=(key.charAt(i));> >}> >return> key;> }> // This function returns the encrypted text> // generated with the help of the key> static> String cipherText(String str, String key)> {> >String cipher_text=>''>;> >for> (>int> i =>0>; i { // converting in range 0-25 int x = (str.charAt(i) + key.charAt(i)) %26; // convert into alphabets(ASCII) x += 'A'; cipher_text+=(char)(x); } return cipher_text; } // This function decrypts the encrypted text // and returns the original text static String originalText(String cipher_text, String key) { String orig_text=''; for (int i = 0 ; i i { // converting in range 0-25 int x = (cipher_text.charAt(i) - key.charAt(i) + 26) %26; // convert into alphabets(ASCII) x += 'A'; orig_text+=(char)(x); } return orig_text; } // This function will convert the lower case character to Upper case static String LowerToUpper(String s) { StringBuffer str =new StringBuffer(s); for(int i = 0; i { if(Character.isLowerCase(s.charAt(i))) { str.setCharAt(i, Character.toUpperCase(s.charAt(i))); } } s = str.toString(); return s; } // Driver code public static void main(String[] args) { String Str = 'GEEKSFORGEEKS'; String Keyword = 'AYUSH'; String str = LowerToUpper(Str); String keyword = LowerToUpper(Keyword); String key = generateKey(str, keyword); String cipher_text = cipherText(str, key); System.out.println('Ciphertext : ' + cipher_text + '
'); System.out.println('Original/Decrypted Text : ' + originalText(cipher_text, key)); } } // This code has been contributed by 29AjayKumar> |
>
>
Python3
# Python code to implement> # Vigenere Cipher> # This function generates the> # key in a cyclic manner until> # it's length isn't equal to> # the length of original text> def> generateKey(string, key):> >key>=> list>(key)> >if> len>(string)>=>=> len>(key):> >return>(key)> >else>:> >for> i>in> range>(>len>(string)>-> >len>(key)):> >key.append(key[i>%> len>(key)])> >return>('' . join(key))> > # This function returns the> # encrypted text generated> # with the help of the key> def> cipherText(string, key):> >cipher_text>=> []> >for> i>in> range>(>len>(string)):> >x>=> (>ord>(string[i])>+> >ord>(key[i]))>%> 26> >x>+>=> ord>(>'A'>)> >cipher_text.append(>chr>(x))> >return>('' . join(cipher_text))> > # This function decrypts the> # encrypted text and returns> # the original text> def> originalText(cipher_text, key):> >orig_text>=> []> >for> i>in> range>(>len>(cipher_text)):> >x>=> (>ord>(cipher_text[i])>-> >ord>(key[i])>+> 26>)>%> 26> >x>+>=> ord>(>'A'>)> >orig_text.append(>chr>(x))> >return>('' . join(orig_text))> > # Driver code> if> __name__>=>=> '__main__'>:> >string>=> 'GEEKSFORGEEKS'> >keyword>=> 'AYUSH'> >key>=> generateKey(string, keyword)> >cipher_text>=> cipherText(string,key)> >print>(>'Ciphertext :'>, cipher_text)> >print>(>'Original/Decrypted Text :'>,> >originalText(cipher_text, key))> # This code is contributed> # by Pratik Somwanshi> |
>
>
C#
// C# code to implement Vigenere Cipher> using> System;> > class> GFG> {> // This function generates the key in> // a cyclic manner until it's length isi'nt> // equal to the length of original text> static> String generateKey(String str, String key)> {> >int> x = str.Length;> >for> (>int> i = 0; ; i++)> >{> >if> (x == i)> >i = 0;> >if> (key.Length == str.Length)> >break>;> >key+=(key[i]);> >}> >return> key;> }> // This function returns the encrypted text> // generated with the help of the key> static> String cipherText(String str, String key)> {> >String cipher_text=>''>;> >for> (>int> i = 0; i { // converting in range 0-25 int x = (str[i] + key[i]) %26; // convert into alphabets(ASCII) x += 'A'; cipher_text+=(char)(x); } return cipher_text; } // This function decrypts the encrypted text // and returns the original text static String originalText(String cipher_text, String key) { String orig_text=''; for (int i = 0 ; i i { // converting in range 0-25 int x = (cipher_text[i] - key[i] + 26) %26; // convert into alphabets(ASCII) x += 'A'; orig_text+=(char)(x); } return orig_text; } // Driver code public static void Main(String[] args) { String str = 'GEEKSFORGEEKS'; String keyword = 'AYUSH'; String key = generateKey(str, keyword); String cipher_text = cipherText(str, key); Console.WriteLine('Ciphertext : ' + cipher_text + '
'); Console.WriteLine('Original/Decrypted Text : ' + originalText(cipher_text, key)); } } /* This code contributed by PrinciRaj1992 */> |
>
>
Javascript
> // JavaScript code to implement Vigenere Cipher> // This function generates the key in> // a cyclic manner until it's length isn't> // equal to the length of original text> function> generateKey(str,key)> {> > >key=key.split(>''>);> >if>(str.length == key.length)> >return> key.join(>''>);> >else> >{> >let temp=key.length;> >for> (let i = 0;i<(str.length-temp) ; i++)> >{> > >key.push(key[i % ((key).length)])> >}> >}> >return> key.join(>''>);> }> // This function returns the encrypted text> // generated with the help of the key> function> cipherText(str,key)> {> >let cipher_text=>''>;> > >for> (let i = 0; i { // converting in range 0-25 let x = (str[i].charCodeAt(0) + key[i].charCodeAt(0)) %26; // convert into alphabets(ASCII) x += 'A'.charCodeAt(0); cipher_text+=String.fromCharCode(x); } return cipher_text; } // This function decrypts the encrypted text // and returns the original text function originalText(cipher_text,key) { let orig_text=''; for (let i = 0 ; i { // converting in range 0-25 let x = (cipher_text[i].charCodeAt(0) - key[i].charCodeAt(0) + 26) %26; // convert into alphabets(ASCII) x += 'A'.charCodeAt(0); orig_text+=String.fromCharCode(x); } return orig_text; } // This function will convert the lower // case character to Upper case function LowerToUpper(s) { let str =(s).split(''); for(let i = 0; i { if(s[i] == s[i].toLowerCase()) { str[i] = s[i].toUpperCase(); } } s = str.toString(); return s; } // Driver code let str = 'GEEKSFORGEEKS'; let keyword = 'AYUSH'; let key = generateKey(str, keyword); let cipher_text = cipherText(str, key); document.write('Ciphertext : ' + cipher_text + ' '); document.write('Original/Decrypted Text : ' + originalText(cipher_text, key)+' '); // This code is contributed by rag2127> |
>
>
umetna inteligenca in inteligentni agentiIzhod
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS>
Časovna zahtevnost: O(n) , kjer je n dolžina niza (tukaj str).
Prostorska kompleksnost: O(n) , tukaj je n dolžina niza (tukaj str).