Szyfr Vigenère’a
Szyfr Vigenere’a to metoda szyfrowania tekstu alfabetycznego. Wykorzystuje prostą formę podstawienie polialfabetyczne . Szyfr polialfabetyczny to dowolny szyfr oparty na podstawieniu przy użyciu wielokrotnych alfabetów podstawieniowych. Szyfrowanie oryginalnego tekstu odbywa się za pomocą metody Kwadrat Vigenère lub stół Vigenère .
- Tabela składa się z alfabetów zapisanych 26 razy w różnych rzędach, każdy alfabet przesunięty cyklicznie w lewo w stosunku do poprzedniego alfabetu, co odpowiada 26 możliwym Szyfry Cezara .
- Na różnych etapach procesu szyfrowania szyfr używa innego alfabetu z jednego z wierszy.
- Alfabet używany w każdym punkcie zależy od powtarzającego się słowa kluczowego.
Przykład:
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.Szyfrowanie:
Pierwsza litera tekstu jawnego G jest połączona z A, pierwszą literą klucza. Użyj więc wiersza G i kolumny A kwadratu Vigenère'a, a mianowicie G. Podobnie dla drugiej litery tekstu jawnego, druga litera klucza jest używana, litera w wierszu E, a kolumna Y to C. Pozostała część tekstu jawnego jest zaszyfrowana w podobny sposób.
Tabela do zaszyfrowania - Geeks
![]()
Deszyfrowanie:
Deszyfrowanie odbywa się poprzez przejście do wiersza tabeli odpowiadającego kluczowi, znalezienie pozycji litery szyfrogramu w tym wierszu, a następnie użycie etykiety kolumny jako tekstu jawnego. Na przykład w wierszu A (z AYUSH) zaszyfrowany tekst G pojawia się w kolumnie G, która jest pierwszą literą tekstu jawnego. Następnie przechodzimy do wiersza Y (od AYUSH) i lokalizujemy zaszyfrowany tekst C, który znajduje się w kolumnie E, zatem E jest drugą literą tekstu jawnego.Więcej łatwe wdrożenie może polegać na algebraicznej wizualizacji Vigenère'a poprzez konwersję [A-Z] na liczby [0–25].
Encryption
The plaintext(P) and key(K) are added modulo 26.
E i = (P i + K i ) mod 26
Decryption
D i = (E i - K i ) mod 26Notatka: D I oznacza przesunięcie i-tego znaku tekstu jawnego. Podobnie jak przesunięcie A wynosi 0 i B wynosi 1 i tak dalej.
Poniżej realizacja pomysłu.
C++Java// C++ code to implement Vigenere Cipher #includeusing 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 < str . size (); 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 < cipher_text . size (); 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' ; if ( any_of ( str . begin () str . end () :: islower )) transform ( str . begin () str . end () str . begin () :: toupper ); if ( any_of ( keyword . begin () keyword . end () :: islower )) transform ( keyword . begin () keyword . end () keyword . begin () :: toupper ); 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 ; } Python// 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 < str . length (); 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 < cipher_text . length () && i < key . length (); 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 < s . length (); 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 + 'n' ); System . out . println ( 'Original/Decrypted Text : ' + originalText ( cipher_text key )); } } // This code has been contributed by 29AjayKumarC#def generate_key ( msg key ): key = list ( key ) if len ( msg ) == len ( key ): return key else : for i in range ( len ( msg ) - len ( key )): key . append ( key [ i % len ( key )]) return '' . join ( key ) def encrypt_vigenere ( msg key ): encrypted_text = [] key = generate_key ( msg key ) for i in range ( len ( msg )): char = msg [ i ] if char . isupper (): encrypted_char = chr (( ord ( char ) + ord ( key [ i ]) - 2 * ord ( 'A' )) % 26 + ord ( 'A' )) elif char . islower (): encrypted_char = chr (( ord ( char ) + ord ( key [ i ]) - 2 * ord ( 'a' )) % 26 + ord ( 'a' )) else : encrypted_char = char encrypted_text . append ( encrypted_char ) return '' . join ( encrypted_text ) def decrypt_vigenere ( msg key ): decrypted_text = [] key = generate_key ( msg key ) for i in range ( len ( msg )): char = msg [ i ] if char . isupper (): decrypted_char = chr (( ord ( char ) - ord ( key [ i ]) + 26 ) % 26 + ord ( 'A' )) elif char . islower (): decrypted_char = chr (( ord ( char ) - ord ( key [ i ]) + 26 ) % 26 + ord ( 'a' )) else : decrypted_char = char decrypted_text . append ( decrypted_char ) return '' . join ( decrypted_text ) # Example usage text_to_encrypt = 'Hello World!' key = 'KEY' encrypted_text = encrypt_vigenere ( text_to_encrypt key ) print ( f 'Encrypted Text: { encrypted_text } ' ) decrypted_text = decrypt_vigenere ( encrypted_text key ) print ( f 'Decrypted Text: { decrypted_text } ' ) #previous code was only support the upper case letters #this code can be apply on bothJavascript// 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 < str . Length ; 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 < cipher_text . Length && i < key . Length ; 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' ; str = str . ToUpper (); keyword = keyword . ToUpper (); 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 )); } } /* This code contributed by PrinciRaj1992 */// 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 < str . length ; 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 < cipher_text . length ; 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 < s . length ; 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' ; str = str . toUpperCase (); keyword = keyword . toUpperCase (); let key = generateKey ( str keyword ); let cipher_text = cipherText ( str key ); console . log ( 'Ciphertext : ' + cipher_text + '
' ); console . log ( 'Original/Decrypted Text : ' + originalText ( cipher_text key ) + '
' );
WyjścieCiphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKSZłożoność czasowa: O(n) gdzie n jest długością łańcucha (tutaj str).
Złożoność przestrzenna: O(n) tutaj n jest długością łańcucha (tutaj str).