1.elf
其加密的过程是
v1 = -85;
v2 = 0;
for ( i = 0; i <= 39; ++i )
{
for ( j = 0; j <= 50; ++j )
{
v1 ^= j ^ v2 ^ 0x5F;
s[i] ^= s[(i + 1) % 40];
s[i] ^= v1;
++v2;
}
}
可以直接找到它加密后的字符串
可以直接根据加密算法逆推答案
#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;
}
解出答案就是SYC{bIIngxvJqVDOUqbuiHDpadwfdRePetteyBP}
在程序中输入验证后确实就是正确答案