Vigenerova šifra je metoda šifrování abecedního textu. Používá jednoduchou formu polyalfabetická substituce . Polyalfabetická šifra je jakákoli šifra založená na substituci s použitím vícenásobných substitučních abeced. Šifrování původního textu se provádí pomocí Vigenère čtverec nebo Vigenère stůl .
- Tabulka se skládá z abeced napsaných 26krát v různých řádcích, přičemž každá abeceda je ve srovnání s předchozí abecedou cyklicky posunuta doleva, což odpovídá 26 možným Caesarovým šiferám.
- V různých bodech procesu šifrování používá šifra jinou abecedu z jednoho z řádků.
- Abeceda použitá v každém bodě závisí na opakujícím se klíčovém slově.
Příklad:
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.>
Šifrování:
První písmeno otevřeného textu G je spárováno s A, prvním písmenem klíče. Použijte tedy řádek G a sloupec A Vigenèrova čtverce, konkrétně G. Podobně pro druhé písmeno otevřeného textu se použije druhé písmeno klíče, písmeno na řádku E a sloupec Y je C. Zbytek prostý text je zašifrován podobným způsobem.
Tabulka k šifrování – Geekové
Dešifrování:
Dešifrování se provádí tak, že přejdete na řádek v tabulce odpovídající klíči, vyhledáte pozici písmena šifrového textu v tomto řádku a poté použijete označení sloupce jako prostý text. Například v řádku A (z AYUSH) se šifrový text G objeví ve sloupci G, což je první písmeno otevřeného textu. Dále přejdeme na řádek Y (z AYUSH), kde najdeme šifrový text C, který se nachází ve sloupci E, takže E je druhé písmeno otevřeného textu.
Další snadná implementace by mohlo představovat Vigenèrovu algebraickou vizualizaci převodem [A-Z] na čísla [0–25].
Encryption The plaintext(P) and key(K) are added modulo 26. Ei = (Pi + Ki) mod 26 Decryption Di = (Ei - Ki) mod 26>
Poznámka: Dioznačuje posun i-tého znaku otevřeného textu. Jako offset A je 0 a of B je 1 a tak dále.
Níže je realizace nápadu.
C++
// C++ code to implement Vigenere Cipher> #include> using> namespace> std;> // This function generates the key in> // a cyclic manner until it's length isn't> // 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]);> > }> > return> key;> }> // 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 { // 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 { // 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; }> |
>
>
Jáva
// 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));> > }> > return> key;> }> // 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 { // 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 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 { 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]);> > }> > return> key;> }> // 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 { // 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 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 */> |
>
>
Javascript
> // JavaScript 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> function> generateKey(str,key)> {> > > key=key.split(> ''> );> > if> (str.length == key.length)> > return> key.join(> ''> );> > else> > {> > let temp=key.length;> > for> (let i = 0;i<(str.length-temp) ; i++)> > {> > > key.push(key[i % ((key).length)])> > }> > }> > return> key.join(> ''> );> }> // This function returns the encrypted text> // generated with the help of the key> function> cipherText(str,key)> {> > let cipher_text=> ''> ;> > > for> (let i = 0; i { // converting in range 0-25 let x = (str[i].charCodeAt(0) + key[i].charCodeAt(0)) %26; // convert into alphabets(ASCII) x += 'A'.charCodeAt(0); cipher_text+=String.fromCharCode(x); } return cipher_text; } // This function decrypts the encrypted text // and returns the original text function originalText(cipher_text,key) { let orig_text=''; for (let i = 0 ; i { // converting in range 0-25 let x = (cipher_text[i].charCodeAt(0) - key[i].charCodeAt(0) + 26) %26; // convert into alphabets(ASCII) x += 'A'.charCodeAt(0); orig_text+=String.fromCharCode(x); } return orig_text; } // This function will convert the lower // case character to Upper case function LowerToUpper(s) { let str =(s).split(''); for(let i = 0; i { if(s[i] == s[i].toLowerCase()) { str[i] = s[i].toUpperCase(); } } s = str.toString(); return s; } // Driver code let str = 'GEEKSFORGEEKS'; let keyword = 'AYUSH'; let key = generateKey(str, keyword); let cipher_text = cipherText(str, key); document.write('Ciphertext : ' + cipher_text + ' '); document.write('Original/Decrypted Text : ' + originalText(cipher_text, key)+' '); // This code is contributed by rag2127> |
>
>
jarní mrakVýstup
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS>
Časová složitost: O(n) , kde n je délka řetězce (zde str).
Vesmírná složitost :O(n) , zde n je délka řetězce (zde str).