JAVA
一开始使用IDA查看,栈内操作比较复杂,再加上Optimized-out的东西较多,看不出来。
后来使用JD-GUI,得到代码。
1 2 3 4 5 6
| public static void Encrypt(char[] arr) { ArrayList<Integer> Resultlist = new ArrayList<>(); for (int i = 0; i < arr.length; i++) { int result = arr[i] + 64 ^ 0x20; Resultlist.add(Integer.valueOf(result)); }
|
对字符串进行了加密操作。 一开始想当然的写出原文生成代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <iostream> #include <cstring> #include <string> #include <iomanip>
using namespace std;
int s[] = { 180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65 };
int main() { for (int i = 0; i <= end(s) - begin(s); i++) cout << (char)(s[i] - 64 ^ 0x20); return 0; }
|
朴素地认为,把加号改成减号就好, ####
这样做可以得到正确的答案,但是思路是绝对错误的
但是此题通过之后才发现+ -的优先级比异或的高 就代表:
在位运算下,
成立
c的那位会来回翻转,没有系数的话
偶数 次 XOR 操作就可,再用

约束“撞”位操作即可。
(这里可以把XOR理解为不会影响其他位的加法溢出)
但需要说明的是需要括号内的条件防止操作进位破坏其他高位数据。