JAVA
一开始使用IDA查看,栈内操作比较复杂,再加上Optimized-out的东西较多,看不出来。 后来使用JD-GUI
,得到代码。
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));
}
对字符串进行了加密操作。 一开始想当然的写出原文生成代码 #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理解为不会影响其他位的加法溢出) 但需要说明的是需要括号内的条件防止操作进位破坏其他高位数据。