Cifrado de transposición en columnas

Cifrado de transposición en columnas

Dado un mensaje de texto plano y una clave numérica, cifra/descifra el texto dado utilizando el cifrado de transposición en columnas. El cifrado de transposición en columnas es una forma de cifrado de transposición como Cifrado de valla ferroviaria . La transposición en columnas implica escribir el texto sin formato en filas y luego leer el texto cifrado en columnas una por una.

Ejemplos:

    Encryption     Input : Geeks for Geeks Key = HACK Output : e kefGsGsrekoe_      Decryption     Input : e kefGsGsrekoe_ Key = HACK Output : Geeks for Geeks      Encryption     Input : Geeks on work Key = HACK Output : e w_eoo_Gs kknr_      Decryption     Input : e w_eoo_Gs kknr_ Key = HACK Output : Geeks on work   

Cifrado

En un cifrado por transposición, el orden de los alfabetos se reorganiza para obtener el texto cifrado.

  1. El mensaje se escribe en filas de una longitud fija y luego se lee nuevamente columna por columna y las columnas se eligen en algún orden codificado.
  2. El ancho de las filas y la permutación de las columnas suelen definirse mediante una palabra clave.
  3. Por ejemplo, la palabra HACK tiene una longitud de 4 (por lo que las filas tienen una longitud de 4) y la permutación se define por el orden alfabético de las letras de la palabra clave. En este caso el orden sería '3 1 2 4'.
  4. Los espacios libres se rellenan con valores nulos, se dejan en blanco o se colocan mediante un carácter (Ejemplo: _).
  5. Finalmente, el mensaje se lee en columnas en el orden especificado por la palabra clave.
cifrado-de-transposición-columna

Descifrado

  1. Para descifrarlo, el destinatario debe calcular la longitud de las columnas dividiendo la longitud del mensaje por la longitud de la clave.
  2. Luego escriba el mensaje en columnas nuevamente y luego reordene las columnas reformando la palabra clave.
C++
   // CPP program for illustrating   // Columnar Transposition Cipher   #include          using     namespace     std  ;   // Encription function   string     Encryption  (  int     no_rows       int     len_key       int     len_msg        string     msg       int     col_val  [])   {      int     x     =     0  ;      char     enc_mat  [  no_rows     +     1  ][  len_key  ];      // creating the matrix      for     (  int     i     =     0  ;     i      <     no_rows     +     1  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     len_key  ;     j  ++  )     {      // initializes the positions with '_' after the      // end of message      if     (  x     >=     len_msg  )     {      enc_mat  [  i  ][  j  ]     =     '_'  ;      }      else     {      enc_mat  [  i  ][  j  ]     =     msg  [  x  ];      }      x  ++  ;      }      }      int     t     =     1  ;      string     cipher     =     ''  ;      // finding the cipher text according to the value of      // col_val matrix      while     (  t      <=     len_key  )     {      for     (  int     i     =     0  ;     i      <     len_key  ;     i  ++  )     {      int     k     =     col_val  [  i  ];      if     (  k     ==     t  )     {      for     (  int     j     =     0  ;     j      <     no_rows     +     1  ;     j  ++  )     {      cipher     +=     enc_mat  [  j  ][  i  ];      }      t  ++  ;      }      }      }      return     cipher  ;   }   // decryption function   string     Decryption  (  int     no_rows       int     len_key       string     cipher        int     col_val  [])   {      char     dec_mat  [  no_rows     +     1  ][  len_key  ];      int     x     =     0       t     =     1  ;      // rearrange the matrix according to the col_val      while     (  t      <=     len_key  )     {      for     (  int     i     =     0  ;     i      <     len_key  ;     i  ++  )     {      int     k     =     col_val  [  i  ];      if     (  k     ==     t  )     {      for     (  int     j     =     0  ;     j      <     no_rows     +     1  ;     j  ++  )     {      dec_mat  [  j  ][  i  ]     =     cipher  [  x  ];      x  ++  ;      }      t  ++  ;      }      }      }      string     message     =     ''  ;      for     (  int     i     =     0  ;     i      <     no_rows     +     1  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     len_key  ;     j  ++  )     {      // replacing the '_' with space      if     (  dec_mat  [  i  ][  j  ]     ==     '_'  )     {      dec_mat  [  i  ][  j  ]     =     ' '  ;      }      message     +=     dec_mat  [  i  ][  j  ];      }      }      return     message  ;   }   int     main  ()   {      // message      string     msg     =     'Geeks for Geeks'  ;      // key      string     key     =     'HACK'  ;      int     len_key     =     key  .  length  ();      int     len_msg     =     msg  .  length  ();      int     val     =     1       count     =     0       ind  ;      int     col_val  [  len_key  ];      // intializing col_val matrix with 0      memset  (  col_val       0       sizeof  (  col_val  ));      // numbering the key alphabets according to its ACII      // value      while     (  count      <     len_key  )     {      int     min     =     999  ;      for     (  int     i     =     0  ;     i      <     len_key  ;     i  ++  )     {      if     ((  min     >     int  (  key  [  i  ]))     &&     (  col_val  [  i  ]     ==     0  ))     {      min     =     int  (  key  [  i  ]);      ind     =     i  ;      }      }      col_val  [  ind  ]     =     val  ;      count  ++  ;      val  ++  ;      }      int     no_rows     =     len_msg     /     len_key  ;      // encrypted text      string     cipher_text     =     ' '  ;      cipher_text     =     Encryption  (  no_rows       len_key       len_msg       msg        col_val  );      cout      < <     'Encrypted Message : '      < <     cipher_text      < <     endl  ;      // decrypted text      string     original_msg     =     ' '  ;      original_msg     =     Decryption  (  no_rows       len_key       cipher_text        col_val  );      cout      < <     'Decrypted Message : '      < <     original_msg      < <     endl  ;   }   // This code is contributed by Suchita Gond   
