Cifrul Vigenère
Vigenere Cipher este o metodă de criptare a textului alfabetic. Folosește o formă simplă de substituție polialfabetică . Un cifr polialfabetic este orice cifru bazat pe substituție folosind alfabete de substituție multiple. Criptarea textului original se face folosind Vigenère pătrat sau masă Vigenère .
- Tabelul constă din alfabetele scrise de 26 de ori pe rânduri diferite, fiecare alfabet deplasat ciclic spre stânga în comparație cu alfabetul anterior corespunzător celor 26 posibile. Cifrele Caesar .
- În diferite momente ale procesului de criptare, cifrul folosește un alfabet diferit de unul dintre rânduri.
- Alfabetul folosit în fiecare punct depinde de un cuvânt cheie care se repetă.
Exemplu:
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.Criptare:
Prima literă a textului simplu G este asociată cu A prima literă a tastei. Deci, utilizați rândul G și coloana A din pătratul Vigenère și anume G. În mod similar, pentru a doua literă a textului simplu, a doua literă a cheii este folosită litera de la rândul E, iar coloana Y este C. Restul textului simplu este încriptat într-un mod similar.
Tabel de criptat - Geeks
![]()
Decriptare:
Decriptarea se realizează mergând la rândul din tabel corespunzător cheii, găsind poziția literei de text cifrat în acest rând și apoi folosind eticheta coloanei ca text simplu. De exemplu, în rândul A (din AYUSH) textul cifrat G apare în coloana G care este prima literă de text simplu. Apoi mergem la rândul Y (din AYUSH) găsim textul cifrat C care se găsește în coloana E, astfel încât E este a doua literă de text simplu.Un mai mult implementare usoara ar putea fi vizualizarea Vigenère algebric prin conversia [A-Z] în numere [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 26Nota: D i denotă decalajul caracterului i al textului simplu. Ca offset de O este 0 și de B este 1 și așa mai departe.
Mai jos este implementarea ideii.
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 ) + '
' );
IeșireCiphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKSComplexitatea timpului: O(n) unde n este lungimea șirului (aici str).
Complexitatea spațiului: O(n) aici n este lungimea șirului (aici str).