您的位置:首页 > 编程语言 > C语言/C++

C++调用有道词典API实现Caesar密码的加密解密

2017-04-21 11:12 921 查看

第一章 题目及需求分析

§1.1 题目及需求分析

1.1.1题目描述

通过编程实现Caesar密码的加密与解密工作,要求加密时输入一串明文字符串和偏移量offset,输出加密后的Caesar密码,解密时,输入一串密文字符串,尝试0-25范围内所有的偏移量,如果发现是有意义的句子即证明解密成功,并将明文输出。

1.1.2Caesar密码的定义

密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密恺撒变换变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

1.1.3需求分析

加密过程中即简单的通过ASCII码的偏移来进行实现,即对应输入的偏移量offset每个字符的ASC码增加offset%26位,输出的结果即位密文。
在解密的过程中,尝试遍历所有的offset,进行解密工作,解密时将每个单词的解密结果用一个容器保存,每次尝试后,从容器中依次取出所有单词,将解密出来的结果与词典中的单词进行对应,如果全部符合,则证明该offset为Caesar密码所来加密之offset,此时则将明文输出。
而因为在现实情况下,英文单词分为多种现在进行时、过去式多种时态变换和单复数的形式,为了保证结果具有实际意义,通常情况下需要一个体量足够大的英文词典,本设计采用了有道词典的API接口,对于每个单词,在有道词典中查询是否存在,如果存在,则证明对于该offset该单词为可能的明文,如果全部单词都可以在有道词典中查询到则证明offset选择正确,对应单词组合即为密文所对应的明文。

第二章 具体的实现及部分关键代码

§2.1 具体实现

2.1.1所采用的编程语言

出于方便起见和本人偏好,本此实现的代码采用c++编写。

2.1.2所需要用到的库类

 
1、C++标准库;
2、jsoncpp库,因为每次去有道词典查询,返回过来的都是一个json格式的文本文件,需要通过jsoncpp库进行解析;
3、curl库,这是C++实现HTML5通信的一个必需库,通过curl包装html5的数据包,实现对有道词典API的调用


2.1.3程序具体流程概述

1、通过命令行实现交互界面,在一开始要求输入0或者1,来分别代表接下来要进行加密操作还是解密操作
2、如果输入的数字是0,则要求输入明文和key,并输出根据该key的加密结果,如果某字母ASCII码加key的值大于字母最大的ASCII码值,则减去最大ASCII码值,即相当于从头开始
3、如果输入是密文,则从0开始依次遍历所有可能的key,并将每次遍历结束后得到的的每个单词放入容器vector中;
4、一次遍历结束后,从容器中依次取出单词,通过有道词典API进行判断是否存在于词典中,如果容器中所有单词都存在于有道词典,则证明解密结果正确真实,退出循环,输出单词,否则继续循环遍历,直到找到对应的明文
5、如果遍历结束,所有key均以尝试,依然无法破译,则输出无法破译的提示,结束程序

§2.2 部分关键代码

2.2.1加密代码

string Encryption(string text,int key)
{

string ciphertext=text;
for(int i=0;i<ciphertext.size();i++)//用key进行caesar加密,大于‘z’或者‘Z’则从头开始

{
if(ciphertext[i]<='z'&&ciphertext[i]>='a'&&ciphertext[i]+key<='z')
ciphertext[i]+=key;
else if (ciphertext[i]<='z'&&ciphertext[i]>='a'&&ciphertext[i]+key>'z')            ciphertext[i]=(ciphertext[i]-26+key);
else if (ciphertext[i]<='Z'&&ciphertext[i]>='A'&&ciphertext[i]+key<='Z')
ciphertext[i]+=key;
else if(ciphertext[i]<='Z'&&ciphertext[i]>='A'&&ciphertext[i]+key>'Z')
ciphertext[i]=(ciphertext[i]+key-26);
}

return ciphertext;
}



2.2.2 解密代码

string Descryption(string text)
{

bool flag=false;
vector<string> encryword;
vector<string> descryword;
int pos=0;
for(int i=0;i<=text.size();i++)
{
if(text[i]==' ')
{
string tmp=text.substr(pos,i-pos);
encryword.push_back(tmp);
pos=i+1;
}
}//将所有的单词放入vector中批量处理
encryword.push_back(text.substr(pos,text.size()-pos));
for(int key=25;key>=0;--key)
{
flag=true;//用来表示是否得到正确解码的句子
descryword.clear();
for(int i=0;i<encryword.size();i++)//暴力法求key值
{
string tmp=encryword[i];
tmp=Encryption(tmp,key);//利用加密函数返回用key解密后的单词
if(!search(tmp))
{
flag=false;
break;
}
else
descryword.push_back(tmp);//如果找到了正确的单词,则放入容器

}
if(fl
4000
ag==true)//所有单词都已经变成明文
break;
}
string plaintext="";
if(flag==true)
{
for(int i=0;i<descryword.size();i++)
plaintext=plaintext+descryword[i]+" ";//将容器中的单词练成句子,即解密工作
return plaintext;
}
else
return "Can't descrypt the text!";
}


2.2.3 判断是否存在于词典

bool search(string trans)//判断单词是否存在于词典中
{
string buffer;
string url=geturl(trans);
CURL* curl;//创建一个curl的handle
CURLcode res;
curl=curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL,url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_callback);//接受json数据
curl_easy_setopt(curl, CURLOPT_WRITEDATA,&buffer);//将接收到的json存储在buffer中
res=curl_easy_perform(curl);
curl_easy_cleanup(curl);//释放
}
if(buffer.empty())
{
cout<<"Nothing return!"<<endl;
return false;
}//buffer为空
Json::Value root;
Json::Reader reader;
bool parsingSuccessful=reader.parse(buffer, root);
if(!parsingSuccessful)
{
cout<<"Fail to parse the data!"<<endl;
return false;
}

if(root["errorCode"]!=0)//=60时说明词典中没有该单词
{
//cout<<"未找到单词!"<<endl;
return false;
}

return true;
}


2.2.4 有道词典json格式

{
"errorCode":0
"query":"good",
"translation":["好"], // 有道翻译
"basic":{ // 有道词典-基本词典
"phonetic":"gʊd"
"uk-phonetic":"gʊd" //英式发音
"us-phonetic":"ɡʊd" //美式发音
"explains":[
"好处",
"好的"
"好"
]
},
"web":[ // 有道词典-网络释义
{
"key":"good",
"value":["良好","善","美好"]
},
{...}
]
}


第三章 实现结果的展示


§3.1 加密结果展示

3.1.1说明

   所有的加密结果,即所得到的密文将在解密过程中用以解密,看结果是否与原文能够符合

3.1.2常规单词的加密(不包括生僻单词和时态单复数) 




3.1.3 复杂单词的加密 



§3.2 解密结果展示






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: