最近接触到加密还是因为亮陀的一个游戏,在他的blog上一个密码游戏,很是有趣的一些英文排列,帖子的摘要是vegenere。后来我知道,这是加密方法名,要不然我怎么破阿。
既然知道了使用vegenere方法加密,我便去网上搜索一下它的算法,原来我在电子商务课上已经看见过一次了,利用密钥和字符矩阵加的密,读者请自行搜索算法详解。
既然知道算法了,首先编个程序在要求输入密钥的情况下对密文进行解密。下一步就是获取密钥了。
下面我要写的这些感想是基于我与亮陀这一次的经历,因此必然有很多不符合安全法则,我仅仅用它来表达一点想法而已。
因为亮陀的密文是一个个用空格分割的字符串,看起来应该是直接从明文的拼音或英文单词转换过来的,搜索一下,发现似乎没有太有规律的子串,没有重复的子串,于是再看,发现有4个1字符的单词,和两个7字符的单词,其他皆处于2-6之间,考虑到拼音里没有超过6个字符的拼法,所以初步认定明文是用的英文。
第三,第一个单词的密文是of,只有两个字符,考虑到vegenere的密钥显然不可能用一个仅有1位的密钥,因此该单词不存在密钥的循环,所以我们尽可以猜测密钥前两个字符的组成。
第四,考虑到一般人设置密钥应该会用一个单词,没有太多人会喜欢选用ryxbnqxw作为一个密钥的记忆,因此,我们在猜测密钥前两字母的时候便有了很大的选择性,像xd这种在英文单词里出现概率接近于零的排列基本可以排除。同时,由于明文有含义,又有上述假设是用英文写成,所以使用猜测的密钥解出的明文也应该是常见的字母组合,加上仅有2字母,可辨认度更高了,如to,as,so,之类
因此另编一个程序,用来测试密文of针对2个字符、26*26中可能的密钥而得到的明文,将所有结果写出来,现在我们只需要用眼睛检查一下这676个密钥+明文组合,选出其中密钥和明文看起来都不那么别扭的组合,这样的组合是不多的,经挑选,我选出了下列这些:
as:on
br:no
bx:ni
ch:my
fl:ju
on:as
os:an
并不多,其中,on , no , my , as , an 可能性稍大,
于是结合加密人的一些偏好之类的信息,就很有可能猜出密钥,比如chinese,于是终于玩出了亮陀留下的游戏。当然这仅是一个游戏,因此特别简单,我也才能在重重提示下想到这些。
很巧的是,第二天的网络课也正好讲到密码,于是兴趣已经被很大地激发出来的我思维就比较活跃了,在听RSA公开密钥算法的时候,突然有了一个想法。RSA算法利用生成两个大素数,然后弄出一组数,用来通过幂计算密文。
但我想,这样虽然得到了一个字母对应的是一个4位数码,但是26个字母与数码之间是一一对应的,只可能有26种数码,不像vegenere中同一个字符可能会有几种表示,这样的话,由于词频统计已经表明某些最常出现的字母了,如e , t等,因此对数码进行统计可以比较大的缩小搜索范围,加快破解速度。
这是我突然冒出来的一个想法。