C++调用有道词典API实现Caesar密码的加密解密
来源:互联网 发布:fluent软件官方下载 编辑:程序博客网 时间:2024/05/29 08:24
第一章 题目及需求分析
§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(flag==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++调用有道词典API实现Caesar密码的加密解密
- HttpGet方式调用有道词典API实现单词查询功能
- 有道词典的简单实现
- 有道词典的简单实现
- 实现Caesar密码(加法密码)加解密
- 实现Caesar密码(加法密码)加解密
- 有道词典的API使用 C#
- 简单有道词典客户端C实现
- python实现的Caesar加解密算法
- 调用有道词典的在线书店
- 调用有道词典查询
- (密码学)[C++]Caesar加密
- Python实现的命令行查询有道词典
- WebView实现有道词典
- Android实现有道词典
- WebView调用有道词典实现在线查词
- 古老的Caesar加密
- 用C语言实现移位密码加密与解密
- Two sum算法
- android.support.design.widget.TabLayout属性讲解
- 在服务器上搭建hexo博客
- Serialize and Deserialize BST
- TSQL生成数据导出SQL
- C++调用有道词典API实现Caesar密码的加密解密
- Java 集合系列01之 总体框架
- android studio中Git的运用总结 基于码云代码托管平台
- linux tar解压、压缩命令详解
- Hibernate映射——多对多关联映射(八)
- 微信公众平台简易设计使用
- 解决IllegalStateException: Can not perform this action after onSaveInstanceState
- C#编码规范
- kernel:在中断里添加打印后发现Android无法启动