1. 程式人生 > >凱撒-破解 頻度分析法C++

凱撒-破解 頻度分析法C++

今天看了重溫了《給祕密加把鎖》一書 激起創作熱情,準備把凱撒密碼單字母替換術掉打一會。 首先,讓我們重溫經典,看看阿拉伯人的頻度分析法複習一下

Algorithm編寫思路

首先,對貢獻了此演算法的阿拉伯人表示由衷的感謝!!!
劃線感謝 عبرت شكرا
接下來我們來看阿拉伯人是怎麼做的
第一步:建立頻率表
	以英文舉例,頻率表如下
	'e''t''a''o''i''r''s''n''h''d''c''l''m'
	'p''u''f''g''w''y''b''v''k''x''j''q''z'
	其中第x個便是出現頻率第x高的字母
第二步:排序字母
	按照在字串中出現的次序排序,先是一個O(n)的計數
	然後STL《algorithm》sort(s,e,cmp)排序瞭解一下。
第三步:建立對映
	也就是把字元和字元對應一下而已,遍歷26次
	Bitmap對映一下
第四部:進行替換
	遍歷一下字串,進行替換。
接著--- 密碼已破譯

程式碼

來來來,cpp程式碼來來來
  2 #include<cstring>
  3 #include<algorithm>
  4 #define cc 26
  5 using namespace std;
  6 const char tsd[cc]=
  7 {'e','t','a','o','i','r','s','n','h','d','c','l','m'
  8 ,'p','u','f','g','w','y','b','v','k','x','j','q','z'
  9 };
 10 int times[cc],fs[cc];
 11 char map[cc],str[1000],res[1000];
 12 bool cmp(int a,int b){
 13     return times[a]>times[b];
 14 }
 15 int main(){
 16     cin>>str;
 17     int l=strlen(str);
 18     cout<<l<<endl;
 19     res[l]='\0';
 20     memset(times,0,sizeof(times));
 21     for(int i=0;i<l;i++){
 22         times[str[i]-'a']++;
 23     }
 24     for(int i=0;i<cc;i++){
 25         cout<<times[i]<<endl;
 26         fs[i]=i;
 27     }
 28     cout<<endl;
 29     sort(fs,fs+cc,cmp);
 30     for(int i=0;i<cc;i++){
 31         cout<<char(fs[i]+'a')<<' '<<times[fs[i]]<<' '<<tsd[i]<<endl;
 32         map[fs[i]]=tsd[i];
 33     }
 34     cout<<endl;
 35     for(int i=0;i<l;i++){
 36         res[i]=map[str[i]-'a'];
 37     }
 38     cout<<res<<endl;
 39     return 0;
 40 }