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 der Substitution unter Verwendung mehrerer Substitutionsalphabete basiert. Die Verschlüsselung des Originaltextes erfolgt mit dem Vigenère-Quadrat oder Vigenère-Tisch .
- Die Tabelle besteht aus den 26 Mal ausgeschriebenen Alphabeten in verschiedenen Zeilen, wobei jedes Alphabet im Vergleich zum vorherigen Alphabet zyklisch nach links verschoben wurde, was den 26 möglichen entspricht 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:
Panda schmelzen
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 Klartextes wird auf ähnliche Weise verschlüsselt.
Tabelle zum Verschlüsseln - Geeks
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. Somit ist E der zweite Klartextbuchstabe.
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 < str.size(); 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 < cipher_text.size(); 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'; if (any_of(str.begin() str.end() ::islower)) transform(str.begin() str.end() str.begin() ::toupper); if (any_of(keyword.begin() keyword.end() ::islower)) transform(keyword.begin() keyword.end() keyword.begin() ::toupper); string key = generateKey(str keyword); string cipher_text = cipherText(str key); cout << 'Ciphertext : ' << cipher_text << 'n'; 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 < str.length(); 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 < cipher_text.length() && i < key.length(); 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 < s.length(); 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 + 'n'); System.out.println('Original/Decrypted Text : ' + originalText(cipher_text key)); } } // This code has been contributed by 29AjayKumar
Python def generate_key(msg key): key = list(key) if len(msg) == len(key): return key else: for i in range(len(msg) - len(key)): key.append(key[i % len(key)]) return ''.join(key) def encrypt_vigenere(msg key): encrypted_text = [] key = generate_key(msg key) for i in range(len(msg)): char = msg[i] if char.isupper(): encrypted_char = chr((ord(char) + ord(key[i]) - 2 * ord('A')) % 26 + ord('A')) elif char.islower(): encrypted_char = chr((ord(char) + ord(key[i]) - 2 * ord('a')) % 26 + ord('a')) else: encrypted_char = char encrypted_text.append(encrypted_char) return ''.join(encrypted_text) def decrypt_vigenere(msg key): decrypted_text = [] key = generate_key(msg key) for i in range(len(msg)): char = msg[i] if char.isupper(): decrypted_char = chr((ord(char) - ord(key[i]) + 26) % 26 + ord('A')) elif char.islower(): decrypted_char = chr((ord(char) - ord(key[i]) + 26) % 26 + ord('a')) else: decrypted_char = char decrypted_text.append(decrypted_char) return ''.join(decrypted_text) # Example usage text_to_encrypt = 'Hello World!' key = 'KEY' encrypted_text = encrypt_vigenere(text_to_encrypt key) print(f'Encrypted Text: {encrypted_text}') decrypted_text = decrypt_vigenere(encrypted_text key) print(f'Decrypted Text: {decrypted_text}') #previous code was only support the upper case letters #this code can be apply on both
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 < str.Length; 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 < cipher_text.Length && i < key.Length; 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'; str = str.ToUpper(); keyword = keyword.ToUpper(); String key = generateKey(str keyword); String cipher_text = cipherText(str key); Console.WriteLine('Ciphertext : ' + cipher_text + 'n'); 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(strkey) { 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(strkey) { let cipher_text=''; for (let i = 0; i < str.length; 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_textkey) { let orig_text=''; for (let i = 0 ; i < cipher_text.length ; 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 < s.length; 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'; str = str.toUpperCase(); keyword = keyword.toUpperCase(); let key = generateKey(str keyword); let cipher_text = cipherText(str key); console.log('Ciphertext : ' + cipher_text + '
'); console.log('Original/Decrypted Text : ' + originalText(cipher_text key)+'
');
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).