Úvod
Vigenerova šifra je algoritmus, ktorý sa používa na šifrovanie a dešifrovanie textu. Vigenerova šifra je algoritmus na šifrovanie abecedného textu, ktorý používa sériu prepletených cézarových šifier. Je založená na písmenách kľúčového slova. Je to príklad polyalfabetickej substitučnej šifry. Tento algoritmus je ľahko pochopiteľný a implementovateľný. Tento algoritmus bol prvýkrát opísaný v roku 1553 Giovan Battista Bellaso . Na šifrovanie a dešifrovanie textu používa Vigenerovu tabuľku alebo Vigenerov štvorec. Vigenerský stôl sa nazýva aj tabula recta.
Vigenerovu šifru vykonávajú dve metódy.
Metóda 1
Keď je uvedená tabuľka vigenere, šifrovanie a dešifrovanie sa pri tejto metóde vykoná pomocou tabuľky vigenere (matica 26 * 26).
Príklad: Čistý text je 'JAVATPOINT' a kľúč je 'BEST'.
Na vygenerovanie nového kľúča sa daný kľúč opakuje kruhovým spôsobom, pokiaľ sa dĺžka obyčajného textu nerovná dĺžke nového kľúča.
Šifrovanie
np.linspace
Prvé písmeno otvoreného textu sa kombinuje s prvým písmenom kľúča. Stĺpec obyčajného textu „J“ a riadok kľúča „B“ pretínajú abecedu „K“ v tabuľke vigenere, takže prvé písmeno šifrového textu je „K“.
Podobne je druhé písmeno otvoreného textu kombinované s druhým písmenom kľúča. Stĺpec obyčajného textu „A“ a riadok kľúča „E“ pretínajú abecedu „E“ v tabuľke vigenere, takže druhé písmeno šifrového textu je „E“.
Tento proces pokračuje nepretržite, kým sa nedokončí čistý text.
Šifrovaný text = KENTUTGBOX
Dešifrovanie
pridanie java do poľa
Dešifrovanie sa vykonáva riadkom kľúčov v tabuľke vigenere. Najprv vyberte riadok kľúčového písmena, nájdite pozíciu písmena šifrového textu v tomto riadku a potom vyberte označenie stĺpca zodpovedajúceho šifrovaného textu ako otvorený text.
Napríklad v riadku kľúča je „B“ a šifrový text je „K“ a toto písmeno šifrového textu sa zobrazuje v stĺpci „J“, čo znamená, že prvé písmeno otvoreného textu je „J“.
Ďalej, v riadku kľúča je „E“ a šifrový text je „E“ a toto písmeno šifrového textu sa objaví v stĺpci „A“, to znamená, že druhé písmeno otvoreného textu je „A“.
Tento proces pokračuje nepretržite, kým sa šifrovaný text nedokončí.
Obyčajný text = JAVATPOINT
Metóda 2
Ak nie je uvedená vigenerova tabuľka, šifrovanie a dešifrovanie sa vykonáva pomocou Vigenarovej algebraickej formuly v tejto metóde (premeňte písmená (A-Z) na čísla (0-25)).
Vzorec šifrovania je,
Ai= (Pi+ Ki) proti 26Vzorec dešifrovania je,
Di= (Ei- Ki) proti 26V každom prípade (Di) hodnota bude záporná (-ve), v tomto prípade k zápornej hodnote pripočítame 26.
Kde,
E označuje šifrovanie.
enkapsulačný program
D označuje dešifrovanie.
P označuje otvorený text.
K označuje kľúč.
Poznámka: „i“ označuje posun i-tého čísla písmen, ako je uvedené v tabuľke nižšie.
Príklad: Čistý text je 'JAVATPOINT' a kľúč je 'BEST'.
Šifrovanie: Ai= (Pi+ Ki) proti 26
Obyčajný text | J | A | V | A | T | P | O | ja | N | T |
Hodnota otvoreného textu (P) | 09 | 00 | dvadsaťjeden | 00 | 19 | pätnásť | 14 | 08 | 13 | 19 |
kľúč | B | A | S | T | B | A | S | T | B | A |
Hodnota kľúča (K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
Hodnota šifrového textu (E) | 10 | 04 | 13 | 19 | dvadsať | 19 | 06 | 01 | 14 | 23 |
Šifrovaný text | K | A | N | T | IN | T | G | B | O | X |
Dešifrovanie: Di= (Ei- Ki) proti 26
Ak sa hodnota akéhokoľvek prípadu (Di) stane zápornou (-ve), v tomto prípade k zápornej hodnote pripočítame 26. Napríklad tretie písmeno šifrového textu;
N = 13 a S = 18
Di= (Ei- Ki) proti 26
Di= (13 - 18) proti 26
zoznamy v jazyku Java
Di= -5 proti 26
Di= (-5 + 26) proti 26
Di= 21
Šifrovaný text | K | A | N | T | IN | T | G | B | O | X |
Hodnota šifrového textu (E) | 10 | 04 | 13 | 19 | dvadsať | 19 | 06 | 01 | 14 | 23 |
kľúč | B | A | S | T | B | A | S | T | B | A |
Hodnota kľúča (K) | 01 | 04 | 18 | 19 | 01 | 04 | 18 | 19 | 01 | 04 |
Hodnota otvoreného textu (P) | 09 | 00 | dvadsaťjeden | 00 | 19 | pätnásť | 14 | 08 | 13 | 19 |
Obyčajný text | J | A | V | A | T | P | O | ja | 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></=>
=>