题目背景
“二八”妙龄写密码,看谁聪明“爱死他”。
密文:766C7273626F76706A5E6F715F7271766C72706D626B71716C6C71666A62
解密过程
“二八”对应十六进制,“爱死他”对应ASCII,所以尝试输出每两位十六进制的数对应的ASCII的字符:
int dst[30]; void decode(char *s) { int i; //每两位十六进制字符转成十进制数存到dst数组中 int temp1, temp2; for(i = 0;i < 60;i+=2) { temp1 = s[i] > 58 ? (s[i] - 55) : (s[i] - 48); temp2 = s[i+1] > 58 ? (s[i+1] - 55) : (s[i+1] - 48); dst[i/2] = temp1*16 + temp2; } for(i = 0;i < 30;i++) printf("%c",dst[i]); printf("\n"); }
而输出是:vlrsbovpj^oq_rqvlrpmbkqqllqfjb
所以尝试加上偏移量:
int dst[30]; void decode(char *s) { int i,bias; //每两位十六进制字符转成十进制数存到dst数组中 int temp1, temp2; for(i = 0;i < 60;i+=2) { temp1 = s[i] > 58 ? (s[i] - 55) : (s[i] - 48); temp2 = s[i+1] > 58 ? (s[i+1] - 55) : (s[i+1] - 48); dst[i/2] = temp1*16 + temp2; } //加上偏移量 for(bias = -127; bias < 128; bias++) { for(i = 0;i < 30;i++) printf("%c",dst[i] + bias); printf("\n"); } }
输出结果:
从挑选出最像明文的字符串:youverysmartbutyouspenttootime
解密完成