Vigenere Cipher — это метод шифрования буквенного текста. Используется простая форма полиалфабетического замещения . Полифабетический шифр — это любой шифр, основанный на подстановке с использованием нескольких алфавитов подстановки. Шифрование исходного текста выполняется с использованием квадрата Vigenère или таблицы Vigenère .
Таблица состоит из алфавитов, записанных 26 раз в разных строках, каждый алфавит циклически сдвинут влево по сравнению с предыдущим алфавитом, что соответствует 26 возможным шифрам Цезаря .
На разных этапах процесса шифрования шифр использует другой алфавит из одной из строк.
Алфавит, используемый в каждой точке, зависит от повторяющегося ключевого слова.
Пример:
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.
шифрование Первая буква открытого текста, G, в паре с A, первая буква ключа. Поэтому используйте строку G и столбец A квадрата Вигенера, а именно G. Аналогично, для второй буквы открытого текста используется вторая буква ключа, буквой в строке E и столбце Y является C. Остальная часть открытого текста зашифрован подобным образом.
Таблица для шифрования — Geeks
Дешифрирование Расшифровка выполняется путем перехода к строке в таблице, соответствующей ключу, поиска положения буквы зашифрованного текста в этой строке, а затем с использованием метки столбца в качестве открытого текста. Например, в строке A (из AYUSH) зашифрованный текст G появляется в столбце G, который является первой буквой открытого текста. Затем мы переходим к строке Y (из AYUSH), определяем местонахождение зашифрованного текста C, который находится в столбце E, таким образом, E — вторая буква открытого текста.
Более простой реализацией может быть визуализация Вигенера алгебраически путем преобразования [AZ] в числа [0–25].
Encryption
The plaintext(P) and key(K) are added modulo 26.
Ei = (Pi + Ki) mod 26
Decryption
Di = (Ei - Ki + 26) mod 26
Примечание: D i обозначает смещение i-го символа открытого текста. Как смещение A равно 0, а B равно 1 и так далее.
Ниже приведена реализация идеи.
C ++
// C ++ код для реализации Vigenere Cipher #include<bits/stdc++.h>
usingnamespacestd;
// Эта функция генерирует ключ в // циклически, пока длина не будет // равно длине исходного текста string generateKey(string str, string key) {
intx = str.size();
for(inti = 0; ; i++)
{
if(x == i)
i = 0;
if(key.size() == str.size())
break;
key.push_back(key[i]);
}
returnkey;
}
// Эта функция возвращает зашифрованный текст // генерируется с помощью ключа string cipherText(string str, string key) {
string cipher_text;
for(inti = 0; i < str.size(); i++)
{
// преобразование в диапазоне 0-25
intx = (str[i] + key[i]) %26;
// преобразовать в алфавиты (ASCII)
x += 'A';
cipher_text.push_back(x);
}
returncipher_text;
}
// Эта функция расшифровывает зашифрованный текст // и возвращает исходный текст string originalText(string cipher_text, string key) {
string orig_text;
for(inti = 0 ; i < cipher_text.size(); i++)
{
// преобразование в диапазоне 0-25
intx = (cipher_text[i] - key[i] + 26) %26;
// преобразовать в алфавиты (ASCII)
x += 'A';
orig_text.push_back(x);
}
returnorig_text;
}
// Программа драйвера для проверки вышеуказанной функции
intmain()
{
string str = "GEEKSFORGEEKS";
string keyword = "AYUSH";
string key = generateKey(str, keyword);
string cipher_text = cipherText(str, key);
cout << "Ciphertext : "
<< cipher_text << "\n";
cout << "Original/Decrypted Text : "
<< originalText(cipher_text, key);
return0;
}
Джава
// Java-код для реализации Vigenere Cipher
classGFG
{
// Эта функция генерирует ключ в // циклически, пока длина не будет // равно длине исходного текста
staticString generateKey(String str, String key)
{
intx = str.length();
for(inti = 0; ; i++)
{
if(x == i)
i = 0;
if(key.length() == str.length())
break;
key+=(key.charAt(i));
}
returnkey;
}
// Эта функция возвращает зашифрованный текст // генерируется с помощью ключа
staticString cipherText(String str, String key)
{
String cipher_text="";
for(inti = 0; i < str.length(); i++)
{
// преобразование в диапазоне 0-25
intx = (str.charAt(i) + key.charAt(i)) %26;
// преобразовать в алфавиты (ASCII)
x += 'A';
cipher_text+=(char)(x);
}
returncipher_text;
}
// Эта функция расшифровывает зашифрованный текст // и возвращает исходный текст
Эта статья предоставлена Аюшем Хандури . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.