Vigenere Cipher is een methode voor het coderen van alfabetische tekst. Het maakt gebruik van een eenvoudige vorm van polyalfabetische vervanging . Een polyalfabetisch cijfer is elk cijfer dat is gebaseerd op vervanging met behulp van meerdere vervangingsalfabetten. De codering van de originele tekst gebeurt met behulp van de Vigenère vierkant of Vigenère tafel .
- De tabel bestaat uit de alfabetten die 26 keer in verschillende rijen zijn geschreven. Elk alfabet is cyclisch naar links verschoven in vergelijking met het vorige alfabet dat overeenkomt met de 26 mogelijke Caesar-cijfers .
- Op verschillende punten in het versleutelingsproces gebruikt het cijfer een ander alfabet dan een van de rijen.
- Het alfabet dat op elk punt wordt gebruikt, is afhankelijk van een herhalend trefwoord.
Voorbeeld:
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.
Encryptie:
maven-opslagplaats
De eerste letter van de leesbare tekst G is gekoppeld aan A, de eerste letter van de sleutel. Gebruik dus rij G en kolom A van het Vigenère-vierkant, namelijk G. Op dezelfde manier wordt voor de tweede letter van de leesbare tekst de tweede letter van de sleutel gebruikt, de letter in rij E en kolom Y is C. De rest van de leesbare tekst wordt op een vergelijkbare manier gecodeerd.
Tabel om te coderen - Geeks
Decryptie:
Decodering wordt uitgevoerd door naar de rij in de tabel te gaan die overeenkomt met de sleutel, de positie van de cijfertekstletter in deze rij te vinden en vervolgens het label van de kolom als leesbare tekst te gebruiken. In rij A (van AYUSH) verschijnt bijvoorbeeld de cijfertekst G in kolom G, wat de eerste leesbare letter is. Vervolgens gaan we naar rij Y (van AYUSH) en zoeken de cijfertekst C die in kolom E staat, dus E is de tweede platte tekstletter.
Een meer eenvoudige implementatie zou kunnen zijn om Vigenère algebraïsch te visualiseren door [A-Z] om te zetten in getallen [0–25].
Encryption
The plaintext(P) and key(K) are added modulo 26.
Ei = (Pi + Ki) mod 26
Decryption
Di = (Ei - Ki) mod 26
Opmerking: Digeeft de offset aan van het i-de teken van de leesbare tekst. Zoals compensatie van A is 0 en van B is 1 enzovoort.
Hieronder vindt u de implementatie van het 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)+'
');
Uitvoer
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS
Tijdcomplexiteit: O(n) waarbij n de lengte van de string is (hier str).
Ruimtecomplexiteit: O(n) hier is n de lengte van de string (hier str).