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 解密结果展示
相关文章推荐
- 简单的加密与解密的实现---仿射密码(c++使用string)
- 仿射密码的加密和解密,蛮力攻击C++实现
- JNI调用c++实现AES加密解密
- Maximo加密解密用户密码的实现
- 编写ATL工程实现ActiveX控件调用cryptoAPI接口(二)------------信封加密与解密
- 趣味题:恺撒Caesar密码(c++实现)
- base64加密解密c++的简单实现
- 凯撒(caser)密码实现加密与解密
- C++实现文件简单加密与解密(读取文件中的字符,对字符转换,然后写入,完成加密,解密反之)
- 对RSA密码的Wiener的低解密指数攻击的C++实现
- java代码实现对excel加密、解密(设置或去除打开密码)
- 实现Caesar密码(加法密码)加解密
- 实现playfair(多字母替代密码)加密与解密程序
- 实现Caesar密码(加法密码)加解密
- c++实现简单的加密与解密
- Vigenere加密解密C++实现
- 凯撒(Caesar)密码加密解密c语言
- 安卓Shareprefrence实现记住密码自动登录以及保存在shareprefrence里面数据如何加密解密
- 古典密码之hill密码的加密与解密程序实现
- 简单的加密与解密的实现---仿射密码