TTKMusicPlayer  4.1.3.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 
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 
273  return out;
274 }
275 
276 char* DesPrivate::encrypt(char *src, int length, char *key)
277 {
278  quint64 keyl = 0;
279  for(int i = 0; i < 8; ++i)
280  {
281  const quint64 temp = (quint64) key[i] << (i * 8);
282  keyl |= temp;
283  }
284 
285  const int num = length / 8;
286 
287  quint64* subKey = new quint64[16];
288  for(int i = 0; i < 16; ++i)
289  {
290  subKey[i] = 0;
291  }
292  desSubKeys(keyl, subKey, m_mode);
293 
294  quint64* pSrc = (quint64*) malloc(num * sizeof(quint64));
295  for(int i = 0; i < num; ++i)
296  {
297  pSrc[i] = 0;
298  for(int j = 0; j < 8; ++j)
299  {
300  pSrc[i] |= (quint64) src[i * 8 + j] << (j * 8);
301  }
302  }
303 
304  quint64* pEncyrpt = (quint64*) malloc((((num + 1) * 8 + 1) / 8) * sizeof(quint64));
305  for(int i = 0; i < num; ++i)
306  {
307  pEncyrpt[i] = des64(subKey, pSrc[i]);
308  }
309 
310  const int len = length;
311  const int tailNum = len % 8;
312  char* szTail = (char*) malloc(length - num * 8);
313 
314  memcpy(szTail, src + num * 8, length - num * 8);
315 
316  quint64 tail64 = 0;
317  for(int i = 0; i < tailNum; ++i)
318  {
319  tail64 = tail64 | (quint64(szTail[i])) << (i * 8);
320  }
321 
322  pEncyrpt[num] = des64(subKey, tail64);
323  char* result = (char*) malloc((num + 1) * 8);
324 
325  int temp = 0;
326  for(int i = 0; i < num + 1; ++i)
327  {
328  for(int j = 0; j < 8; ++j)
329  {
330  result[temp] = (char) (0xff & (pEncyrpt[i] >> (j * 8)));
331  temp++;
332  }
333  }
334 
335  delete[] subKey;
336  free(pSrc);
337  free(pEncyrpt);
338  free(szTail);
339 
340  return result;
341 }
342 
343 
344 
346 {
348 }
349 
350 QByteArray Des::encrypt(const QByteArray &in, const QByteArray &key)
351 {
352  TTK_D(Des);
353  d->m_mode = Mode::Encrypt;
354  char *encData = d->encrypt((char *)in.data(), in.length(), (char *)key.data());
355  const TTKString &str = QAlgorithm::base64Encode((unsigned char *)encData, (in.length() / 8 + 1) * 8);
356 
357  delete encData;
358  return QByteArray(str.data(), str.length());
359 }
360 
361 QByteArray Des::decrypt(const QByteArray &in, const QByteArray &key)
362 {
363  TTK_D(Des);
364  d->m_mode = Mode::Decrypt;
365  const TTKString &str = QAlgorithm::base64Decode(TTKString(in.data(), in.length()));
366  char *encData = d->encrypt((char *)str.data(), str.length(), (char *)key.data());
367 
368  QByteArray value(encData);
369  delete encData;
370  return value;
371 }
372 }
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
static constexpr wchar_t key[]
QByteArray decrypt(const QByteArray &in, const QByteArray &key)
Definition: deswrapper.cpp:361
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:350
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:276
The class of the des wrapper private.
Definition: deswrapper.cpp:179
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:190
#define TTK_D(Class)
Definition: ttkprivate.h:41
void desSubKeys(quint64 key, quint64 *K, Mode mode)
Definition: deswrapper.cpp:205