近日,Google Jobs在MIT校园内到处张贴着一份密码,企图在MIT校园里的一群变态中找出几个最变态的破密大牛。密码上面附文说,如果你能破解这份密码,你在 Google会很有前途。据说,这份密码包含了一个Google Jobs的电话号码,解开密码的人可以通过此电话留下自己的个人信息。目前,还没有人破解出这段密码来。

密文如下:8MLDQ6TUI6TFMLRHAANRA6Q8EFLDMQ86II2032S5J13JXOJ。希望大家先试试。虽然第一手思路也不是我自己写的。:)
其实这道题目说难也不是很难,但是说简单也不会很简单,这里我简单的说一下我的思路,毕竟是解密的东西,有时候还是要靠运气的。
首先我们看到了这个题目,想想可能是最简单的替换算法,最简单的东西就算还原了去看也满复杂的,首先我想到的是最简单的“凯撒替换”,关于什么是凯撒密码,可以去看这里。知道凯撒密码,我们就可以做一个简单的替换。然后试试。
static char GetChar2(char c)
{
switch (c)
{
case ‘0‘: return ‘4‘;
case ‘1‘: return ‘5‘;
case ‘2‘: return ‘6‘;
case ‘3‘: return ‘7‘;
case ‘4‘: return ‘8‘;
case ‘5‘: return ‘9‘;
case ‘6‘: return ‘a‘;
case ‘7‘: return ‘b‘;
case ‘8‘: return ‘c‘;
case ‘9‘: return ‘d‘;
case ‘a‘: return ‘e‘;
case ‘b‘: return ‘f‘;
case ‘c‘: return ‘g‘;
case ‘d‘: return ‘h‘;
case ‘e‘: return ‘i‘;
case ‘f‘: return ‘j‘;
case ‘g‘: return ‘k‘;
case ‘h‘: return ‘l‘;
case ‘i‘: return ‘m‘;
case ‘j‘: return ‘n‘;
case ‘k‘: return ‘o‘;
case ‘l‘: return ‘p‘;
case ‘m‘: return ‘q‘;
case ‘n‘: return ‘r‘;
case ‘o‘: return ‘s‘;
case ‘p‘: return ‘t‘;
case ‘q‘: return ‘u‘;
case ‘r‘: return ‘v‘;
case ‘s‘: return ‘w‘;
case ‘t‘: return ‘x‘;
case ‘u‘: return ‘y‘;
case ‘v‘: return ‘z‘;
case ‘w‘: return ‘0‘;
case ‘x‘: return ‘1‘;
case ‘y‘: return ‘2‘;
case ‘z‘: return ‘3‘;
case ‘ ‘: return ‘ ‘;
default: return ‘*‘;
}
}然后我们的主体函数写成这样,看看下面的代码。
static void Main(string[] args)
{
string code = “8MLDQ6TUI6TFMLRHAANRA6Q8EFLDMQ86II2032S5J13JXOJ“;
code = GetResult(code.ToLower());
Console.WriteLine(code);
Console.ReadKey();
}
static string GetResult(string code)
{
string retcode = string.Empty ;
for (int tempNum = 0; tempNum < code.Length; tempNum++)
{
retcode += GetChar2(code[tempNum]);
}
return retcode;
}思路不是很难,然后看看结果。cqphuaxymaxjqpvleerveaucijphqucamm6476w9n57n1sn。晕,无语,显然不是我们想要的结果。难道不是凯撒密码,如果不是的话,那我就没办法了,毕竟我对密码学不是很了解。再看看密文,这里有个关键就是,英文里面破译了会说什么?Conguratulations,或者之类的,好吧,我们先map一下,Congratulations匹配8MLDQ6TUI6TFMLR。这样我们就有了一些基本的数字的匹配,但是还不能解决所有的内容。
这里我们可以看到凯撒密码是向后移位4格,刚好和JOBS有联系,而且C是8的话,刚好是以4开头,也就刚好缺少了0,1,2,3这四个数字,那么可以看出JOBS刚好就是0,1,2,3。所以我们可以把GetCode改成下面的代码(这个解释可能有点牵强,不过解密确实很多时候都是靠感觉和运气)。
static char GetChar(char c)
{
switch (c)
{
case ‘0‘: return ‘4‘;
case ‘1‘: return ‘5‘;
case ‘2‘: return ‘6‘;
case ‘3‘: return ‘7‘;
case ‘4‘: return ‘8‘;
case ‘5‘: return ‘9‘;
case ‘6‘: return ‘a‘;
case ‘7‘: return ‘b‘;
case ‘8‘: return ‘c‘;
case ‘9‘: return ‘d‘;
case ‘a‘: return ‘e‘;
case ‘b‘: return ‘2‘;
case ‘c‘: return ‘f‘;
case ‘d‘: return ‘g‘;
case ‘e‘: return ‘h‘;
case ‘f‘: return ‘i‘;
case ‘g‘: return ‘j‘;
case ‘h‘: return ‘k‘;
case ‘i‘: return ‘l‘;
case ‘j‘: return ‘0‘;
case ‘k‘: return ‘m‘;
case ‘l‘: return ‘n‘;
case ‘m‘: return ‘o‘;
case ‘n‘: return ‘p‘;
case ‘o‘: return ‘1‘;
case ‘p‘: return ‘q‘;
case ‘q‘: return ‘r‘;
case ‘r‘: return ‘s‘;
case ‘s‘: return ‘3‘;
case ‘t‘: return ‘t‘;
case ‘u‘: return ‘u‘;
case ‘v‘: return ‘v‘;
case ‘w‘: return ‘w‘;
case ‘x‘: return ‘x‘;
case ‘y‘: return ‘y‘;
case ‘z‘: return ‘z‘;
case ‘ ‘: return ‘ ‘;
default: return ‘*‘;
}
}我们再运行一下,得到的答案是congratulationskeepsearchingorcall6476390570x10,再整理一下,答案就是congratulations keep searching or call 6476390570×10。这应该就是标准答案了。
按照某位解密大牛的原文,应该是这样解密的(个人感觉答案貌似是对的但是好像过程也挺牵强的,欢迎大家讨论)。
1) Pick out CONGRATULATIONS
The mapping is pretty straight forward with some gaps in the letters and some ambiguities.
2) Among the ambiguities are the letters J,O,B,S which map to 0,1,2,3
3) That resolves the ambiguities and the resulting map above is the logical result.
































