Vigenère-cijfer

Vigenère-cijfer

Vigenere Cipher is een methode voor het coderen van alfabetische tekst. Het maakt gebruik van een eenvoudige vorm van polyalfabetische vervanging . Een polyalfabetisch cijfer is elk cijfer dat is gebaseerd op vervanging met behulp van meerdere vervangingsalfabetten. De codering van de originele tekst gebeurt met behulp van de Vigenère vierkant of Vigenère tafel .

  • De tabel bestaat uit de alfabetten die 26 keer in verschillende rijen zijn geschreven. Elk alfabet is cyclisch naar links verschoven in vergelijking met het vorige alfabet dat overeenkomt met de 26 mogelijke Caesar-cijfers .
  • Op verschillende punten in het versleutelingsproces gebruikt het cijfer een ander alfabet dan een van de rijen.
  • Het alfabet dat op elk punt wordt gebruikt, is afhankelijk van een herhalend trefwoord.

Voorbeeld:  

 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.

Encryptie:

De eerste letter van de leesbare tekst G is gekoppeld aan A, de eerste letter van de sleutel. Gebruik dus rij G en kolom A van het Vigenère-vierkant, namelijk G. Op dezelfde manier wordt voor de tweede letter van de leesbare tekst de tweede letter van de sleutel gebruikt, de letter in rij E en kolom Y is C. De rest van de leesbare tekst wordt op een vergelijkbare manier gecodeerd. 

Tabel om te coderen - Geeks

Vigenère_vierkante_schaduw

Decryptie:
Decodering wordt uitgevoerd door naar de rij in de tabel te gaan die overeenkomt met de sleutel, de positie van de cijfertekstletter in deze rij te vinden en vervolgens het label van de kolom als leesbare tekst te gebruiken. In rij A (van AYUSH) verschijnt bijvoorbeeld de cijfertekst G in kolom G, wat de eerste leesbare letter is. Vervolgens gaan we naar rij Y (van AYUSH) en zoeken de cijfertekst C die in kolom E staat, dus E is de tweede platte tekstletter.

Een meer eenvoudige implementatie zou kunnen zijn om Vigenère algebraïsch te visualiseren door [A-Z] om te zetten in getallen [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 26

Opmerking: D i geeft de offset aan van het i-de teken van de leesbare tekst. Zoals compensatie van A is 0 en van B is 1 enzovoort.

Hieronder vindt u de implementatie van het idee. 

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  (  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 ) + '
'
);

Uitvoer
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS 

Tijdcomplexiteit: O(n) waarbij n de lengte van de string is (hier str).

Ruimtecomplexiteit: O(n) hier is n de lengte van de string (hier str).