вступ
Шифр Вігенера — це алгоритм, який використовується для шифрування та дешифрування тексту. Шифр Вігенера — це алгоритм шифрування алфавітного тексту, який використовує серію переплетених шифрів Цезаря. Він заснований на буквах ключового слова. Це приклад поліалфавітного шифру підстановки. Цей алгоритм простий для розуміння та реалізації. Цей алгоритм був вперше описаний в 1553 році Джован Баттіста Белласо . Для шифрування та дешифрування тексту використовується таблиця Віженера або квадрат Віженера. Таблицю Віженера також називають tabula recta.
Два методи виконують шифр Віженера.
Спосіб 1
Коли надається таблиця Віженера, шифрування та дешифрування виконуються за допомогою таблиці Віженера (матриця 26 * 26) у цьому методі.
Приклад: відкритий текст - 'JAVATPOINT', а ключ - 'BEST'.
Щоб створити новий ключ, заданий ключ повторюється циклічно, доки довжина відкритого тексту не дорівнює новому ключу.
Шифрування
c++ розділення рядка
Перша літера відкритого тексту поєднується з першою літерою ключа. Стовпець простого тексту «J» і рядок ключа «B» перетинають алфавіт «K» у таблиці Віженера, тому перша літера зашифрованого тексту — «K».
Подібним чином друга літера відкритого тексту поєднується з другою літерою ключа. Стовпець простого тексту «A» та рядок ключа «E» перетинають алфавіт «E» у таблиці Віженера, тому друга літера зашифрованого тексту є «E».
Цей процес триває безперервно, доки відкритий текст не буде завершено.
Зашифрований текст = KENTUTGBOX
Розшифровка
Розшифровка виконується за допомогою рядка ключів у таблиці Vigenere. Спочатку виберіть рядок ключа, знайдіть позицію літери зашифрованого тексту в цьому рядку, а потім виберіть мітку стовпця відповідного зашифрованого тексту як відкритий текст.
Наприклад, у рядку ключа є 'B', а зашифрований текст - 'K', і ця літера зашифрованого тексту з'являється в стовпці 'J', це означає, що перша літера відкритого тексту - 'J'.
загальна помилка захисту
Далі в рядку ключа є «E», а зашифрований текст — «E», і ця літера зашифрованого тексту з’являється в стовпці «A», це означає, що другою літерою відкритого тексту є «A».
Цей процес триває безперервно, доки не буде закінчено зашифрований текст.
Простий текст = JAVATPOINT
Спосіб 2
Якщо таблицю Віженера не надано, шифрування та дешифрування виконується за алгебраїчною формулою Вігенара в цьому методі (перетворіть літери (A-Z) на цифри (0-25)).
Формула шифрування така:
Іi= (Пi+ Кi) проти 26Формула дешифрування така:
Дi= (Еi- Кi) проти 26У будь-якому випадку (Di) значення стає від’ємним (-ve), у цьому випадку ми додамо 26 до від’ємного значення.
Де,
E позначає шифрування.
приклад java lambda
D позначає розшифровку.
P позначає відкритий текст.
K позначає ключ.
Примітка: 'i' позначає зсув i-ї кількості літер, як показано в таблиці нижче.
Приклад: відкритий текст - 'JAVATPOINT', а ключ - 'BEST'.
es5 проти es6
Шифрування: Іi= (Пi+ Кi) проти 26
Простий текст | Дж | А | IN | А | Т | П | О | я | Н | Т |
Значення відкритого тексту (P) | 09 | 00 | двадцять один | 00 | 19 | п'ятнадцять | 14 | 08 | 13 | 19 |
ключ | Б | І | С | Т | Б | І | С | Т | Б | І |
Ключове значення (K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
Значення зашифрованого тексту (E) | 10 | 04 | 13 | 19 | двадцять | 19 | 06 | 01 | 14 | 23 |
Зашифрований текст | К | І | Н | Т | IN | Т | Г | Б | О | X |
Розшифровка: Дi= (Еi- Кi) проти 26
Якщо будь-яке значення case (Di) стає від’ємним (-ve), у цьому випадку ми додамо 26 до від’ємного значення. Мовляв, третя літера зашифрованого тексту;
N = 13 і S = 18
Дi= (Еi- Кi) проти 26
Дi= (13 - 18) проти 26
Дi= -5 проти 26
Дi= (-5 + 26) проти 26
Дi= 21
Зашифрований текст | К | І | Н | Т | IN | Т | Г | Б | О | X |
Значення зашифрованого тексту (E) | 10 | 04 | 13 | 19 | двадцять | 19 | 06 | 01 | 14 | 23 |
ключ | Б | І | С | Т | Б | І | С | Т | Б | І |
Ключове значення (K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
Значення відкритого тексту (P) | 09 | 00 | двадцять один | 00 | 19 | п'ятнадцять | 14 | 08 | 13 | 19 |
Простий текст | Дж | А | IN | А | Т | П | О | я | Н | Т |
програма:
мова C
#include #include using namespace std; int main() { Vigenere cipher('VIGENERECIPHER'); string original = 'I AM INDIAN'; string encrypted = cipher.encrypt(original); string decrypted = cipher.decrypt(encrypted); cout << original << endl; cout << 'Encrypted: ' << encrypted << endl; cout << 'Decrypted: ' << decrypted << endl; } class Vigenere { public: string key; Vigenere(string key) { for (int i = 0; i = 'A' && key[i] key += key[i]; else if (key[i]>= 'a' && key[i] key += key[i] + 'A' - 'a'; } } string encrypt(string text) { string out; for (int i = 0, j = 0; i = 'a' && c <= 2 26 'z') c +="A" - 'a'; else if (c continue; out key[j] * 'a') % j="(j" 1) key.length(); } return out; string decrypt(string text) { for (int i="0," && <="z" ) 26) }; pre> <p> <strong>Output:</strong> </p> <pre> I AM INDIAN Encrypted: SDERFGTUJ Decrypted: IAMINDIAN </pre> <hr></=>
=>