Java
   import     java.util.*  ;   public     class   ColumnarTranspositionCipher     {      // Key for Columnar Transposition      static     final     String     key     =     'HACK'  ;      static     Map   <  Character       Integer  >     keyMap     =     new     HashMap   <>  ();      static     void     setPermutationOrder  ()     {      // Add the permutation order into the map      for     (  int     i     =     0  ;     i      <     key  .  length  ();     i  ++  )     {      keyMap  .  put  (  key  .  charAt  (  i  )     i  );      }      }      // Encryption      static     String     encryptMessage  (  String     msg  )     {      int     row       col  ;      StringBuilder     cipher     =     new     StringBuilder  ();      /* Calculate the number of columns in the matrix */      col     =     key  .  length  ();      /* Calculate the maximum number of rows in the matrix */      row     =     (  int  )     Math  .  ceil  ((  double  )     msg  .  length  ()     /     col  );      char  [][]     matrix     =     new     char  [  row  ][  col  ]  ;      for     (  int     i     =     0       k     =     0  ;     i      <     row  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     col  ;     )     {      if     (  k      <     msg  .  length  ())     {      char     ch     =     msg  .  charAt  (  k  );      if     (  Character  .  isLetter  (  ch  )     ||     ch     ==     ' '  )     {      matrix  [  i  ][  j  ]     =     ch  ;      j  ++  ;      }      k  ++  ;      }     else     {      /* Add padding character '_' */      matrix  [  i  ][  j  ]     =     '_'  ;      j  ++  ;      }      }      }      for     (  Map  .  Entry   <  Character       Integer  >     entry     :     keyMap  .  entrySet  ())     {      int     columnIndex     =     entry  .  getValue  ();      // Get the cipher text from the matrix column-wise using the permuted key      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      if     (  Character  .  isLetter  (  matrix  [  i  ][  columnIndex  ]  )     ||     matrix  [  i  ][  columnIndex  ]     ==     ' '     ||     matrix  [  i  ][  columnIndex  ]     ==     '_'  )     {      cipher  .  append  (  matrix  [  i  ][  columnIndex  ]  );      }      }      }      return     cipher  .  toString  ();      }      // Decryption      static     String     decryptMessage  (  String     cipher  )     {      /* Calculate the number of columns for the cipher matrix */      int     col     =     key  .  length  ();      int     row     =     (  int  )     Math  .  ceil  ((  double  )     cipher  .  length  ()     /     col  );      char  [][]     cipherMat     =     new     char  [  row  ][  col  ]  ;      /* Add characters into the matrix column-wise */      int     k     =     0  ;      for     (  int     j     =     0  ;     j      <     col  ;     j  ++  )     {      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      cipherMat  [  i  ][  j  ]     =     cipher  .  charAt  (  k  );      k  ++  ;      }      }      /* Update the order of the key for decryption */      int     index     =     0  ;      for     (  Map  .  Entry   <  Character       Integer  >     entry     :     keyMap  .  entrySet  ())     {      entry  .  setValue  (  index  ++  );      }      /* Arrange the matrix column-wise according to the permutation order */      char  [][]     decCipher     =     new     char  [  row  ][  col  ]  ;      for     (  int     l     =     0  ;     l      <     key  .  length  ();     l  ++  )     {      int     columnIndex     =     keyMap  .  get  (  key  .  charAt  (  l  ));      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      decCipher  [  i  ][  l  ]     =     cipherMat  [  i  ][  columnIndex  ]  ;      }      }      /* Get the message using the matrix */      StringBuilder     msg     =     new     StringBuilder  ();      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     col  ;     j  ++  )     {      if     (  decCipher  [  i  ][  j  ]     !=     '_'  )     {      msg  .  append  (  decCipher  [  i  ][  j  ]  );      }      }      }      return     msg  .  toString  ();      }      public     static     void     main  (  String  []     args  )     {      /* Message */      String     msg     =     'Geeks for Geeks'  ;      setPermutationOrder  ();      // Calling encryption function      String     cipher     =     encryptMessage  (  msg  );      System  .  out  .  println  (  'Encrypted Message: '     +     cipher  );      // Calling Decryption function      System  .  out  .  println  (  'Decrypted Message: '     +     decryptMessage  (  cipher  ));      }   }   
Python
   # Python3 implementation of   # Columnar Transposition   import   math   key   =   'HACK'   # Encryption   def   encryptMessage  (  msg  ):   cipher   =   ''   # track key indices   k_indx   =   0   msg_len   =   float  (  len  (  msg  ))   msg_lst   =   list  (  msg  )   key_lst   =   sorted  (  list  (  key  ))   # calculate column of the matrix   col   =   len  (  key  )   # calculate maximum row of the matrix   row   =   int  (  math  .  ceil  (  msg_len   /   col  ))   # add the padding character '_' in empty   # the empty cell of the matix   fill_null   =   int  ((  row   *   col  )   -   msg_len  )   msg_lst  .  extend  (  '_'   *   fill_null  )   # create Matrix and insert message and   # padding characters row-wise   matrix   =   [  msg_lst  [  i  :   i   +   col  ]   for   i   in   range  (  0     len  (  msg_lst  )   col  )]   # read matrix column-wise using key   for   _   in   range  (  col  ):   curr_idx   =   key  .  index  (  key_lst  [  k_indx  ])   cipher   +=   ''  .  join  ([  row  [  curr_idx  ]   for   row   in   matrix  ])   k_indx   +=   1   return   cipher   # Decryption   def   decryptMessage  (  cipher  ):   msg   =   ''   # track key indices   k_indx   =   0   # track msg indices   msg_indx   =   0   msg_len   =   float  (  len  (  cipher  ))   msg_lst   =   list  (  cipher  )   # calculate column of the matrix   col   =   len  (  key  )   # calculate maximum row of the matrix   row   =   int  (  math  .  ceil  (  msg_len   /   col  ))   # convert key into list and sort   # alphabetically so we can access   # each character by its alphabetical position.   key_lst   =   sorted  (  list  (  key  ))   # create an empty matrix to   # store deciphered message   dec_cipher   =   []   for   _   in   range  (  row  ):   dec_cipher   +=   [[  None  ]   *   col  ]   # Arrange the matrix column wise according   # to permutation order by adding into new matrix   for   _   in   range  (  col  ):   curr_idx   =   key  .  index  (  key_lst  [  k_indx  ])   for   j   in   range  (  row  ):   dec_cipher  [  j  ][  curr_idx  ]   =   msg_lst  [  msg_indx  ]   msg_indx   +=   1   k_indx   +=   1   # convert decrypted msg matrix into a string   try  :   msg   =   ''  .  join  (  sum  (  dec_cipher     []))   except   TypeError  :   raise   TypeError  (  'This program cannot'     'handle repeating words.'  )   null_count   =   msg  .  count  (  '_'  )   if   null_count   >   0  :   return   msg  [:   -  null_count  ]   return   msg   # Driver Code   msg   =   'Geeks for Geeks'   cipher   =   encryptMessage  (  msg  )   print  (  'Encrypted Message:   {}  '  .   format  (  cipher  ))   print  (  'Decryped Message:   {}  '  .   format  (  decryptMessage  (  cipher  )))   # This code is contributed by Aditya K   
C#
   using     System  ;   using     System.Collections.Generic  ;   public     class     ColumnarTranspositionCipher     {      // Key for Columnar Transposition      static     readonly     string     key     =     'HACK'  ;      static     Dictionary   <  char       int  >     keyMap      =     new     Dictionary   <  char       int  >  ();      static     void     SetPermutationOrder  ()      {      // Add the permutation order into the dictionary      for     (  int     i     =     0  ;     i      <     key  .  Length  ;     i  ++  )     {      keyMap  [  key  [  i  ]]     =     i  ;      }      }      // Encryption      static     string     EncryptMessage  (  string     msg  )      {      int     row       col  ;      System  .  Text  .  StringBuilder     cipher      =     new     System  .  Text  .  StringBuilder  ();      /* Calculate the number of columns in the matrix */      col     =     key  .  Length  ;      /* Calculate the maximum number of rows in the    * matrix */      row     =     (  int  )  Math  .  Ceiling  ((  double  )  msg  .  Length     /     col  );      char  [     ]     matrix     =     new     char  [  row       col  ];      for     (  int     i     =     0       k     =     0  ;     i      <     row  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     col  ;)     {      if     (  k      <     msg  .  Length  )     {      char     ch     =     msg  [  k  ];      if     (  char  .  IsLetter  (  ch  )     ||     ch     ==     ' '  )     {      matrix  [  i       j  ]     =     ch  ;      j  ++  ;      }      k  ++  ;      }      else     {      /* Add padding character '_' */      matrix  [  i       j  ]     =     '_'  ;      j  ++  ;      }      }      }      foreach  (      var     entry     in     new     Dictionary   <  char       int  >  (  keyMap  ))      {      int     columnIndex     =     entry  .  Value  ;      // Get the cipher text from the matrix      // column-wise using the permuted key      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      if     (  char  .  IsLetter  (  matrix  [  i       columnIndex  ])      ||     matrix  [  i       columnIndex  ]     ==     ' '      ||     matrix  [  i       columnIndex  ]     ==     '_'  )     {      cipher  .  Append  (  matrix  [  i       columnIndex  ]);      }      }      }      return     cipher  .  ToString  ();      }      // Decryption      static     string     DecryptMessage  (  string     cipher  )      {      /* Calculate the number of columns for the cipher    * matrix */      int     col     =     key  .  Length  ;      int     row     =     (  int  )  Math  .  Ceiling  ((  double  )  cipher  .  Length      /     col  );      char  [     ]     cipherMat     =     new     char  [  row       col  ];      /* Add characters into the matrix column-wise */      int     k     =     0  ;      for     (  int     j     =     0  ;     j      <     col  ;     j  ++  )     {      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      cipherMat  [  i       j  ]     =     cipher  [  k  ];      k  ++  ;      }      }      /* Update the order of the key for decryption */      int     index     =     0  ;      foreach  (      var     entry     in     new     Dictionary   <  char       int  >  (  keyMap  ))      {      keyMap  [  entry  .  Key  ]     =     index  ++  ;      }      /* Arrange the matrix column-wise according to the    * permutation order */      char  [     ]     decCipher     =     new     char  [  row       col  ];      foreach  (  var     entry     in     keyMap  )      {      int     columnIndex     =     entry  .  Value  ;      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      decCipher  [  i       columnIndex  ]      =     cipherMat  [  i       columnIndex  ];      }      }      /* Get the message using the matrix */      System  .  Text  .  StringBuilder     msg      =     new     System  .  Text  .  StringBuilder  ();      for     (  int     i     =     0  ;     i      <     row  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     col  ;     j  ++  )     {      if     (  decCipher  [  i       j  ]     !=     '_'  )     {      msg  .  Append  (  decCipher  [  i       j  ]);      }      }      }      return     msg  .  ToString  ();      }      public     static     void     Main  (  string  []     args  )      {      /* Message */      string     msg     =     'Geeks for Geeks'  ;      SetPermutationOrder  ();      // Calling encryption function      string     cipher     =     EncryptMessage  (  msg  );      Console  .  WriteLine  (  'Encrypted Message: '     +     cipher  );      // Calling Decryption function      Console  .  WriteLine  (  'Decrypted Message: '      +     DecryptMessage  (  cipher  ));      }   }   
JavaScript
   // JavaScript implementation of    // Columnar Transposition   const     key     =     'HACK'  ;   // Encryption   function     encryptMessage  (  msg  )     {      let     cipher     =     ''  ;      // track key indices      let     k_indx     =     0  ;      const     msg_len     =     msg  .  length  ;      const     msg_lst     =     Array  .  from  (  msg  );      const     key_lst     =     Array  .  from  (  key  ).  sort  ();      // calculate column of the matrix      const     col     =     key  .  length  ;      // calculate maximum row of the matrix      const     row     =     Math  .  ceil  (  msg_len     /     col  );      // add the padding character '_' in empty      // the empty cell of the matrix      const     fill_null     =     (  row     *     col  )     -     msg_len  ;      for     (  let     i     =     0  ;     i      <     fill_null  ;     i  ++  )     {      msg_lst  .  push  (  '_'  );      }      // create Matrix and insert message and      // padding characters row-wise      const     matrix     =     [];      for     (  let     i     =     0  ;     i      <     msg_lst  .  length  ;     i     +=     col  )     {      matrix  .  push  (  msg_lst  .  slice  (  i       i     +     col  ));      }      // read matrix column-wise using key      for     (  let     _     =     0  ;     _      <     col  ;     _  ++  )     {      const     curr_idx     =     key  .  indexOf  (  key_lst  [  k_indx  ]);      for     (  const     row     of     matrix  )     {      cipher     +=     row  [  curr_idx  ];      }      k_indx  ++  ;      }      return     cipher  ;   }   // Decryption   function     decryptMessage  (  cipher  )     {      let     msg     =     ''  ;      // track key indices      let     k_indx     =     0  ;      // track msg indices      let     msg_indx     =     0  ;      const     msg_len     =     cipher  .  length  ;      const     msg_lst     =     Array  .  from  (  cipher  );      // calculate column of the matrix      const     col     =     key  .  length  ;      // calculate maximum row of the matrix      const     row     =     Math  .  ceil  (  msg_len     /     col  );      // convert key into list and sort       // alphabetically so we can access       // each character by its alphabetical position.      const     key_lst     =     Array  .  from  (  key  ).  sort  ();      // create an empty matrix to       // store deciphered message      const     dec_cipher     =     [];      for     (  let     i     =     0  ;     i      <     row  ;     i  ++  )     {      dec_cipher  .  push  (  Array  (  col  ).  fill  (  null  ));      }      // Arrange the matrix column wise according       // to permutation order by adding into a new matrix      for     (  let     _     =     0  ;     _      <     col  ;     _  ++  )     {      const     curr_idx     =     key  .  indexOf  (  key_lst  [  k_indx  ]);      for     (  let     j     =     0  ;     j      <     row  ;     j  ++  )     {      dec_cipher  [  j  ][  curr_idx  ]     =     msg_lst  [  msg_indx  ];      msg_indx  ++  ;      }      k_indx  ++  ;      }      // convert decrypted msg matrix into a string      try     {      msg     =     dec_cipher  .  flat  ().  join  (  ''  );      }     catch     (  err  )     {      throw     new     Error  (  'This program cannot handle repeating words.'  );      }      const     null_count     =     (  msg  .  match  (  /_/g  )     ||     []).  length  ;      if     (  null_count     >     0  )     {      return     msg  .  slice  (  0       -  null_count  );      }      return     msg  ;   }   // Driver Code   const     msg     =     'Geeks for Geeks'  ;   const     cipher     =     encryptMessage  (  msg  );   console  .  log  (  'Encrypted Message: '     +     cipher  );   console  .  log  (  'Decrypted Message: '     +     decryptMessage  (  cipher  ));   // This code is contributed by phasing17   

Producción
Encrypted Message : e kefGsGsrekoe_ Decrypted Message : Geeks for Geeks  


Crear cuestionario