Szyfr Vigenère’a

Szyfr Vigenère’a

Szyfr Vigenere’a to metoda szyfrowania tekstu alfabetycznego. Wykorzystuje prostą formę podstawienie polialfabetyczne . Szyfr polialfabetyczny to dowolny szyfr oparty na podstawieniu przy użyciu wielokrotnych alfabetów podstawieniowych. Szyfrowanie oryginalnego tekstu odbywa się za pomocą metody Kwadrat Vigenère lub stół Vigenère .

  • Tabela składa się z alfabetów zapisanych 26 razy w różnych rzędach, każdy alfabet przesunięty cyklicznie w lewo w stosunku do poprzedniego alfabetu, co odpowiada 26 możliwym Szyfry Cezara .
  • Na różnych etapach procesu szyfrowania szyfr używa innego alfabetu z jednego z wierszy.
  • Alfabet używany w każdym punkcie zależy od powtarzającego się słowa kluczowego.

Przykład:  

 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.

Szyfrowanie:



Pierwsza litera tekstu jawnego G jest połączona z A, pierwszą literą klucza. Użyj więc wiersza G i kolumny A kwadratu Vigenère'a, a mianowicie G. Podobnie dla drugiej litery tekstu jawnego, druga litera klucza jest używana, litera w wierszu E, a kolumna Y to C. Pozostała część tekstu jawnego jest zaszyfrowana w podobny sposób. 

Tabela do zaszyfrowania - Geeks

Vigenère_square_shading

Deszyfrowanie:
Deszyfrowanie odbywa się poprzez przejście do wiersza tabeli odpowiadającego kluczowi, znalezienie pozycji litery szyfrogramu w tym wierszu, a następnie użycie etykiety kolumny jako tekstu jawnego. Na przykład w wierszu A (z AYUSH) zaszyfrowany tekst G pojawia się w kolumnie G, która jest pierwszą literą tekstu jawnego. Następnie przechodzimy do wiersza Y (od AYUSH) i lokalizujemy zaszyfrowany tekst C, który znajduje się w kolumnie E, zatem E jest drugą literą tekstu jawnego.

Więcej łatwe wdrożenie może polegać na algebraicznej wizualizacji Vigenère'a poprzez konwersję [A-Z] na liczby [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

Notatka: D I oznacza przesunięcie i-tego znaku tekstu jawnego. Podobnie jak przesunięcie A wynosi 0 i B wynosi 1 i tak dalej.

Poniżej realizacja pomysłu. 

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

Wyjście
Ciphertext : GCYCZFMLYLEIM Original/Decrypted Text : GEEKSFORGEEKS 

Złożoność czasowa: O(n) gdzie n jest długością łańcucha (tutaj str).

Złożoność przestrzenna: O(n) tutaj n jest długością łańcucha (tutaj str).

 


Najpopularniejsze Artykuły

Kategoria

Ciekawe Artykuły