logo

Vigenère Cipher

Vigenere Cipher ir alfabētiskā teksta šifrēšanas metode. Tas izmanto vienkāršu formu polialfabētiskā aizstāšana . Polialfabētiskais šifrs ir jebkurš šifrs, kura pamatā ir aizstāšana, izmantojot vairākus aizstāšanas alfabētus. Sākotnējā teksta šifrēšana tiek veikta, izmantojot Vigenère kvadrāts vai Vigenère galds .

  • Tabulu veido 26 reizes izrakstītie alfabēti dažādās rindās, katrs alfabēts ir cikliski nobīdīts pa kreisi, salīdzinot ar iepriekšējo alfabētu, kas atbilst 26 iespējamiem. Cēzara šifri .
  • Dažādos šifrēšanas procesa punktos šifrs izmanto atšķirīgu alfabētu no vienas rindas.
  • Katrā punktā izmantotais alfabēts ir atkarīgs no atkārtota atslēgvārda.

Piemērs:  

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.

Šifrēšana:



nolūks nodoms

Vienkāršā teksta G pirmais burts ir savienots pārī ar atslēgas pirmo burtu A. Tāpēc izmantojiet Vigenère kvadrāta G rindu un A kolonnu, proti, G. Līdzīgi vienkārša teksta otrajam burtam atslēgas otrais burts tiek izmantots E rindā esošais burts, bet kolonna Y ir C. Pārējais vienkāršais teksts ir šifrēts līdzīgā veidā. 

Šifrējamā tabula - Geeks

Vigenère_square_shading' src='//techcodeview.com/img/strings/18/vigen-re-cipher.webp' title=

Atšifrēšana:
Atšifrēšana tiek veikta, dodoties uz rindu tabulā, kas atbilst atslēgai, atrodot šifrētā teksta burta pozīciju šajā rindā un pēc tam izmantojot kolonnas etiķeti kā vienkāršu tekstu. Piemēram, A rindā (no AYUSH) šifrētais teksts G parādās kolonnā G, kas ir pirmais vienkāršā teksta burts. Tālāk mēs pārejam uz Y rindu (no AYUSH) atrodam šifrēto tekstu C, kas atrodams kolonnā E, tādējādi E ir otrais vienkāršā teksta burts.

Vēl viegla ieviešana varētu būt Vigenère vizualizācija algebriski, pārvēršot [A-Z] skaitļos [0-25]. 

    Encryption     
The plaintext(P) and key(K) are added modulo 26.
Ei = (Pi + Ki) mod 26

Decryption
Di = (Ei - Ki) mod 26

Piezīme: Diapzīmē vienkāršā teksta i-tās rakstzīmes nobīdi. Tāpat kā kompensēt A ir 0 un no B ir 1 un tā tālāk.

Zemāk ir idejas īstenošana. 

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 < 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; } 
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 < 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 29AjayKumar 
Python
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 both 
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 < 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
// 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(strkey) {    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(strkey) {  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_textkey) {  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)+'
'
);

Izvade
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS

Laika sarežģītība: O(n) kur n ir virknes garums (šeit str).

Telpas sarežģītība: O(n) šeit n ir virknes garums (šeit str).