二、由独立试验产生双字母。根据Beker在1982年统计的英文双字母的频数给出了双字母的频率。
统计出的英文双字母的概率最大的30对字母按概率大小排列为:
th he in er an re ed on es st en at to nt ha nd ou ea ng as or ti is et it ar te se hi of
只要我们随意统计足够长的英文课文,只要内容不是太特殊,其结果一定和上面的概率基本相同,这也表明双字母在英文课文中出现的概率是基本可预测的,它为密码分析提供了又一方面的依据。
类似的,我们还可以考察英文课文中三字母出现的频率。仍按Beker在1982年统计的结果(样本总数100 360)得到概率最大的20组三字母按概率大小排列为:
the ing and her ere ent tha nth was eth for dth hat she ion his sth ers ver
特别,the出现的频率几乎为ing的3倍。
应当强调指出,在利用统计分析法时,密文量要足够大,否则会加大密码攻击的难度。在实际通信中,除了字母外,还有诸如标点、数字等字符,它们的统计特性也必须考虑进去。数据格式、报头信息对于密码体制的安全有重要意义,在密码分析中也起着重要的作用。
在分析或攻击一份密报时利用英文的下述统计特性很有帮助。
⑴冠词the对英文的统计特性影响很大,它使t,h,th,he和the在单字母、双字母和三字母的统计中都为高概率的元素。
⑵英文单词中以 E,S,D,T 为结尾的超过一半
⑶英文单词中以 T,A,S,W 为起始字母的约占一半
⑷①在分析或攻击密文时应先找突破口,一般来说,先从the a i入手。(能一个字母独立作为单词的只有a、I,而且频率较高时优先考虑a)
②如果有“’”出现,“’”后的一个字母只能是t s l d v中的一个;如果是两个字母,则只能是re ll。(两个不同字母即是re,相同即是ll)
③其它规律:如果四字单词词末有两个相同字母,往往是ll;
以a开头的三字单词只能是and are中的一个;
两个字母的组合中如果出现q*,则*是u(q后几乎总是u);
如果一个单词的开头和结尾是同一个字母,最可能的是:s t d;
两个都是辅音的双字母组合,常含有n或t;io、ou和ea是最常见的双元音字母组;
如果单词的头两个字母都是辅音,则第二个字母最可能是:r、l和h;
如果一个三次以三个辅音结尾,那最常见的是-ght和-tch;
反向双字母组合: er-re, es-se, an-na, it-ti, on-no, en-ne, ot-to,ed-de, st-ts, at-ta, ar-ra, in-ni;
小词的使用频率
1-letter: a,i,o
2-letter: of,to,in,is,it,be,as,at
3-letter: the,and,for,are,but,not,you,all
4-letter: that,with,have,this,will,your,from,they
5-letter: which,would,there
元音字母:a,e,i,o,u
元音后最常见的字母是n,元音前最常见的字母是h
常见的双字母前缀 re co un com il ir up
最常用的三字母后缀 ion ing
最常见词尾 ed es er
【例】
1.攻击例题:
给定密文为GROX CMRYYVLYIC COXN COMBOD WOCCKQOC DY OKMR YDROB DROI YPDOX SXFOXD K MYNO LI VODDSXQ OKMR VODDOB YP DRO KVZRKLOB BOZBOCOXD KXYDROB YXO
攻击的第一步是做出密文字母出现的频次分布表
第二步是根据密文字母的频次统计,确定某些密文字母对应的明文字母可能是单字母频率统计表中的哪些字母。此例中
密文字母 对应的明文字母
O,D,B,V e,t,r,l
第三步是利用自然语言的文字结合规律进行猜测。D经常出现在词头或词尾,故猜测它与t对应;而P经常在词尾出现而未在词头出现,所以猜测它与明文字母e对应;K单独出现且频率较高,猜测与a对应。
利用双字母、三字母统计特性及元音辅音拼写知识,可猜测如下:
由此不难猜出:GROX是when,OKMR是each,VODDSXQ是letting,KXYDROB是another,DY是to。
再得到下表:
再做进一步确定就可确定C,W,I,N,F,Q,Z对应的明文字母。经过整理恢复的明文如下:
when schoolboys send secret messages to each other they often invent a code by letting each letter of the alphaber represent another one.
1 #include 2 #include 3 #include 4 using namespace std; 5 const char c[27]={ 'd','j','k','z','u', 6 'x','c','m','l','i','w','b','v','n','o','p', 7 'q','a','r','s','g','h', 8 'f','t','y','e',' '}; 9 void encryption(ifstream& fin,ofstream& fout);10 int main()11 {12 ifstream fin;13 ofstream fout;14 fin.open("file1_1.in");15 if(fin.fail())16 {17 cout<<"File open error!(Input)"< ='a'&&next<='z')38 {39 i=next-'a';40 ch=c[i];41 fout<
//file1_1.inwe will attack tomorrow morning
//file1_1.outfu flbb dssdkw sovoaaof voanlnc