用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
freshare的公告
<span style="COLOR:FF0000;height:50;width:166" valign="middle"><table height="5" border="0"><tr><td></td></tr></table><table width="166" height="50" border="0" cellpadding="0" cellspacing="0" style="border-style: dotted; border-width: 1"><tr><td style="COLOR:0000FF;height:50;width:160;font-size: 9pt" valign="middle"><marquee height="50" width="160" id="rabbit" onmouseover="rabbit.stop()" onmouseout="rabbit.start()" valign="middle" scrolldelay="1" scrollamount="1" direction="up" style="cursor:hand"> &nbsp;清翔兔欢迎您的光临!<br> &nbsp;有任何建议欢迎与我联系<br>&nbsp;<a href="mailto:f.master@126.com">f.master@126.com</a> </marquee></td></tr></table></span><script language="JavaScript" type="text/javascript" src="http://union1.50bang.com/click.js?user_id=19458"></script>
文章分类
链接我世界
清翔网[1984一代]
清翔兔的作品展示
[玻璃体视网膜]系统
存档

原创  “凯撒”密文的破解编程实现 收藏

凯撒密文的破解编程实现

程序原理:

1.Kaiser Recovery 字典智能
  破解方法:根据字典文件(dict.txt),求出明文可最大满足字典内单词的加密key。
  程序特色:使用字典,可在无人工干涉的情况下,破解密文。

2.Kaiser Recovery 人工辅助
  破解方法:根据密文中字母出现的次数,从高到低,依次对应明文“e”,由用户自行判断是否正确。

3.Kaiser Recovery 传统破解
  破解方法:密文中出现概率次数最多的字母对应明文“e”,由此求出key及明文。

测试结果:

1.使用in2.txt作明文,key=12
  三个程序均能破解出明文。

2.使用in.txt作明文,key=12
  a.传统破解 无法破解明文。
  b.人工辅助 执行第5次,破解出明文。
  c.字典智能 完美破解出明文。


可改进:
  当字典内单词超过10000时,对普通密文的破解准确率将超过99%。
  (这里的普通密文指用英语单词写出的英文语段) 

/*

清翔兔 2006年9月11日
More: http://mycode.i1984.com

Caesar 加密

*/


#include <iostream>
#include <fstream>
using namespace std;


int main(int argc ,char *argv[])
{
 int key;
 if (argc==2)
 {
  key = atoi(argv[1]);
 }
 else
 {
  cout << "输入key:";
  cin >> key;
 }

 ifstream infile("in.txt");
 ofstream outfile("ciper.txt");

 char ch;
 while(infile.get(ch))
 {
  if(ch>=65&&ch<=90)  ch = ch +32;
  if((ch>=97&&ch<=122))
  {
   int ciper = ch + key ;
   if (ciper>122) ciper = ciper -26;
   outfile << char(ciper);
  }
 }
}

/*

清翔兔 2006年9月11日
More: http://mycode.i1984.com

Caesar 解密_传统

说明:所有密文均为小写字母,若不是,可先用加密程序(当key=26)对密文标准格式化。

*/

#include <iostream>
#include <fstream>
using namespace std;


int main(int argc ,char *argv[])
{
 int word_count[26]={0};
 ifstream infile("ciper.txt");
 int key;

 char ch;
 while(infile.get(ch)) word_count[ch-97]++;
 int max = word_count[0];
 int index =0;
 for(int i=1;i<26;i++)
  if(max<word_count[i])
  {
   index =i;
   max =word_count[i];
  }
 index+=97;
 if(index > 'e')  key = index - 'e';
 else key = index - 'e' +26;
 infile.clear();
 infile.seekg(0);
 while(infile.get(ch))
 {
  int ciper_out = ch - key;
  if (ciper_out<97) ciper_out = ciper_out +26;
  cout << char(ciper_out);
 }
 cout <<"\n\n按回车键结束。"<<endl;
 cin.get();
}

/*

清翔兔 2006年9月15日
More: http://mycode.i1984.com

Caesar 解密_人工

说明:所有密文均为小写字母,若不是,可先用加密程序(当key=26)对密文标准格式化。

*/

#include <iostream>
#include <fstream>
#include <map>
using namespace std;


