-
Notifications
You must be signed in to change notification settings - Fork 29
/
xor.h
103 lines (80 loc) · 2.21 KB
/
xor.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#pragma once
#include <string>
#include <utility>
#include <array>s
#ifdef _DEBUG
template<typename _chartype, size_t _length>
class XorStr
{
public:
constexpr XorStr(const _chartype(&str)[_length]) : XorStr(str, std::make_index_sequence<length>()) {}
// returns pointer to unencrypted string
// caution: invalid if object gets destructed
operator const _chartype* ()
{
return data;
}
// length in characters (not including 0-terminator)
static constexpr size_t length = _length - 1;
private:
template<size_t... _indices>
constexpr XorStr(const _chartype(&str)[_length], std::index_sequence<_indices...>) : data{ str[_indices]... }, encrypted(false) {}
_chartype data[_length];
bool encrypted;
};
template<typename _chartype, size_t _length>
constexpr auto _xor_(_chartype const (&str)[_length])
{
return XorStr<_chartype, _length>(str);
}
#else
template<typename _chartype, size_t _length>
class XorStr
{
public:
constexpr XorStr(const _chartype(&str)[_length]) : XorStr(str, std::make_index_sequence<_length>()) {}
~XorStr() { for (size_t t = 0; t < _length; t++) data[t] = 0; }
// returns pointer to unencrypted string
// cation: invalid if object gets destructed
operator const _chartype* ()
{
decrypt();
return data;
}
// length in characters (not including 0-terminator)
static constexpr size_t length = _length - 1;
private:
template<size_t... _indices>
constexpr XorStr(const _chartype(&str)[_length], std::index_sequence<_indices...>) : data{ crypt(str[_indices], _indices)... }, encrypted(true) {}
static constexpr auto XOR_KEY = static_cast<_chartype>(
(__TIME__[7] - '0') +
(__TIME__[6] - '0') * 10 +
(__TIME__[4] - '0') * 60 +
(__TIME__[3] - '0') * 600 +
(__TIME__[1] - '0') * 3600 +
(__TIME__[0] - '0') * 36000
);
static constexpr auto crypt(_chartype c, size_t i)
{
return static_cast<_chartype>(c ^ (XOR_KEY + i));
}
inline void decrypt()
{
if (encrypted)
{
for (size_t t = 0; t < _length; t++)
{
data[t] = crypt(data[t], t);
}
encrypted = false;
}
}
_chartype data[_length];
bool encrypted;
};
template<typename _chartype, size_t _length>
constexpr auto _xor_(_chartype const (&str)[_length])
{
return XorStr<_chartype, _length>(str);
}
#endif