Cifrario di trasposizione colonnare

Cifrario di trasposizione colonnare

Dato un messaggio di testo semplice e una chiave numerica cifra/decifra il testo dato utilizzando la cifratura a trasposizione a colonne La cifratura a trasposizione a colonne è una forma di cifratura a trasposizione proprio come Cifratore del recinto ferroviario . La trasposizione colonnare prevede la scrittura del testo in chiaro in righe e la successiva lettura del testo cifrato in colonne una per una.

Esempi:

    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   

Crittografia

In una cifratura a trasposizione l'ordine degli alfabeti viene riorganizzato per ottenere il testo cifrato.

  1. Il messaggio viene scritto in righe di lunghezza fissa e poi riletto colonna per colonna e le colonne vengono scelte in un ordine criptato.
  2. La larghezza delle righe e la permutazione delle colonne sono generalmente definite da una parola chiave.
  3. Ad esempio, la parola HACK è di lunghezza 4 (quindi le righe sono di lunghezza 4) e la permutazione è definita dall'ordine alfabetico delle lettere nella parola chiave. In questo caso l'ordine sarebbe '3 1 2 4'.
  4. Eventuali spazi liberi vengono riempiti con valori nulli o lasciati vuoti o inseriti da un carattere (Esempio: _).
  5. Infine il messaggio viene letto in colonne nell'ordine specificato dalla parola chiave.
cifrario a trasposizione colonnare

Decrittazione

  1. Per decifrarlo il destinatario deve calcolare la lunghezza della colonna dividendo la lunghezza del messaggio per la lunghezza della chiave.
  2. Quindi scrivi nuovamente il messaggio in colonne, quindi riordina le colonne riformando la parola chiave.
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   

Produzione
Encrypted Message : e kefGsGsrekoe_ Decrypted Message : Geeks for Geeks  


Crea quiz