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