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 解密结果展示






1 0