logo

Vigenère-Chiffre

Vigenere-Chiffre ist eine Methode zur Verschlüsselung alphabetischer Texte. Es verwendet eine einfache Form von polyalphabetische Substitution . Eine polyalphabetische Chiffre ist jede Chiffre, die auf Substitution basiert und mehrere Substitutionsalphabete verwendet. Die Verschlüsselung des Originaltextes erfolgt mit dem Vigenère-Quadrat oder Vigenère-Tisch .

  • Die Tabelle besteht aus den 26 Mal in verschiedenen Zeilen ausgeschriebenen Alphabeten, wobei jedes Alphabet im Vergleich zum vorherigen Alphabet zyklisch nach links verschoben ist, entsprechend den 26 möglichen Caesar-Chiffren.
  • An verschiedenen Stellen im Verschlüsselungsprozess verwendet die Chiffre ein anderes Alphabet als eine der Zeilen.
  • Das an jeder Stelle verwendete Alphabet hängt von einem sich wiederholenden Schlüsselwort ab.

Beispiel:



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

Verschlüsselung:

Der erste Buchstabe des Klartextes, G, wird mit A, dem ersten Buchstaben des Schlüssels, gepaart. Verwenden Sie also Zeile G und Spalte A des Vigenère-Quadrats, nämlich G. Ebenso wird für den zweiten Buchstaben des Klartextes der zweite Buchstabe des Schlüssels verwendet, der Buchstabe in Zeile E, und Spalte Y ist C. Der Rest des Klartext wird auf ähnliche Weise verschlüsselt.

Tabelle zum Verschlüsseln – Geeks



Vigenère_square_shading

Entschlüsselung:
Die Entschlüsselung erfolgt, indem man zu der Zeile in der Tabelle geht, die dem Schlüssel entspricht, die Position des Geheimtextbuchstabens in dieser Zeile ermittelt und dann die Beschriftung der Spalte als Klartext verwendet. Beispielsweise erscheint in Zeile A (von AYUSH) der Chiffretext G in Spalte G, der der erste Klartextbuchstabe ist. Als nächstes gehen wir zu Zeile Y (von AYUSH) und suchen den Chiffretext C, der in Spalte E zu finden ist, sodass E der zweite Klartextbuchstabe ist.

Ein mehr einfache Umsetzung könnte darin bestehen, Vigenère algebraisch zu visualisieren, indem man [A-Z] in Zahlen [0–25] umwandelt.



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

Notiz: Dichbezeichnet den Offset des i-ten Zeichens des Klartextes. Wie Offset von A ist 0 und von B ist 1 und so weiter.

Nachfolgend finden Sie die Umsetzung der Idee.

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>

>

>

Panda schmelzen
Ausgabe

Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS>

Zeitkomplexität: O(n) , wobei n die Länge der Zeichenfolge ist (hier str).

Raumkomplexität: O(n) , hier ist n die Länge der Zeichenfolge (hier str).