logo

Cifrul Vigenère

Vigenere Cipher este o metodă de criptare a textului alfabetic. Folosește o formă simplă de substituție polialfabetică . Un cifru polialfabetic este orice cifru bazat pe substituție, folosind mai multe alfabete de substituție. 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 fiind deplasat ciclic la stânga în comparație cu alfabetul anterior, corespunzând celor 26 de Cifre Caesar posibile.
  • Î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 cheii. Așadar, 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, se folosește a doua literă a cheii, litera de la rândul E, iar coloana Y este C. Restul textului textul simplu este criptat într-un mod similar.

Tabel de criptat – Geeks



Vigenère_square_shading

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 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. Ei = (Pi + Ki) mod 26 Decryption Di = (Ei - Ki) mod 26>

Notă: Didenotă decalajul caracterului i al textului simplu. Ca offset de A este 0 și de B este 1 și așa mai departe.

Mai jos este implementarea ideii.

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; }>

>

>

Java




// 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>

>

>

expresie regulată în java
Ieșire

Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS>

Complexitatea timpului: O(n) , unde n este lungimea șirului (aici str).

Complexitatea spațiului: O(n) , aici n este lungimea șirului (aici str).