Úvod
Šifra vigenere je algoritmus, který se používá k šifrování a dešifrování textu. Šifra vigenere je algoritmus šifrování abecedního textu, který používá řadu propletených caesarových šifer. Je založen na písmenech klíčového slova. Je to příklad polyalfabetické substituční šifry. Tento algoritmus je snadno pochopitelný a implementovatelný. Tento algoritmus byl poprvé popsán v roce 1553 Giovan Battista Bellaso . Pro šifrování a dešifrování textu používá Vigenerovu tabulku nebo Vigenerův čtverec. Vigenere stůl se také nazývá tabula recta.
Vigenerovu šifru provádějí dvě metody.
Metoda 1
Když je uvedena vigenere tabulka, šifrování a dešifrování se provádí pomocí vigenere tabulky (matice 26 * 26) v této metodě.
Příklad: Otevřený text je 'JAVATPOINT' a klíč je 'BEST'.
Pro vygenerování nového klíče se daný klíč v kruhu opakuje, pokud se délka prostého textu nerovná délce nového klíče.
Šifrování
třídit haldy
První písmeno otevřeného textu je kombinováno s prvním písmenem klíče. Sloupec prostého textu „J“ a řádek klíče „B“ protíná abecedu „K“ v tabulce vigenere, takže první písmeno šifrového textu je „K“.
Podobně je druhé písmeno otevřeného textu kombinováno s druhým písmenem klíče. Sloupec prostého textu „A“ a řádek klíče „E“ protíná abecedu „E“ v tabulce vigenere, takže druhé písmeno šifrového textu je „E“.
Tento proces pokračuje nepřetržitě, dokud není prostý text dokončen.
Šifrovaný text = KENTUTGBOX
Dešifrování
Dešifrování se provádí pomocí řady klíčů v tabulce vigenere. Nejprve vyberte řádek klíčového písmene, najděte pozici písmena šifrového textu v tomto řádku a poté vyberte označení sloupce odpovídajícího šifrovaného textu jako prostý text.
Například v řádku klíče je „B“ a šifrový text je „K“ a toto písmeno šifrového textu se objeví ve sloupci „J“, to znamená, že první písmeno otevřeného textu je „J“.
Dále je v řádku klíče „E“ a šifrový text je „E“ a toto písmeno šifrového textu se objeví ve sloupci „A“, to znamená, že druhé písmeno otevřeného textu je „A“.
algoritmus 'prim''
Tento proces pokračuje nepřetržitě, dokud není šifrovaný text dokončen.
Prostý text = JAVATPOINT
Metoda 2
Není-li uvedena vigenere tabulka, šifrování a dešifrování se provádí touto metodou podle Vigenarova algebraického vzorce (převeďte písmena (A-Z) na čísla (0-25)).
Vzorec šifrování je,
Ai= (Pi+ Ki) proti 26Vzorec dešifrování je,
Di= (Ei- Ki) proti 26V každém případě (Di) hodnota bude záporná (-ve), v tomto případě k záporné hodnotě přidáme 26.
Kde,
E označuje šifrování.
Java třídí seznam
D označuje dešifrování.
P označuje prostý text.
K označuje klíč.
Poznámka: „i“ označuje posun i-tého čísla písmen, jak je uvedeno v tabulce níže.
Příklad: Otevřený text je 'JAVATPOINT' a klíč je 'BEST'.
Šifrování: Ai= (Pi+ Ki) proti 26
kat timpf čisté jmění
Prostý text | J | A | V | A | T | P | Ó | já | N | T |
Hodnota prostého textu (P) | 09 | 00 | dvacet jedna | 00 | 19 | patnáct | 14 | 08 | 13 | 19 |
Klíč | B | A | S | T | B | A | S | T | B | A |
Hodnota klíče (K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
Hodnota šifrovaného textu (E) | 10 | 04 | 13 | 19 | dvacet | 19 | 06 | 01 | 14 | 23 |
Šifrovaný text | K | A | N | T | V | T | G | B | Ó | X |
Dešifrování: Di= (Ei- Ki) proti 26
Pokud se hodnota libovolného případu (Di) stane zápornou (-ve), v tomto případě k záporné hodnotě přidáme 26. Jako třetí písmeno šifrového textu;
N = 13 a S = 18
Di= (Ei- Ki) proti 26
Di= (13 - 18) proti 26
Di= -5 proti 26
Di= (-5 + 26) proti 26
Di= 21
Šifrovaný text | K | A | N | T | V | T | G | B | Ó | X |
Hodnota šifrovaného textu (E) | 10 | 04 | 13 | 19 | dvacet | 19 | 06 | 01 | 14 | 23 |
Klíč | B | A | S | T | B | A | S | T | B | A |
Hodnota klíče (K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
Hodnota prostého textu (P) | 09 | 00 | dvacet jedna | 00 | 19 | patnáct | 14 | 08 | 13 | 19 |
Prostý text | J | A | V | A | T | P | Ó | já | N | T |
Program:
jazyk 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></=>
=>