单表代换密码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验报告姓名:1111学号:111111班级:1111111日期:1111古典密码(单表代换密码)一、实验环境1.硬件配置:处理器:Corei5M450@2.40GHZ,内存2GB,主硬盘320G2.使用软件:(1)操作系统:win7(2)软件工具:MicrosoftVisualC++6.0二、实验设计的相关概念或基本原理1.单表代换密码的基本原理:对字母表中的每一个字母用别的字母代换形成密文。明文和密文代换的规则可以是先任选一个易记的单词或短语或一句话作为密钥放在前面,然后从A到X的顺序中剔除前面出现过的字母后依次补在后面,形成代换表。三、实验内容根据实验原理的介绍,你先选取一个密钥,创建一个明文信息,编写实现程序,实现加密和解密的操作。实验流程图:单表代换密码算法输入选项编号d加密退出d=3解密d=1结束请输入要加密的字符串产生代换表输入密钥句子d=2请输入要解密的字符串四、实验总结分析关键代码:1.产生代换表:voidgenerate_alphabeta()//产生代换表{inti,j;cout请先输入密钥句子,至少为1个字符,最多100个字符,且第一个字符必须是小写字母:endl;cinmiyue;//输入的密钥句子,至少为1个字符,最多100个字符,且第一个必须为字母coutmiyueendl;intlength=strlen(miyue);//cout密钥句子的长度为:lengthendl;intpos=0;//指示填充位置inttag=1;//alphabeta[0]=miyue[0];//填充第0个位置for(i=1;ilength;i++){if(isalpha(miyue[i])!=0)//是字母{tag=1;for(j=0;j=pos;j++){if(alphabeta[j]==miyue[i])//alphabet表中已经存在字母miyue[i]{tag=0;break;}}if(tag==1)alphabeta[++pos]=miyue[i];}}for(i=0;i26;i++)//把英文字母表中还没有出现在代换字母表中的字母存入代换字母表{tag=1;for(j=0;j=pos;j++){if(alphabeta[j]==str[i])//alphabet表中已经存在英文字母表中的第i个字母{tag=0;break;}}if(tag==1)alphabeta[++pos]=str[i];}cout原始字母表为strendl;cout代换密码表为alphabetaendl;}2.加密算法intencrepty()//加密{intpos;//alphabeta[0]是序号为0的字母a的密文,alphabeta[1]是序号为1的字母的密文...,依次类推for(inti=strlen(source);i=0;i--){if(islower(source[i]))//假如当前字符是小写字母{pos=source[i]-'a';//计算出当前字母在字母表中的序号cipher[i]=alphabeta[pos];}else//不是字母,原样复制cipher[i]=source[i];}cout密文为:cipherendl;return1;}3.解密算法intdeciphring()//解密{for(inti=strlen(cipher);i=0;i--){if(islower(cipher[i]))//假如当前字符是小写字母{for(intj=0;j26;j++){if(cipher[i]==alphabeta[j])//当前密文字符,在代换字符表的第j个位置,在其明文字符为str[j];{source[i]=str[j];break;}}}else//不是字母,原样复制source[i]=cipher[i];}coutsourceendl;return1;}结果显示:4.小结此算法的难点在于如何通过密钥句子写出代换表,根据算法的思路,主要是要解决去掉密钥句子中重复字母,再将未出现过的字母依次填充代换表中,形成最终的代换表。在编程的过程中,看似简单的过程却总是无法正常实现填充过程,后来在与同学讨论之后,发现使用布尔变量来作为是否已存在相同字母的填充标记,最终解决了如何填充的问题。

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功