Vigenere Cipher est une méthode de cryptage de texte alphabétique. Il utilise une forme simple de substitution polyalphabétique . Un chiffre polyalphabétique est tout chiffre basé sur la substitution, utilisant plusieurs alphabets de substitution. Le cryptage du texte original se fait à l'aide du Carré Vigenère ou table Vigenère .
- Le tableau est constitué des alphabets écrits 26 fois dans des rangées différentes, chaque alphabet étant décalé cycliquement vers la gauche par rapport à l'alphabet précédent, correspondant aux 26 chiffres de César possibles.
- À différents stades du processus de chiffrement, le chiffre utilise un alphabet différent de l’une des lignes.
- L'alphabet utilisé à chaque point dépend d'un mot-clé répétitif.
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.>
Chiffrement:
La première lettre du texte brut, G, est associée à A, la première lettre de la clé. Utilisez donc la ligne G et la colonne A du carré de Vigenère, à savoir G. De même, pour la deuxième lettre du texte clair, on utilise la deuxième lettre de la clé, la lettre de la ligne E, et la colonne Y est C. Le reste du le texte en clair est chiffré de la même manière.
Table à chiffrer – Geeks

Décryptage :
Le déchiffrement est effectué en accédant à la ligne du tableau correspondant à la clé, en recherchant la position de la lettre du texte chiffré dans cette ligne, puis en utilisant l'étiquette de la colonne comme texte en clair. Par exemple, dans la ligne A (de AYUSH), le texte chiffré G apparaît dans la colonne G, qui est la première lettre en texte brut. Ensuite, nous allons à la ligne Y (depuis AYUSH), localisons le texte chiffré C qui se trouve dans la colonne E, donc E est la deuxième lettre en clair.
Un plus mise en œuvre facile pourrait être de visualiser Vigenère algébriquement en convertissant [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>
Note: Djedésigne le décalage du i-ème caractère du texte en clair. Comme le décalage de UN est 0 et de B vaut 1 et ainsi de suite.
Vous trouverez ci-dessous la mise en œuvre de l'idée.
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> |
>
>
exemples de programmation pythonSortir
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS>
Complexité temporelle : O(n) , où n est la longueur de la chaîne (ici str).
Complexité spatiale :O(n) , ici n est la longueur de la chaîne (ici str).