Шифр Виженера
Vigenere Cipher - это метод шифрования буквенного текста. Он использует простую форму полиалфавитной замены. Полиалфавитный шифр - это любой шифр, основанный на подстановке с использованием нескольких алфавитов подстановки. Шифрование исходного текста выполняется с использованием квадрата Виженера или таблицы Виженера.
- Таблица состоит из алфавитов, записанных 26 раз в разных строках, каждый алфавит циклически сдвинут влево по сравнению с предыдущим алфавитом, что соответствует 26 возможным шифрам Цезаря.
- На разных этапах процесса шифрования шифр использует другой алфавит из одной из строк.
- Алфавит, используемый в каждой точке, зависит от повторяющегося ключевого слова.
Пример:
Ввод: Открытый текст: GEEKSFORGEEKS Ключевое слово: АЮШ Вывод: зашифрованный текст: GCYCZFMLYLEIM Для генерации ключа данное ключевое слово повторяется по кругу, пока он не совпадет с длиной простой текст. Ключевое слово «АЮШ» порождает ключ «АЮШАЮШАЮ» Затем простой текст шифруется с помощью процесса объяснено ниже.
Шифрование
Первая буква открытого текста G сочетается с A, первой буквой ключа. Поэтому используйте строку G и столбец A квадрата Виженера, а именно G. Аналогично, для второй буквы открытого текста используется вторая буква ключа, буква в строке E и столбце Y - C. Остальная часть открытого текста шифруется аналогичным образом.
Таблица для шифрования - Компьютерщики
Расшифровка
Расшифровка выполняется путем перехода к строке в таблице, соответствующей ключу, нахождения позиции буквы зашифрованного текста в этой строке, а затем использования метки столбца в качестве открытого текста. Например, в строке A (из AYUSH) зашифрованный текст G появляется в столбце G, который является первой буквой открытого текста. Затем мы переходим к строке Y (из AYUSH), находим зашифрованный текст C, который находится в столбце E, таким образом, E - вторая буква открытого текста.
Более простой реализацией может быть алгебраическая визуализация Виженера путем преобразования [AZ] в числа [0–25].
Шифрование Открытый текст (P) и ключ (K) складываются по модулю 26. E i = (P i + K i ) mod 26 Расшифровка D i = (E i - K i + 26) mod 26
Примечание: D i обозначает смещение i-го символа открытого текста. Подобно смещению A равно 0, а B равно 1 и так далее.
Ниже представлена реализация идеи.
C ++
// C++ code to implement Vigenere Cipher #include<bits/stdc++.h> using namespace std; // This function generates the key in // a cyclic manner until it's length isi'nt // 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]); } key; return } // 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" ; 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 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)); } key; return } // 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 + "
" ); 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]); } key; return } // 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" ; 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 */ |
Зашифрованный текст: GCYCZFMLYLEIM Исходный / расшифрованный текст: GEEKSFORGEEKS
Выход:
Зашифрованный текст: GCYCZFMLYLEIM Исходный / расшифрованный текст: GEEKSFORGEEKS
Ссылка: https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher
Эта статья предоставлена Аюш Хандури. Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.