Toliak

dz2_raw

Nov 3rd, 2018
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <iomanip>
  5. #include <bitset>
  6.  
  7. typedef unsigned __int16 Block;
  8.  
  9. static int SHIFT = 1;
  10. static int ENCRYPT_WAY = 1;
  11.  
  12. struct CircularData
  13. {
  14.     Block data = 0;
  15. };
  16.  
  17. CircularData createCircularData(Block data)
  18. {
  19.     return CircularData({ data });
  20. }
  21.  
  22. CircularData operator>>(CircularData l, int n)
  23. {
  24.     Block mask = 0x0;
  25.     for (int i = 0; i < n; i++) {
  26.         mask <<= 1;
  27.         mask |= 1;
  28.     }
  29.     Block cycle = (l.data & mask) << (16 - n);
  30.    
  31.     return CircularData({
  32.         static_cast<Block>((l.data >> n) | cycle)
  33.     });
  34. }
  35.  
  36. CircularData operator<<(CircularData l, int n)
  37. {
  38.     Block mask = 0x0;
  39.     for (int i = 0; i < n; i++) {
  40.         mask <<= 1;
  41.         mask |= 1;
  42.     }
  43.     Block cycle = (l.data >> (16 - n)) & mask;
  44.  
  45.     return CircularData({
  46.         static_cast<Block>((l.data << n) | cycle)
  47.     });
  48. }
  49.  
  50. CircularData operator^(CircularData l, Block r)
  51. {
  52.     return CircularData({
  53.         static_cast<Block>(l.data ^ r)
  54.     });
  55. }
  56.  
  57. bool operator==(CircularData l, CircularData r)
  58. {
  59.     return l.data == r.data;
  60. }
  61.  
  62. void encrypt(CircularData *data, Block salt)
  63. {
  64.     if (ENCRYPT_WAY == 0) {
  65.         (*data) = (*data ^ salt) << SHIFT;
  66.     } else {
  67.         (*data) = (*data ^ salt) >> SHIFT;
  68.     }
  69. }
  70.  
  71. // (var ^ v) ^ v == var
  72. void decrypt(CircularData *data, Block salt)
  73. {
  74.     if (ENCRYPT_WAY == 0) {
  75.         (*data) = (*data >> SHIFT) ^ salt;
  76.     } else {
  77.         (*data) = (*data << SHIFT) ^ salt;
  78.     }
  79. }
  80.  
  81. int main(int argc, char *argv[])
  82. {
  83.     if (argc >= 3) {
  84.         ENCRYPT_WAY = atoi(argv[1]);
  85.         SHIFT = atoi(argv[2]);
  86.     }
  87.     std::cout << "Way  : " << (ENCRYPT_WAY == 0 ? "<<" : ">>") << std::endl;
  88.     std::cout << "Shift: " << SHIFT << std::endl;
  89.  
  90.     std::string input;
  91.     std::getline(std::cin, input);
  92.     std::vector<CircularData> data;
  93.     for (auto &c : input) {
  94.         static size_t index = 0;
  95.         static Block block = 0;
  96.         if (index % 2 == 0) {
  97.             block = c << 8;
  98.         } else {
  99.             block |= c;
  100.         }
  101.  
  102.         data.emplace_back(
  103.             std::move(createCircularData(block))
  104.         );
  105.         index++;
  106.     }
  107.  
  108.     std::string key;
  109.     std::getline(std::cin, key);
  110.  
  111.     unsigned int srandKey = 0;
  112.     srandKey |= 0x90000000 ^ (key[0] << 24);        // 1001 at the end
  113.     for (size_t i = 1; i < 4; i++) {
  114.         char current = key.size() > i ? key[i] : 0;
  115.         srandKey |= current << 8 * (3 - i);
  116.     }
  117.     srand(srandKey);
  118.     Block salt = rand();
  119.  
  120.     std::vector<CircularData> dataCopy(data);
  121.     for (auto &d : dataCopy)
  122.         encrypt(&d, salt);
  123.     for (auto &d : dataCopy)
  124.         decrypt(&d, salt);
  125.  
  126.     std::cout << (dataCopy == data) << std::endl;
  127.  
  128.     return 0;
  129. }
Add Comment
Please, Sign In to add comment