int main(int argc ,char *argv[])
{
 char dict[26]={'e','t','r','n','i','o','y','a','s','b','x','k','q','j','z','c','d','f','g','h','l','m','p','v','u','w'};
 int word_count[26]={0};
 ifstream infile("ciper.txt");
 ofstream outfile("text.txt");
 int key;

 char ch;
 while(infile.get(ch)) word_count[ch-97]++;
 
 //取出最高频字母
 int max = word_count[0];
 int index =0;
 for(int i=1;i<26;i++)
  if(max<word_count[i])
  {
   index =i;
   max =word_count[i];
  }
 index+=97;

 int j=0;
 char user_input='n';
 while(user_input!='y'&&user_input!='Y'&&j<26)
 {
  if(index > dict[j])  key = index - dict[j];
  else key = index - dict[j] +26;
  infile.clear();
  infile.seekg(0);
  cout <<"破解文本片断:"<<endl;
  for (int i=0;(i<50&&(infile.get(ch)));i++)     //输出50个字符片断,并考虑少于50个字符的特殊情况
  {
   int ciper_out = ch - key;
   if (ciper_out<97) ciper_out = ciper_out +26;
   cout << char(ciper_out);
  }
  cout<< "\n请您仔细确认本次破解是否正确?(y/n)";
  cin >> user_input;
  cout <<endl;
  j++;
 }   //依次取出文本中的高频率字母


 //将最后结果,写入文件
 infile.clear();
 infile.seekg(0);
 outfile <<"key=" << key <<"\n破解文本:" <<endl;
 while(infile.get(ch))
 {
  int ciper_out = ch - key;
  if (ciper_out<97) ciper_out = ciper_out +26;
  outfile << char(ciper_out);
 }
 cout << "\n结果:成功破解全部文本,并写入文件text.txt。\n\n按回车键结束。";
 infile.close();
 outfile.close();
 cin.get();
}

/*
清翔兔 2006年9月11日
More: http://mycode.i1984.com

Caesar 解密_字典智能

说明:所有密文均为小写字母,若不是,可先用加密程序(当key=26)对密文标准格式化。

*/

#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <vector>
using namespace std;


int wordStCount (const string &str , const string &word)
{
 int count=0;
 size_t find = str.find(word);
 while ( find != -1 )
  {
   count++;
   find = str.find(word ,find + word.size()); //从上次找到的位置之后开始寻找下一个关键字
  }
 return count;
}

int main(int argc ,char *argv[])
{
 vector<string> dict;
 ifstream infile("ciper.txt");  //原文件
 ifstream dict_file("dict.txt");//字典文件
 ofstream outfile("text.txt");  //输出文件
 
 int key;
 char ch;

 string word;
 while(getline(dict_file,word,'\n'))    //读入字典
  dict.push_back(word);

 cout << "正在破解,请稍候...\n";

 int count_max =0;
 for (int tkey=1; tkey <=26; tkey++)  //根据字典,求出最大可能性的key, tkey为临时的key
 {
  int count=0;
  string temp ="begin:";
  infile.clear();
  infile.seekg(0);
  while (infile.get(ch))
  {
   int ciper_out = ch - tkey;
   if (ciper_out<97) ciper_out = ciper_out +26;
   temp += char(ciper_out);
  }   //key=tkey

  for(unsigned int i=0; i<dict.size();i++)
   count += wordStCount(temp,dict[i]);
  if (count > count_max)
  {
   count_max = count;
   key = tkey;
  }
 }

 infile.clear();
 infile.seekg(0);
 outfile <<"key=" << key <<"\n恢复后的明文:" <<endl;
 while(infile.get(ch))
 {
  int ciper_out = ch - key;
  if (ciper_out<97) ciper_out = ciper_out +26;
  outfile << char(ciper_out);
 }
 cout << "\n结果:成功破解全部密文,写入文件text.txt。\n\n按回车键结束。";
 infile.close();
 outfile.close();
 cin.get();
 return 0;
}

需要dict.txt字典文件,请邮件联系我。

发表于 @ 2006年09月19日 19:43:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:[集中回复]来信询问C++电梯程序的问题 | 新一篇:[数据结构]KMP算法实现

  • 发表评论
  • 评论内容:
  •  
Copyright © freshare
Powered by CSDN Blog