0x00.密文分析
第一次拿到这样一个txt文档,有7061个字节,由26个英文字母组成
ekfskkjxqhzjehueplxiroiitxegvltpuefdaiihvhehlenqhmxtnqsbblbtobporwfihmpotpehhahmalbwrifehqsblenqhmxhcjqmhtpehhaeuwmejlbxpkomkbhkblbtokfpmeikhehusippnxfajdtnmstriuvbpokhrpjrkxmtbgbioswpgtgeejkqeihjmjiftfkqeihosemgjfbhoirmrwimwpetfbtmkblbtoawtejgfeasqhclhjwoifefdeihmiagbblipdkspnusiltrgpbhmbtlbiehqsbadkfpnjcveoswlthathzqpotnptqikfpkptzjxirmrtxaopkcoiwgrqsbdhhbgtbspjcplptoikkotsepxnqqhhwsqhrmwrxwtmpdkqpmqsbhpoohnqefdenhhpalbwhhwsqhrmwrxwtmpdkqpmqsbdecwhcqsbhpoohtpmpedfptrdxeoejkdbinxqsbfthtifwmiambblbbtpehhtgrqsbnskegnjcremeoegegkqeihhhwsqhrmwrxwtmpdkqpmqsbhpoohfeubphhtdihpfxendthihckhuwlpxehqsbferpoiatutmpjibtgiafkqpmetfklipjboepxhhwsqhrmwrxwtmpdkqpmqsbhpoohtpmpedfdthbqtpsbiehqsbnhmhpmphctfboeetgnjitwoxtgraehimsefnwdctgbvefwehlenjvhdthithimiupuwiifpswlbqhrtxpjrmtfkqeywtnltgwcqdiihrtqeihehtmbhmbupstubnhgwoijqmhtpehhpikkeptdpjikpsknsbnbvlphqsbtlelepwipphcjqmopjrnfeivohpwoswfkbgtaeewgpuhmimiaoswiihmpeoqqeihthioswrbndkotpehhjcthrbkphiphnpplpxupmwmtbgthakklifenphmxgiqppjvseiswuboxkfpmeikhvkpoiatfdsbelplenhhpwvkptjohgembqskqtfdfbhxbpnftidfphtmvwdftmvlepwfbhvirdrgportmtgpwprqsbrgkdebhtadpmeasqmiadtapfenbooxtgrqsbkqmpqtqhcltjkehwmneotphaseirmpjrkxostokfpmeikltnipctqfqprjgplenklifenphmxgiqpthmiatmtmswleeotyphphcnhfjlkopejgewlhwrthmpwtrjcsjgioehbosemntimwrigdtbtpehhtfboeetskpatsphqsbhpoohjwhjdpkgtrnsbnbknsbnbvleelskpiifpatidftmcpregnrcceitwgpaqhimarovwlbaqnwoigpfepuwostoplpatgdjczrmpeibematgdoqjqvbopcrmbqhawdtwubqskqoswlbtlbegnrcceitwgpaqhimthoswamwtpstqdonjcikjiooqhepxhcqstpgkqeihthimiupstubnhgwointnlosemelpectelpecostovedfbeuwqnrjihrbfthioswltnsbphcalbwrifthioswmbnqmeoxjczrmpeibupstubtdnjiifppjosemstdfjvbimjjopjlbfehitgwltntiaoswctwlewqmbphnxiagiuosemtpgiqegwoiwgotabegplpfrwqoxiaiijdthaiaciooiqtdwoswomtglrefeytharoqojcootrrtfemghhvemplppefbqhgtbbopkdoswjmjftppnjcrwfinlknxhjvtposwotfppjltppcohgqsbitmcthirbphftobstfdpxjcnwamwakqeihoiqsbpqhdepktplhcoteetfzqnqeewgiuenqsbqegwoidecqhqogkqeihcmjfplplreecmkhrnjcmtittdthzqpotnppjoswmid.....
以下省略5k字节(试一试,可以在文后下载原文)
毫无头绪,考虑到目标明文是英文,要从英文的语言特征入手,即要统计字母的频率,同时也要考虑是否有标点符号、空格等非实义字符。
0x01.字母频率统计
我们在统计字母频率之前,要先了解英语文章中的字母统计概率,这是通过大量文字的统计得到的一般性概率,能够体现出英语的语言特征
可以看出,正常的英语文章的单字母槪率降序排序应该是etaoinshrdlcumwfgypbvkjxqz
这个顺序及概率将会在之后破解明文有很大帮助。
下面将开始对Cipher进行字母统计
(1)单字母频率
p--640 9.06%
t--543 7.69%
h--518 7.34%
e--430 6.09%
o--418 5.92%
i--358 5.07%
b--351 4.97%
q--322 4.56%
w--304 4.31%
s--292 4.14%
m--289 4.09%
j--245 3.47%
g--243 3.44%
l--241 3.41%
f--238 3.37%
d--237 3.36%
r--233 3.30%
k--230 3.26%
n--224 3.17%
a--170 2.41%
c--166 2.35%
x--125 1.77%
v--116 1.64%
u--101 1.43%
z--21 0.30%
y--6 0.08%
all—7061
以上统计频率发现,最高频率字母“p”也只有9.06%,与单字母概率极不吻合,于是舍弃仅为单字母的情况。
(2)多表替换情况
由于有了上一次的经验,使用脚本检查Cipher是不是多表代替的情况,直接使用表数为3的多表代替,跑出来结果如下:
三个表的字母频率都很好的吻合了第一步的常见英语文章的字母槪率,并且考虑到舍弃掉空格、标点符号,于是决定从这里尝试破解。
0x02.分析与破解
(1)字母排序
我们将整篇文章按照每个字母先后为mod3同余1、2、0划分为单表1、单表2、单表3,按照常见英语文章的字母概率etaoinshrdlcumwfgypbvkjxqz(明文)对应三个单表(密文)分别为:
单表1:poehtgmsldrcfiavqxnjubzywk
单表2:bpikthmnsfrcegvqoaxjudzlyw
单表3:wqjthepoldiarfbnuxkgsczvym
于是有了初步的转换密钥(密文->明文)。为了计算机处理方便,我们将密钥的密文做a-z的排列得到转换关系为
密文 |
A |
B |
C |
D |
E |
F |