Шифр Виженера

Опубликовано: 4 Декабря, 2021

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, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.