凱撒-破解 頻度分析法C++
阿新 • • 發佈:2018-12-17
今天看了重溫了《給祕密加把鎖》一書
激起創作熱情,準備把凱撒密碼單字母替換術掉打一會。
首先,讓我們重溫經典,看看阿拉伯人的頻度分析法複習一下
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 }