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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#include<stdio.h>
#include<string.h>
#include <string>
#include <iostream>
using namespace std;
static const char inputcode[] =
{ "0123456789+/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
int16_t Gen(unsigned char* indata, uint16_t inlen, unsigned char* outdata)
{
uint16_t i, j;
for (i = 0, j = 0; i < (inlen / 3) * 3; i = i + 3, j = j + 4)
{
outdata[j] = 0;
outdata[j + 1] = 0;
outdata[j + 2] = 0;
outdata[j + 3] = 0;
outdata[j] = indata[i] >> 2;
outdata[j + 1] = (((indata[i] & 0x03) << 4) | (indata[i + 1] >> 4));
outdata[j + 2] = (((indata[i + 1] & 0x0F) << 2) | ((indata[i + 2] & 0xC0) >> 6));
outdata[j + 3] = (indata[i + 2] & 0x3F);
}
for (i = 0; i < j; i++)
{
outdata[i] = inputcode[outdata[i]];
}
if ((inlen % 3) == 1)
{
outdata[i] = 0;
outdata[i + 1] = 0;
outdata[i + 2] = 0;
outdata[i + 3] = 0;
outdata[i] = indata[inlen - 1] >> 2;
outdata[i + 1] = ((indata[inlen - 1] & 0x03) << 4);
outdata[i] = inputcode[outdata[i]];
outdata[i + 1] = inputcode[outdata[i + 1]];
outdata[i + 2] = '=';
outdata[i + 3] = '=';
i = i + 4;
}
if ((inlen % 3) == 2)
{
outdata[i] = 0;
outdata[i + 1] = 0;
outdata[i + 2] = 0;
outdata[i + 3] = 0;
outdata[i] = indata[inlen - 2] >> 2;
outdata[i + 1] = (((indata[inlen - 2] & 0x03) << 4) | (indata[inlen - 1] >> 4));
outdata[i + 2] = (indata[inlen - 1] & 0x0F) << 2;
outdata[i] = inputcode[outdata[i]];
outdata[i + 1] = inputcode[outdata[i + 1]];
outdata[i + 2] = inputcode[outdata[i + 2]];
outdata[i + 3] = '=';
i = i + 4;
}
return i;
}
void encode(unsigned char* S_table, unsigned char* T_table, unsigned char* arr, unsigned int len, unsigned char* k, unsigned int len_k)
{
int i, j = 0, tmp, key, index = 0;
for (i = 0; i < 256; i++)
{
S_table[i] = i;
T_table[i] = k[i % len_k];
}
for (i = 0; i < 256; i++)
{
j = (j + S_table[i] + T_table[i]) % 256;
tmp = S_table[j];
S_table[j] = S_table[i];
S_table[i] = tmp;
}
i = 0;
j = 0;
while (len > 0)
{
i = (i + 1) % 256;
j = (j + S_table[i]) % 256;
tmp = S_table[j];
S_table[j] = S_table[i];
S_table[i] = tmp;
key = (S_table[i] + S_table[j]) % 256;
arr[index] = arr[index] ^ S_table[key];
printf("%c",arr[index]);
index++;
len--;
}
}
int main()
{
unsigned char arr[33] = {0xfd,0xb7,0x78,0xc5,0x47,0x34,0x5c,0xee,0xab,0xbb,0x6a,0x9b,0xdb,0x68,0x75,0x7d,0x4f,0xfc,0xb8,0x40,0x5a,0xe3,0x55,0x83,0xe4,0x6f,0xdf,0x8c,0xe2,0xf1,0xc6,0x8e},
data[] = { 0x5A, 0x70, 0x72, 0x53, 0x4C, 0x69, 0x71, 0x4F, 0x6C, 0x63, 0x55, 0x46, 0x49, 0x51, 0x45, 0x70,
0x51, 0x51, 0x76, 0x50, 0x74, 0x69, 0x5A, 0x57, 0x49, 0x34, 0x31, 0x6F, 0x53, 0x50, 0x6B, 0x33,
0x54, 0x36, 0x5A, 0x74, 0x78, 0x63, 0x2F, 0x4C, 0x4C, 0x43, 0x53, 0x3D };
unsigned char S_table[256] = { 0 }, T_table[256] = { 0 }, k[] = { "democtf1" };
int flag = 0;
int n = strlen((const char*)arr);
if ( n == 32)
{
encode(S_table, T_table, arr, sizeof(arr), k, sizeof(k) - 1);
}
else
{
printf("try again~");
return 0;
}
unsigned char encoded[50] = {0};
Gen(arr, n, encoded);
n = strlen((const char*)encoded);
for (int i = 0; i < n ; i++)
{
if (data[i] == encoded[i])
flag++;
}
if (flag == 44)
printf("right!");
else
printf("try again~");
return 0;
}
|