logo

Xifrat de Vigenère

Vigenere Cipher és un mètode per xifrar text alfabètic. Utilitza una forma senzilla de substitució polialfabètica . Un xifrat polialfabètic és qualsevol xifrat basat en la substitució, utilitzant múltiples alfabets de substitució. El xifratge del text original es fa mitjançant el Quadrat Vigenère o taula Vigenère .

  • La taula consta dels alfabets escrits 26 vegades en diferents files, cada alfabet es desplaça cíclicament cap a l'esquerra en comparació amb l'alfabet anterior, corresponent als 26 possibles xifres de César.
  • En diferents moments del procés de xifratge, el xifratge utilitza un alfabet diferent d'una de les files.
  • L'alfabet utilitzat en cada punt depèn d'una paraula clau repetida.

Exemple:



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

Xifratge:

La primera lletra del text pla, G, s'aparella amb A, la primera lletra de la clau. Per tant, utilitzeu la fila G i la columna A del quadrat de Vigenère, és a dir, G. De la mateixa manera, per a la segona lletra del text pla, s'utilitza la segona lletra de la clau, la lletra de la fila E i la columna Y és C. La resta de la El text pla es xifra de manera similar.

Taula per xifrar – Geeks



Vigenère_square_shadowing

Desxifrat:
El desxifrat es realitza anant a la fila de la taula corresponent a la clau, trobant la posició de la lletra del text xifrat en aquesta fila i després utilitzant l'etiqueta de la columna com a text sense format. Per exemple, a la fila A (de AYUSH), el text xifrat G apareix a la columna G, que és la primera lletra de text senzill. A continuació, anem a la fila Y (de AYUSH), localitzem el text xifrat C que es troba a la columna E, per tant, E és la segona lletra de text senzill.

Un més fàcil implementació podria ser visualitzar Vigenère algebraicament convertint [A-Z] en nombres [0–25].



 Encryption The plaintext(P) and key(K) are added modulo 26. Ei = (Pi + Ki) mod 26 Decryption Di = (Ei - Ki) mod 26>

Nota: Didenota el desplaçament del caràcter i-è del text pla. Com el desplaçament de A és 0 i de B és 1 i així successivament.

A continuació es mostra la implementació de la idea.

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>

>

>

Python 3




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

>

>

arbre de cerca binari]
Sortida

Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS>

Complexitat temporal: O(n) , on n és la longitud de la cadena (aquí str).

Complexitat espacial: O(n) , aquí n és la longitud de la cadena (aquí str).