Рубрики

Vigenère Cipher

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>

using namespace std;

  
// Эта функция генерирует ключ в
// циклически, пока длина не будет
// равно длине исходного текста
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;

}

  
// Эта функция возвращает зашифрованный текст
// генерируется с помощью ключа
string cipherText(string str, string key)
{

    string cipher_text;

  

    for (int i = 0; i < str.size(); i++)

    {

        // преобразование в диапазоне 0-25

        int x = (str[i] + key[i]) %26;

  

        // преобразовать в алфавиты (ASCII)

        x += 'A';

  

        cipher_text.push_back(x);

    }

    return cipher_text;

}

  
// Эта функция расшифровывает зашифрованный текст
// и возвращает исходный текст
string originalText(string cipher_text, string key)
{

    string orig_text;

  

    for (int i = 0 ; i < cipher_text.size(); i++)

    {

        // преобразование в диапазоне 0-25

        int x = (cipher_text[i] - key[i] + 26) %26;

  

        // преобразовать в алфавиты (ASCII)

        x += 'A';

        orig_text.push_back(x);

    }

    return orig_text;

}

  
// Программа драйвера для проверки вышеуказанной функции

int main()

{

    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);

    return 0;

}

Джава

// Java-код для реализации Vigenere Cipher

  

class GFG 

{

  
// Эта функция генерирует ключ в
// циклически, пока длина не будет
// равно длине исходного текста

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;

}

  
// Эта функция возвращает зашифрованный текст
// генерируется с помощью ключа

static String cipherText(String str, String key)

{

    String cipher_text="";

  

    for (int i = 0; i < str.length(); i++)

    {

        // преобразование в диапазоне 0-25

        int x = (str.charAt(i) + key.charAt(i)) %26;

  

        // преобразовать в алфавиты (ASCII)

        x += 'A';

  

        cipher_text+=(char)(x);

    }

    return cipher_text;

}

  
// Эта функция расшифровывает зашифрованный текст
// и возвращает исходный текст

static String originalText(String cipher_text, String key)

{

    String orig_text="";

  

    for (int i = 0 ; i < cipher_text.length() && 

                            i < key.length(); i++)

    {

        // преобразование в диапазоне 0-25

        int x = (cipher_text.charAt(i) - 

                    key.charAt(i) + 26) %26;

  

        // преобразовать в алфавиты (ASCII)

        x += 'A';

        orig_text+=(char)(x);

    }

    return orig_text;

}

  
// Код драйвера

public static void main(String[] args) 

{

    String str = "GEEKSFORGEEKS";

    String keyword = "AYUSH";

  

    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));

    }

}

  
// Этот код предоставлен 29AjayKumar

python3

# Python-код для реализации
# Vigenere Cipher

  
# Эта функция генерирует
# циклически нажимайте до
# его длина не равна
# длина исходного текста

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))

      
# Эта функция возвращает
# зашифрованный текст генерируется
# с помощью ключа

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))

      
# Эта функция расшифровывает
# зашифрованный текст и возврат
# оригинальный текст

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))

      
# Код драйвера

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))

  
# Этот код добавлен
# Пратиком Сомванши

C #

// C # код для реализации Vigenere Cipher

using System;

      

class GFG 

{

  
// Эта функция генерирует ключ в
// циклически, пока длина не будет
// равно длине исходного текста

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;

}

  
// Эта функция возвращает зашифрованный текст
// генерируется с помощью ключа

static String cipherText(String str, String key)

{

    String cipher_text="";

  

    for (int i = 0; i < str.Length; i++)

    {

        // преобразование в диапазоне 0-25

        int x = (str[i] + key[i]) %26;

  

        // преобразовать в алфавиты (ASCII)

        x += 'A';

  

        cipher_text+=(char)(x);

    }

    return cipher_text;

}

  
// Эта функция расшифровывает зашифрованный текст
// и возвращает исходный текст

static String originalText(String cipher_text, String key)

{

    String orig_text="";

  

    for (int i = 0 ; i < cipher_text.Length && 

                            i < key.Length; i++)

    {

        // преобразование в диапазоне 0-25

        int x = (cipher_text[i] - 

                    key[i] + 26) %26;

  

        // преобразовать в алфавиты (ASCII)

        x += 'A';

        orig_text+=(char)(x);

    }

    return orig_text;

}

  
// Код драйвера

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 + "\n");

  

    Console.WriteLine("Original/Decrypted Text : "

        + originalText(cipher_text, key));

    }

}

  
/ * Этот код предоставлен PrinciRaj1992 * /

Выход:

Ciphertext : GCYCZFMLYLEIM
Original/Decrypted Text : GEEKSFORGEEKS

Ссылка: https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher

Эта статья предоставлена Аюшем Хандури . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Vigenère Cipher

0.00 (0%) 0 votes