TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
deswrapper.cpp
Go to the documentation of this file.
1 #include "deswrapper.h"
2 #include "ttkcryptographichash.h"
3 
4 namespace QAlgorithm
5 {
6 static constexpr quint64 ARRAYMASK[] = {
7  0x0000000000000001l, 0x0000000000000002l, 0x0000000000000004l, 0x0000000000000008l,
8  0x0000000000000010l, 0x0000000000000020l, 0x0000000000000040l, 0x0000000000000080l,
9  0x0000000000000100l, 0x0000000000000200l, 0x0000000000000400l, 0x0000000000000800l,
10  0x0000000000001000l, 0x0000000000002000l, 0x0000000000004000l, 0x0000000000008000l,
11  0x0000000000010000l, 0x0000000000020000l, 0x0000000000040000l, 0x0000000000080000l,
12  0x0000000000100000l, 0x0000000000200000l, 0x0000000000400000l, 0x0000000000800000l,
13  0x0000000001000000l, 0x0000000002000000l, 0x0000000004000000l, 0x0000000008000000l,
14  0x0000000010000000l, 0x0000000020000000l, 0x0000000040000000l, 0x0000000080000000l,
15  0x0000000100000000l, 0x0000000200000000l, 0x0000000400000000l, 0x0000000800000000l,
16  0x0000001000000000l, 0x0000002000000000l, 0x0000004000000000l, 0x0000008000000000l,
17  0x0000010000000000l, 0x0000020000000000l, 0x0000040000000000l, 0x0000080000000000l,
18  0x0000100000000000l, 0x0000200000000000l, 0x0000400000000000l, 0x0000800000000000l,
19  0x0001000000000000l, 0x0002000000000000l, 0x0004000000000000l, 0x0008000000000000l,
20  0x0010000000000000l, 0x0020000000000000l, 0x0040000000000000l, 0x0080000000000000l,
21  0x0100000000000000l, 0x0200000000000000l, 0x0400000000000000l, 0x0800000000000000l,
22  0x1000000000000000l, 0x2000000000000000l, 0x4000000000000000l, 0x8000000000000000l
23 };
24 
25 static constexpr int ARRAYIP[] = {
26  57, 49, 41, 33, 25, 17, 9, 1,
27  59, 51, 43, 35, 27, 19, 11, 3,
28  61, 53, 45, 37, 29, 21, 13, 5,
29  63, 55, 47, 39, 31, 23, 15, 7,
30  56, 48, 40, 32, 24, 16, 8, 0,
31  58, 50, 42, 34, 26, 18, 10, 2,
32  60, 52, 44, 36, 28, 20, 12, 4,
33  62, 54, 46, 38, 30, 22, 14, 6
34 };
35 
36 static constexpr int ARRAYE[] = {
37  31, 0, 1, 2, 3, 4, -1, -1,
38  3, 4, 5, 6, 7, 8, -1, -1,
39  7, 8, 9, 10, 11, 12, -1, -1,
40  11, 12, 13, 14, 15, 16, -1, -1,
41  15, 16, 17, 18, 19, 20, -1, -1,
42  19, 20, 21, 22, 23, 24, -1, -1,
43  23, 24, 25, 26, 27, 28, -1, -1,
44  27, 28, 29, 30, 31, 30, -1, -1
45 };
46 
47 static constexpr char MATRIXNSBOX[8][64] = {
48  { 14, 4, 3, 15, 2, 13, 5, 3,
49  13, 14, 6, 9, 11, 2, 0, 5,
50  4, 1, 10, 12, 15, 6, 9, 10,
51  1, 8, 12, 7, 8, 11, 7, 0,
52  0, 15, 10, 5, 14, 4, 9, 10,
53  7, 8, 12, 3, 13, 1, 3, 6,
54  15, 12, 6, 11, 2, 9, 5, 0,
55  4, 2, 11, 14, 1, 7, 8, 13
56  },
57  { 15, 0, 9, 5, 6, 10, 12, 9,
58  8, 7, 2, 12, 3, 13, 5, 2,
59  1, 14, 7, 8, 11, 4, 0, 3,
60  14, 11, 13, 6, 4, 1, 10, 15,
61  3, 13, 12, 11, 15, 3, 6, 0,
62  4, 10, 1, 7, 8, 4, 11, 14,
63  13, 8, 0, 6, 2, 15, 9, 5,
64  7, 1, 10, 12, 14, 2, 5, 9
65  },
66  { 10, 13, 1, 11, 6, 8, 11, 5,
67  9, 4, 12, 2, 15, 3, 2, 14,
68  0, 6, 13, 1, 3, 15, 4, 10,
69  14, 9, 7, 12, 5, 0, 8, 7,
70  13, 1, 2, 4, 3, 6, 12, 11,
71  0, 13, 5, 14, 6, 8, 15, 2,
72  7, 10, 8, 15, 4, 9, 11, 5,
73  9, 0, 14, 3, 10, 7, 1, 12
74  },
75  { 7, 10, 1, 15, 0, 12, 11, 5,
76  14, 9, 8, 3, 9, 7, 4, 8,
77  13, 6, 2, 1, 6, 11, 12, 2,
78  3, 0, 5, 14, 10, 13, 15, 4,
79  13, 3, 4, 9, 6, 10, 1, 12,
80  11, 0, 2, 5, 0, 13, 14, 2,
81  8, 15, 7, 4, 15, 1, 10, 7,
82  5, 6, 12, 11, 3, 8, 9, 14
83  },
84  { 2, 4, 8, 15, 7, 10, 13, 6,
85  4, 1, 3, 12, 11, 7, 14, 0,
86  12, 2, 5, 9, 10, 13, 0, 3,
87  1, 11, 15, 5, 6, 8, 9, 14,
88  14, 11, 5, 6, 4, 1, 3, 10,
89  2, 12, 15, 0, 13, 2, 8, 5,
90  11, 8, 0, 15, 7, 14, 9, 4,
91  12, 7, 10, 9, 1, 13, 6, 3
92  },
93  { 12, 9, 0, 7, 9, 2, 14, 1,
94  10, 15, 3, 4, 6, 12, 5, 11,
95  1, 14, 13, 0, 2, 8, 7, 13,
96  15, 5, 4, 10, 8, 3, 11, 6,
97  10, 4, 6, 11, 7, 9, 0, 6,
98  4, 2, 13, 1, 9, 15, 3, 8,
99  15, 3, 1, 14, 12, 5, 11, 0,
100  2, 12, 14, 7, 5, 10, 8, 13
101  },
102  { 4, 1, 3, 10, 15, 12, 5, 0,
103  2, 11, 9, 6, 8, 7, 6, 9,
104  11, 4, 12, 15, 0, 3, 10, 5,
105  14, 13, 7, 8, 13, 14, 1, 2,
106  13, 6, 14, 9, 4, 1, 2, 14,
107  11, 13, 5, 0, 1, 10, 8, 3,
108  0, 11, 3, 5, 9, 4, 15, 2,
109  7, 8, 12, 15, 10, 7, 6, 12
110  },
111  { 13, 7, 10, 0, 6, 9, 5, 15,
112  8, 4, 3, 10, 11, 14, 12, 5,
113  2, 11, 9, 6, 15, 12, 0, 3,
114  4, 1, 14, 13, 1, 2, 7, 8,
115  1, 2, 12, 15, 10, 4, 0, 3,
116  13, 14, 6, 9, 7, 8, 9, 6,
117  15, 1, 5, 12, 3, 10, 14, 5,
118  8, 7, 11, 0, 4, 13, 2, 11
119  }
120 };
121 
122 static constexpr int ARRAYP[] = {
123  15, 6, 19, 20, 28, 11, 27, 16,
124  0, 14, 22, 25, 4, 17, 30, 9,
125  1, 7, 23, 13, 31, 26, 2, 8,
126  18, 12, 29, 5, 21, 10, 3, 24
127 };
128 
129 static constexpr int ARRAYIP_1[] = {
130  39, 7, 47, 15, 55, 23, 63, 31,
131  38, 6, 46, 14, 54, 22, 62, 30,
132  37, 5, 45, 13, 53, 21, 61, 29,
133  36, 4, 44, 12, 52, 20, 60, 28,
134  35, 3, 43, 11, 51, 19, 59, 27,
135  34, 2, 42, 10, 50, 18, 58, 26,
136  33, 1, 41, 9, 49, 17, 57, 25,
137  32, 0, 40, 8, 48, 16, 56, 24
138 };
139 
140 static constexpr int ARRAYPC_1[] = {
141  56, 48, 40, 32, 24, 16, 8, 0,
142  57, 49, 41, 33, 25, 17, 9, 1,
143  58, 50, 42, 34, 26, 18, 10, 2,
144  59, 51, 43, 35, 62, 54, 46, 38,
145  30, 22, 14, 6, 61, 53, 45, 37,
146  29, 21, 13, 5, 60, 52, 44, 36,
147  28, 20, 12, 4, 27, 19, 11, 3
148 };
149 
150 static constexpr int ARRAYPC_2[] = {
151  13, 16, 10, 23, 0, 4, -1, -1,
152  2, 27, 14, 5, 20, 9, -1, -1,
153  22, 18, 11, 3, 25, 7, -1, -1,
154  15, 6, 26, 19, 12, 1, -1, -1,
155  40, 51, 30, 36, 46, 54, -1, -1,
156  29, 39, 50, 44, 32, 47, -1, -1,
157  43, 48, 38, 55, 33, 52, -1, -1,
158  45, 41, 49, 35, 28, 31, -1, -1
159 };
160 
161 static constexpr int ARRAYLS[] = {
162  1, 1, 2, 2, 2, 2, 2, 2,
163  1, 2, 2, 2, 2, 2, 2, 1
164 };
165 
166 static constexpr quint64 ARRAYLSMASK[] = {
167  0x0000000000000000l, 0x0000000000100001l, 0x0000000000300003l
168 };
169 
170 enum class Mode
171 {
172  Encrypt = 0,
173  Decrypt = 1
174 };
175 
179 class DesPrivate : public TTKPrivate<Des>
180 {
181 public:
182  quint64 bitTransform(const int *array, int len, quint64 source);
183  void desSubKeys(quint64 key, quint64* K, Mode mode);
184  quint64 des64(quint64 *subkeys, quint64 data);
185  char* encrypt(char *src, int length, char *key);
186 
188 };
189 
190 quint64 DesPrivate::bitTransform(const int *array, int len, quint64 source)
191 {
192  quint64 dest = 0;
193  const quint64 bts = source;
194 
195  for(int bti = 0; bti < len; ++bti)
196  {
197  if(array[bti] >= 0 && (bts & ARRAYMASK[array[bti]]) != 0)
198  {
199  dest |= ARRAYMASK[bti];
200  }
201  }
202  return dest;
203 }
204 
205 void DesPrivate::desSubKeys(quint64 key, quint64* K, Mode mode)
206 {
207  quint64 temp = bitTransform(ARRAYPC_1, 56, key);
208  for(int j = 0; j < 16; ++j)
209  {
210  const quint64 source = temp;
211  temp = ((source & ARRAYLSMASK[ARRAYLS[j]]) << (28 - ARRAYLS[j])) | ((source & ~ARRAYLSMASK[ARRAYLS[j]]) >> ARRAYLS[j]);
212  K[j] = bitTransform(ARRAYPC_2, 64, temp);
213  }
214 
215  if(mode == Mode::Decrypt)
216  {
217  quint64 t;
218  for(int j = 0; j < 8; ++j)
219  {
220  t = K[j];
221  K[j] = K[15 - j];
222  K[15 - j] = t;
223  }
224  }
225 }
226 
227 quint64 DesPrivate::des64(quint64 *subkeys, quint64 data)
228 {
229  quint64 out = bitTransform(ARRAYIP, 64, data);
230  quint64 l = 0, r = 0;
231  int sOut = 0;
232 
233  uchar *pR = new uchar[8];
234  int *pSource = new int[2];
235  pSource[0] = (int) (out & quint64(0x00000000ffffffffl));
236  pSource[1] = (int) ((out & quint64(0xffffffff00000000l)) >> 32);
237 
238  for(int i = 0; i < 16; ++i)
239  {
240  r = pSource[1];
241  r = bitTransform(ARRAYE, 64, r);
242  r ^= subkeys[i];
243 
244  for(int k = 0; k < 8; ++k)
245  {
246  pR[k] = (uchar) (0xff & (r >> (k * 8)));
247  }
248 
249  sOut = 0;
250  for(int sbi = 7; sbi >= 0; --sbi)
251  {
252  sOut <<= 4;
253  sOut |= MATRIXNSBOX[sbi][pR[sbi]];
254  }
255  r = sOut;
256  r = bitTransform(ARRAYP, 32, r);
257 
258  l = pSource[0];
259  pSource[0] = pSource[1];
260  pSource[1] = (int) (l ^ r);
261  }
262 
263  int t = pSource[0];
264  pSource[0] = pSource[1];
265  pSource[1] = t;
266 
267  out = ((quint64) pSource[1] << 32 & quint64(0xffffffff00000000l)) | (quint64) (quint64(0x00000000ffffffffl) & pSource[0]);
268  out = bitTransform(ARRAYIP_1, 64, out);
269 
270  delete[] pR;
271  delete[] pSource;
272  return out;
273 }
274 
275 char* DesPrivate::encrypt(char *src, int length, char *key)
276 {
277  quint64 keyl = 0;
278  for(int i = 0; i < 8; ++i)
279  {
280  const quint64 temp = (quint64) key[i] << (i * 8);
281  keyl |= temp;
282  }
283 
284  const int num = length / 8;
285 
286  quint64* subKey = new quint64[16];
287  for(int i = 0; i < 16; ++i)
288  {
289  subKey[i] = 0;
290  }
291  desSubKeys(keyl, subKey, m_mode);
292 
293  quint64* pSrc = (quint64*) malloc(num * sizeof(quint64));
294  for(int i = 0; i < num; ++i)
295  {
296  pSrc[i] = 0;
297  for(int j = 0; j < 8; ++j)
298  {
299  pSrc[i] |= (quint64) src[i * 8 + j] << (j * 8);
300  }
301  }
302 
303  quint64* pEncyrpt = (quint64*) malloc((((num + 1) * 8 + 1) / 8) * sizeof(quint64));
304  for(int i = 0; i < num; ++i)
305  {
306  pEncyrpt[i] = des64(subKey, pSrc[i]);
307  }
308 
309  const int len = length;
310  const int tailNum = len % 8;
311  char* szTail = (char*) malloc(length - num * 8);
312 
313  memcpy(szTail, src + num * 8, length - num * 8);
314 
315  quint64 tail64 = 0;
316  for(int i = 0; i < tailNum; ++i)
317  {
318  tail64 = tail64 | (quint64(szTail[i])) << (i * 8);
319  }
320 
321  pEncyrpt[num] = des64(subKey, tail64);
322  char* result = (char*) malloc((num + 1) * 8);
323 
324  int temp = 0;
325  for(int i = 0; i < num + 1; ++i)
326  {
327  for(int j = 0; j < 8; ++j)
328  {
329  result[temp] = (char) (0xff & (pEncyrpt[i] >> (j * 8)));
330  temp++;
331  }
332  }
333 
334  delete[] subKey;
335  free(pSrc);
336  free(pEncyrpt);
337  free(szTail);
338 
339  return result;
340 }
341 
342 
343 
345 {
347 }
348 
349 QByteArray Des::encrypt(const QByteArray &in, const QByteArray &key)
350 {
351  TTK_D(Des);
352  d->m_mode = Mode::Encrypt;
353  char *encData = d->encrypt((char *)in.data(), in.length(), (char *)key.data());
354  const TTKString &str = TTK::base64Encode((unsigned char *)encData, (in.length() / 8 + 1) * 8);
355 
356  delete encData;
357  return QByteArray(str.data(), str.length());
358 }
359 
360 QByteArray Des::decrypt(const QByteArray &in, const QByteArray &key)
361 {
362  TTK_D(Des);
363  d->m_mode = Mode::Decrypt;
364  const TTKString &str = TTK::base64Decode(TTKString(in.data(), in.length()));
365  char *encData = d->encrypt((char *)str.data(), str.length(), (char *)key.data());
366 
367  QByteArray value(encData);
368  delete encData;
369  return value;
370 }
371 }
quint64 des64(quint64 *subkeys, quint64 data)
Definition: deswrapper.cpp:227
static constexpr int ARRAYPC_1[]
Definition: deswrapper.cpp:140
static constexpr int ARRAYP[]
Definition: deswrapper.cpp:122
static constexpr int ARRAYIP_1[]
Definition: deswrapper.cpp:129
QByteArray decrypt(const QByteArray &in, const QByteArray &key)
Definition: deswrapper.cpp:360
static constexpr int ARRAYE[]
Definition: deswrapper.cpp:36
static constexpr char MATRIXNSBOX[8][64]
Definition: deswrapper.cpp:47
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
QByteArray encrypt(const QByteArray &in, const QByteArray &key)
Definition: deswrapper.cpp:349
static constexpr int ARRAYPC_2[]
Definition: deswrapper.cpp:150
The namespace of the algorithm.
std::string TTKString
Definition: ttkglobal.h:168
char * encrypt(char *src, int length, char *key)
Definition: deswrapper.cpp:275
The class of the des wrapper private.
Definition: deswrapper.cpp:179
The class of the des wrapper.
Definition: deswrapper.h:34
static constexpr wchar_t key[]
static constexpr quint64 ARRAYMASK[]
Definition: deswrapper.cpp:6
TTK_MODULE_EXPORT TTKString base64Decode(const TTKString &bytes)
static constexpr int ARRAYLS[]
Definition: deswrapper.cpp:161
static constexpr int ARRAYIP[]
Definition: deswrapper.cpp:25
TTK_MODULE_EXPORT TTKString base64Encode(const unsigned char *bytes, unsigned int len)
void free(voidpf ptr)
const char int mode
Definition: ioapi.h:135
#define TTK_INIT_PRIVATE(Class)
Definition: ttkprivate.h:33
The class of the ttk private base.
Definition: ttkprivate.h:48
voidp malloc(uInt size)
static constexpr quint64 ARRAYLSMASK[]
Definition: deswrapper.cpp:166
quint64 bitTransform(const int *array, int len, quint64 source)
Definition: deswrapper.cpp:190
#define TTK_D(Class)
Definition: ttkprivate.h:41
void desSubKeys(quint64 key, quint64 *K, Mode mode)
Definition: deswrapper.cpp:205