一网易少女,长文解密一封来自艾泽拉斯的
to网易云信的小伙伴:
感谢你们这一次寓教于乐的创意,让我学到了很多东西,我很喜欢你们的产品。本文只是个人观点,如有雷同,不胜荣幸。本文不代表官方立场。我特意在31号发文,就是不想给你们的活动造成影响。如果造成了困扰,我深表歉意。
——程钧沅
云小信按:5月30日,云小信发出的《一封来自艾泽拉斯的密码信》,火烧朋友圈及各大论坛。一时间,“没文化连广告都看不懂了”的欢乐自嘲声,不绝于耳,文科僧理科婶也在高考前撕起来了。
我大黄易的老司机和小伙伴们,自然也难逃烧脑,纷纷加入了这场解密风潮。事后,一高人(~竟也是位少女啊!~)在我网易实践者社区发了文,一时无数点赞跪拜~
以下是原文网易传媒技术部-移动技术中心·程钧沅
上周收到网易云信的“密码信”,信中说解密正确可以获得魔兽手办。我不玩魔兽,但是我家那位是十年的魔兽玩家,曾经为了解锁炉石马,拉着我玩炉石……不如研究一下解密,人品好兴许弄个手办带回家。闲话不多说,直接记录一下解密过程。
答案在文章中
线索一:对称加密头脑风暴:什么是对称加密?回答:同一秘钥加密解密。
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
头脑风暴:“对称加密”解决的切入点?回答:找到秘钥!
加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。
比如甲乙约定,一起买一个保险箱,保存金银财宝,共用一个钥匙。只要甲乙小心保管好钥匙,那么就算有人得到保险盒,也无法打开。可是一旦获取钥匙,就很可能拿到财宝。
线索二:八皇后头脑风暴:八皇后是什么?回答:关于棋子摆放位置的解
八皇后问题是十九世纪著名数学家高斯于年提出的。
问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同一行,同一列,或同一斜线上。
头脑风暴:摆放位置都有哪些?回答:解有9组,但是不知道哪一个才是正解。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b...b8,其中bi为相应摆法中第i行皇后所处的列数。例如:,代表皇后分别在第一行第一列,第二行第五列……第八行第4列等。
线索三:已知1月、月的秘钥,求5月秘钥头脑风暴:从1月秘钥可以看出,皇后分别放在()第一行第一列,第二行第五列……第八行第四列;从月秘钥可以看出,皇后分别放在()第一行第一列,第二行第六列……第八行第五列。所以输入是按照1-8的升序排列。回答:升序排列,5月秘钥是
八皇后是一个古老的具有代表性的问题,用计算机求解时的算法也很多,最容易想到的是回溯法,采用一维数组来进行处理。数组的下标i表示棋盘上的第i行,a[i]的值表示皇后在第i行所放的位置。
下面引用一下C++版本的回溯法核心算法,具体算法请参考文章结尾链接。
whil(not_finish)/*not_finish=1:处理尚未结束*/{whil(not_finishi=NUM)/*处理尚未结束且还没处理到第NUM个元素*/{for(flag=1,k=1;flagki;k++)/*判断是否有多个皇后在同一行*/if(a[k]==a[i])flag=0;for(k=1;flagki;k++)/*判断是否有多个皇后在同一对角线*/if((a[i]==a[k]-(k-i))
(a[i]==a[k]+(k-i)))flag=0;if(!flag)/*若存在矛盾不满足要求,需要重新设置第i个元素*/{if(a[i]==a[i-1])/*若a[i]的值已经经过一圈追上a[i-1]的值*/{i--;/*退回一步,重新试探处理前一个元素*/if(i1a[i]==NUM)a[i]=1;/*当a[i]为NUM时将a[i]的值置1*/lsif(i==1a[i]==NUM)not_finish=0;/*当第一位的值达到NUM时结束*/lsa[i]++;/*将a[i]的值取下一个值*/}lsif(a[i]==NUM)a[i]=1;lsa[i]++;/*将a[i]的值取下一个值*/}lsif(++i=NUM)if(a[i-1]==NUM)a[i]=1;/*若前一个元素的值为NUM则a[i]=1*/lsa[i]=a[i-1]+1;/*否则元素的值为前一个元素的下一个值*/}if(not_finish){++count;printf((count-1)%3?[%d]::[%d]:,count);for(k=1;k=NUM;k++)/*输出结果*/printf(%d,a[k]);if(a[NUM-1]NUM)a[NUM-1]++;/*修改倒数第二位的值*/lsa[NUM-1]=1;i=NUM-1;/*开始寻找下一个足条件的解*/}}
其实八皇后问题早都列入了小学奥数,是的,母亲大人曾给我买过一本崭新的奥数竞赛题,我略过一眼。说到严蔚敏的C++算法,也有八皇后的一席之地。所以对于程序猿来说,解题应该不是难事。况且,网络上搜索八皇后,各种java、js、C++等的解法都是现成的。
在这些算法当中,我发现了几个特立独行的,其中一个是位算法,是10年前匿名的大神写的。简单的看了一下算法原理,它有别于传统的数组判断模式,非常效率,至少让我长见识了。我在这里只引用核心算法,具体算法可以看文章后面的参考链接。
voidtst(longrow,longld,longrd){if(row!=upprlim){longpos=upprlim~(row
ld
rd);whil(pos){longp=pos-pos;pos-=p;tst(row+p,(ld+p)1,(rd+p)1);}}lssum++;}线索四:gt破译工具
头脑风暴:怎么知道是哪种加密算法呢?回答: