题目
菜狗截获了一份报文如下c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2,生气地掀翻了桌子(╯°□°)╯︵ ┻━┻
解题思路
通过观察这份报文可知,这份报文最大的字符为‘f’。md5的组成为:32位字符串,其中的字符为:a-f,0-9.肉眼可以很明显的观察到,这份报文的长度不止32位,所以该报文不是md5加密。可以将该报文复制进一个文本文档中或者写代码计数。
由这副图片可以看出这份报文的长度为118.将其两两分开得到一串16进制数字。将其转化为10进制数字后得到:
200 233 172 160 198 242 229 243 232 196 239 231 161 160 212 232 229 160 230 236 225 231 160 233 243 186 160 232 234 250 227 249 228 234 250 226 234 228 227 234 235 250 235 227 245 231 233 243 228 227 232 234 249 234 243 226 228 230 242;
得到这么长一串数字,得不出啥玩意儿。这些数字均超过了128,无法转化成ASCII码进行展示。那不妨将这些数字都减去个128试试。试试就逝世~
减去128后得到的字符串如下:
的确该掀桌子了!!!
这是转十六进制与ASCII的代码(只需将一维数组变为二维数组即可):
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; int main() { char a[2];//将十六进制数字转化为字符串 int b[2]={0}; int i=0,sum=0; int c=0;//最后的十进制数字 cin>>a; while(a[sum]!='\0') { if(a[sum]>='a'&&a[sum]<='z') { b[sum]=a[sum]-'a'+10; sum++; continue; } b[sum]=a[sum]-'0'; sum++; }//求出a数组中每一位十六进制数字所对应的十进制数字 for(i=0;i<sum;i++) { b[sum-1-i]=b[sum-1-i]*pow(16,i); } for(i=0;i<sum;i++) { c=c+b[i]; } cout<<c<<endl;//输出十进制数字 c=c-128; printf("%c",c);//输出十进制数字减去128后所对应的字符 return 0; }