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
| #include<stdio.h> int main() { char s[] = { 161, 186, 110, 70, 128, 244, 217, 170, 180, 54, 90, 204, 140, 30, 149, 33, 143, 67, 225, 19, 138, 168, 106, 66, 174, 251, 247, 165, 157, 11, 75, 222, 186, 0, 135, 35, 144, 70, 211, 223,'\0'};//需补充'\0'作为字符串结尾(后续解密不需修改) char v1 = -85; int v2 = 0; v1 = -85; v2 = 0; int i, j; for (i = 0; i <= 39; ++i) { for (j = 0; j <= 50; ++j) { v1 ^= j ^ v2 ^ 0x5F; ++v2; } }//加密时是从前往后加密,则解密需要从后往前解密,需要求出最后的v1对应的值才能做解密运算 for (i = 39; i >= 0; --i) { for (j = 50; j >= 0; --j) { --v2; s[i] ^= v1; s[i] ^= s[(i + 1) % 40]; v1 ^= j ^ v2 ^ 0x5F; } }//将后面的加密顺序调转(包括指令如加密中最后的++v2变为最上方的--v2,异或运算不用变化,只需跟随加密顺序再将顺序逆转就可进行解密运算了 puts((char *)s);//以字符串输出 return 0; }
|