Vigenèreova šifra
Vigenere Cipher je metoda šifriranja abecednog teksta. Koristi jednostavan oblik polialfabetska zamjena . Polialfabetska šifra je svaka šifra koja se temelji na zamjeni koristeći više zamjenskih abeceda. Šifriranje izvornog teksta vrši se pomoću Vigenèreov kvadrat ili Vigenèreov stol .
- Tablica se sastoji od alfabeta ispisanih 26 puta u različitim redovima, svaki alfabet ciklički pomaknut ulijevo u usporedbi s prethodnim alfabetom što odgovara 26 mogućih Cezarove šifre .
- U različitim točkama procesa šifriranja šifra koristi različitu abecedu od jednog od redaka.
- Abeceda koja se koristi u svakoj točki ovisi o ključnoj riječi koja se ponavlja.
Primjer:
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.Enkripcija:
Prvo slovo otvorenog teksta G upareno je s A, prvim slovom ključa. Dakle, koristite redak G i stupac A Vigenèreovog kvadrata, točnije G. Slično za drugo slovo otvorenog teksta, drugo slovo ključa koristi se slovo u retku E, a stupac Y je C. Ostatak otvorenog teksta je šifriran na sličan način.
Tablica za šifriranje - štreberi
![]()
Dešifriranje:
Dešifriranje se izvodi odlaskom na redak u tablici koji odgovara ključu pronalaženjem položaja slova šifriranog teksta u tom retku i zatim korištenjem oznake stupca kao otvorenog teksta. Na primjer, u retku A (iz AYUSH-a) šifrirani tekst G pojavljuje se u stupcu G koji je prvo slovo otvorenog teksta. Zatim idemo u red Y (iz AYUSH) i lociramo šifrirani tekst C koji se nalazi u stupcu E, tako da je E drugo slovo otvorenog teksta.A više laka implementacija moglo bi biti algebarski vizualizirati Vigenèrea pretvaranjem [A-Z] u brojeve [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 26Bilješka: D ja označava pomak i-tog znaka otvorenog teksta. Kao pomak A je 0 i od B je 1 i tako dalje.
U nastavku je implementacija ideje.
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 ) + '
' );
IzlazCiphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKSVremenska složenost: O(n) gdje je n duljina niza (ovdje str).
Složenost prostora: O(n) ovdje je n duljina niza (ovdje str).