Advertisement
ZergRushA

C++ columnar transposition encrypt

Jul 26th, 2023 (edited)
741
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <map>
  5. #include <random>
  6. using namespace std;
  7.  
  8. std::random_device dev;
  9. std::mt19937 rng(dev());
  10. const std::string nulls = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  11. std::uniform_int_distribution<std::mt19937::result_type> dist_nulls(0, nulls.length()-1);
  12.  
  13. std::string key = "DBECA";
  14. std::map<int, int> key_order;
  15.  
  16.     void set_permutation_order(){
  17.         for(int i = 0; i < key.length(); ++i)
  18.             key_order[key[i]] = i;
  19.     }
  20.  
  21.     void normalize(std::string& str){
  22.         str.erase(std::remove_if(str.begin(), str.end(), ::isspace), str.end());
  23.         std::transform(str.begin(), str.end(), str.begin(), ::toupper);
  24.     }
  25.  
  26.     std::string columnar_transpos_encrypt(std::string msg){
  27.        
  28.         normalize(msg);
  29.         //std::cout << msg << '\n';
  30.         int cols = key.length();
  31.         int rows = msg.length()/cols;
  32.  
  33.         if(msg.length() % cols)
  34.             ++rows;
  35.        
  36.  
  37.         char** matrix = new char*[rows];
  38.         for(int i = 0; i < rows; ++i)
  39.             matrix[i] = new char[cols];
  40.        
  41.  
  42.         int ind{0};
  43.         for(int row = 0; row < rows; ++row){
  44.             for(int col = 0; col < cols; ++col){
  45.                 if(ind >= msg.length())
  46.                     matrix[row][col] = nulls[dist_nulls(rng)];
  47.                 else
  48.                     matrix[row][col] = msg[ind++];
  49.             }
  50.         }
  51.        
  52.         //std::cout << rows << " " << cols << '\n';
  53.         std::string encrypted{};
  54.         int col_order{};
  55.         for(auto it = key_order.begin(); it != key_order.end(); ++it){
  56.             col_order = it->second;
  57.             for(int row = 0; row < rows; ++row){
  58.                 encrypted += matrix[row][col_order];
  59.             }
  60.         }
  61.         /*
  62.         for debug purpose
  63.        
  64.         for(int row = 0; row < rows; ++row){
  65.             for(int col = 0; col < cols; ++col){
  66.                 std::cout << matrix[row][col] << ' ';
  67.             }
  68.             std::cout << '\n';
  69.         }
  70.         */
  71.        
  72.         for(int i = 0; i < rows; ++i)
  73.             delete[] matrix[i];
  74.         delete[] matrix;
  75.  
  76.         return encrypted;
  77.  
  78.     }
  79.  
  80.  
  81. int main()
  82. {
  83.     std::string ms = "Which wristwatches are Swiss wristwatches";
  84.     set_permutation_order();
  85.     std::string res = columnar_transpos_encrypt(ms);
  86.     std::cout << res;
  87.  
  88.     return 0;
  89. }
  90.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement