TTKMusicPlayer  3.7.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 "base64.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 
173 class DesPrivate : public TTKPrivate<Des>
174 {
175 public:
176  quint64 bitTransform(const int *array, int len, quint64 source);
177  void desSubKeys(quint64 key, quint64* K, Des::Mode mode);
178  quint64 des64(quint64 *subkeys, quint64 data);
179  char* encrypt(char *src, int length, char *key);
180 
182 };
183 
184 quint64 DesPrivate::bitTransform(const int *array, int len, quint64 source)
185 {
186  quint64 dest = 0;
187  const quint64 bts = source;
188 
189  for(int bti = 0; bti < len; ++bti)
190  {
191  if(array[bti] >= 0 && (bts & ARRAYMASK[array[bti]]) != 0)
192  {
193  dest |= ARRAYMASK[bti];
194  }
195  }
196  return dest;
197 }
198 
199 void DesPrivate::desSubKeys(quint64 key, quint64* K, Des::Mode mode)
200 {
201  quint64 temp = bitTransform(ARRAYPC_1, 56, key);
202  for(int j = 0; j < 16; ++j)
203  {
204  const quint64 source = temp;
205  temp = ((source & ARRAYLSMASK[ARRAYLS[j]]) << (28 - ARRAYLS[j])) | ((source & ~ARRAYLSMASK[ARRAYLS[j]]) >> ARRAYLS[j]);
206  K[j] = bitTransform(ARRAYPC_2, 64, temp);
207  }
208 
209  if(mode == Des::Mode::Decrypt)
210  {
211  quint64 t;
212  for(int j = 0; j < 8; ++j)
213  {
214  t = K[j];
215  K[j] = K[15 - j];
216  K[15 - j] = t;
217  }
218  }
219 }
220 
221 quint64 DesPrivate::des64(quint64 *subkeys, quint64 data)
222 {
223  quint64 out = bitTransform(ARRAYIP, 64, data);
224  quint64 l = 0, r = 0;
225  int sOut = 0;
226 
227  uchar *pR = new uchar[8];
228  int *pSource = new int[2];
229  pSource[0] = (int) (out & quint64(0x00000000ffffffffl));
230  pSource[1] = (int) ((out & quint64(0xffffffff00000000l)) >> 32);
231 
232  for(int i = 0; i < 16; ++i)
233  {
234  r = pSource[1];
235  r = bitTransform(ARRAYE, 64, r);
236  r ^= subkeys[i];
237 
238  for(int k = 0; k < 8; ++k)
239  {
240  pR[k] = (uchar) (0xff & (r >> (k * 8)));
241  }
242 
243  sOut = 0;
244  for(int sbi = 7; sbi >= 0; --sbi)
245  {
246  sOut <<= 4;
247  sOut |= MATRIXNSBOX[sbi][pR[sbi]];
248  }
249  r = sOut;
250  r = bitTransform(ARRAYP, 32, r);
251 
252  l = pSource[0];
253  pSource[0] = pSource[1];
254  pSource[1] = (int) (l ^ r);
255  }
256 
257  int t = pSource[0];
258  pSource[0] = pSource[1];
259  pSource[1] = t;
260 
261  out = ((quint64) pSource[1] << 32 & quint64(0xffffffff00000000l)) | (quint64) (quint64(0x00000000ffffffffl) & pSource[0]);
262  out = bitTransform(ARRAYIP_1, 64, out);
263 
264  delete[] pR;
265  delete[] pSource;
266 
267  return out;
268 }
269 
270 char* DesPrivate::encrypt(char *src, int length, char *key)
271 {
272  quint64 keyl = 0;
273  for(int i = 0; i < 8; ++i)
274  {
275  const quint64 temp = (quint64) key[i] << (i * 8);
276  keyl |= temp;
277  }
278 
279  const int num = length / 8;
280 
281  quint64* subKey = new quint64[16];
282  for(int i = 0; i < 16; ++i)
283  {
284  subKey[i] = 0;
285  }
286  desSubKeys(keyl, subKey, m_mode);
287 
288  quint64* pSrc = (quint64*) malloc(num * sizeof(quint64));
289  for(int i = 0; i < num; ++i)
290  {
291  pSrc[i] = 0;
292  for(int j = 0; j < 8; ++j)
293  {
294  pSrc[i] |= (quint64) src[i * 8 + j] << (j * 8);
295  }
296  }
297 
298  quint64* pEncyrpt = (quint64*) malloc((((num + 1) * 8 + 1) / 8) * sizeof(quint64));
299  for(int i = 0; i < num; ++i)
300  {
301  pEncyrpt[i] = des64(subKey, pSrc[i]);
302  }
303 
304  const int len = length;
305  const int tailNum = len % 8;
306  char* szTail = (char*) malloc(length - num * 8);
307 
308  memcpy(szTail, src + num * 8, length - num * 8);
309 
310  quint64 tail64 = 0;
311  for(int i = 0; i < tailNum; ++i)
312  {
313  tail64 = tail64 | (quint64(szTail[i])) << (i * 8);
314  }
315 
316  pEncyrpt[num] = des64(subKey, tail64);
317  char* result = (char*) malloc((num + 1) * 8);
318 
319  int temp = 0;
320  for(int i = 0; i < num + 1; ++i)
321  {
322  for(int j = 0; j < 8; ++j)
323  {
324  result[temp] = (char) (0xff & (pEncyrpt[i] >> (j * 8)));
325  temp++;
326  }
327  }
328 
329  delete[] subKey;
330  free(pSrc);
331  free(pEncyrpt);
332  free(szTail);
333 
334  return result;
335 }
336 
337 
338 
340 {
342 }
343 
344 QByteArray Des::encrypt(const QByteArray &in, const QByteArray &key)
345 {
346  TTK_D(Des);
347  d->m_mode = Mode::Encrypt;
348  char *encData = d->encrypt((char *)in.data(), in.length(), (char *)key.data());
349  const TTKString &str = QAlgorithm::base64Encode((unsigned char *)encData, (in.length() / 8 + 1) * 8);
350 
351  delete encData;
352  return QByteArray(str.data(), str.length());
353 }
354 
355 QByteArray Des::decrypt(const QByteArray &in, const QByteArray &key)
356 {
357  TTK_D(Des);
358  d->m_mode = Mode::Decrypt;
359  const TTKString &str = QAlgorithm::base64Decode(TTKString(in.data(), in.length()));
360  char *encData = d->encrypt((char *)str.data(), str.length(), (char *)key.data());
361 
362  QByteArray value(encData);
363  delete encData;
364  return value;
365 }
366 }
quint64 des64(quint64 *subkeys, quint64 data)
Definition: deswrapper.cpp:221
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
static constexpr wchar_t key[]
QByteArray decrypt(const QByteArray &in, const QByteArray &key)
Definition: deswrapper.cpp:355
void desSubKeys(quint64 key, quint64 *K, Des::Mode mode)
Definition: deswrapper.cpp:199
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:344
static constexpr int ARRAYPC_2[]
Definition: deswrapper.cpp:150
TTKString base64Decode(const TTKString &bytes)
Definition: base64.cpp:66
The namespace of the algorithm.
TTKString base64Encode(const unsigned char *bytes, unsigned int len)
Definition: base64.cpp:16
std::string TTKString
Definition: ttkglobal.h:121
char * encrypt(char *src, int length, char *key)
Definition: deswrapper.cpp:270
The class of the des wrapper private.
Definition: deswrapper.cpp:173
The class of the des wrapper.
Definition: deswrapper.h:34
static constexpr quint64 ARRAYMASK[]
Definition: deswrapper.cpp:6
static constexpr int ARRAYLS[]
Definition: deswrapper.cpp:161
static constexpr int ARRAYIP[]
Definition: deswrapper.cpp:25
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:184
#define TTK_D(Class)
Definition: ttkprivate.h:41