Advertisement
LocalDuds

Untitled

Jun 2nd, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <cstddef>
  2.  
  3. namespace ay
  4. {
  5.     template <std::size_t N, char KEY>
  6.     class obfuscator
  7.     {
  8.     public:
  9.         constexpr obfuscator(const char* data)
  10.         {
  11.             static_assert(KEY != '\0', "KEY must not be the null character.");
  12.  
  13.             for (std::size_t i = 0; i < N; i++)
  14.             {
  15.                 m_data[i] = data[i] ^ KEY;
  16.             }
  17.         }
  18.  
  19.         constexpr const char* getData() const
  20.         {
  21.             return &m_data[0];
  22.         }
  23.  
  24.         constexpr std::size_t getSize() const
  25.         {
  26.             return N;
  27.         }
  28.  
  29.         constexpr char getKey() const
  30.         {
  31.             return KEY;
  32.         }
  33.  
  34.     private:
  35.  
  36.         char m_data[N]{};
  37.     };
  38.  
  39.     template <std::size_t N, char KEY>
  40.     class obfuscated_data
  41.     {
  42.     public:
  43.         obfuscated_data(const obfuscator<N, KEY>& obfuscator)
  44.         {
  45.             for (int i = 0; i < N; i++)
  46.             {
  47.                 m_data[i] = obfuscator.getData()[i];
  48.             }
  49.         }
  50.  
  51.         ~obfuscated_data()
  52.         {
  53.             for (int i = 0; i < N; i++)
  54.             {
  55.                 m_data[i] = 0;
  56.             }
  57.         }
  58.  
  59.         operator char*()
  60.         {
  61.             decrypt();
  62.             return m_data;
  63.         }
  64.  
  65.         void decrypt()
  66.         {
  67.             if (is_encrypted())
  68.             {
  69.                 for (std::size_t i = 0; i < N; i++)
  70.                 {
  71.                     m_data[i] ^= KEY;
  72.                 }
  73.             }
  74.         }
  75.  
  76.         void encrypt()
  77.         {
  78.             if (!is_encrypted())
  79.             {
  80.                 for (std::size_t i = 0; i < N; i++)
  81.                 {
  82.                     m_data[i] ^= KEY;
  83.                 }
  84.             }
  85.         }
  86.  
  87.         bool is_encrypted() const
  88.         {
  89.             return m_data[N - 1] != '\0';
  90.         }
  91.  
  92.     private:
  93.  
  94.         char m_data[N];
  95.     };
  96.  
  97.     template <std::size_t N, char KEY = '.'>
  98.     constexpr auto make_obfuscator(const char(&data)[N])
  99.     {
  100.         return obfuscator<N, KEY>(data);
  101.     }
  102. }
  103.  
  104. #define AY_OBFUSCATE(data) AY_OBFUSCATE_KEY(data, '.')
  105.  
  106. #define AY_OBFUSCATE_KEY(data, key) \
  107.     []() -> ay::obfuscated_data<sizeof(data)/sizeof(data[0]), key>& { \
  108.         constexpr auto n = sizeof(data)/sizeof(data[0]); \
  109.         static_assert(data[n - 1] == '\0', "String must be null terminated"); \
  110.         constexpr auto obfuscator = ay::make_obfuscator<n, key>(data); \
  111.         static auto obfuscated_data = ay::obfuscated_data<n, key>(obfuscator); \
  112.         return obfuscated_data; \
  113.     }()------------ */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement