单表代换密码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告

姓名:1111 学号:111111 班级:1111111 日期:111

1 古典密码(单表代换密码)

一、实验环境

1.硬件配置:处理器:Corei5 M ***********,内存2GB,主硬盘

320G

2.使用软件:

(1)操作系统:win7

(2)软件工具:Microsoft Visual C++6.0

二、实验设计的相关概念或基本原理

1.单表代换密码的基本原理:

对字母表中的每一个字母用别的字母代换形成密文。明文和密文代换的规则可以是先任选一个易记的单词或短语或一句话作为密钥放在前面,然后从A到X的顺序中剔除前面出现过的字母后依次补在后面,形成代换表。

三、实验内容

根据实验原理的介绍,你先选取一个密钥,创建一个明文信息,编写实现程序,实现加密和解密的操作。

实验流程图:

四、实验总结分析

关键代码:

1.产生代换表:

void generate_alphabeta( )//产生代换表

{

int i,j;

cout<<"请先输入密钥句子,至少为1个字符,最多100个字符,且第一个字符必须是小写字母:"<

cin>>miyue;//输入的密钥句子,至少为1个字符,最多100个字符,且第一个必须为字母

cout<

int length=strlen(miyue);

//cout<<"密钥句子的长度为:"<

int pos=0;//指示填充位置

int tag=1;//

alphabeta[0] =miyue[0];//填充第0个位置

for(i=1;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;i<26;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<<"原始字母表为"<

cout<<"代换密码表为"<

}

2.加密算法

int encrepty( )//加密

{

int pos;

//alphabeta[0]是序号为0的字母a的密文,alphabeta[1]是序号为1的字母的密文...,依次类推

for(int i=strlen(source);i>=0;i--)

{

if(islower(source[i]))//假如当前字符是小写字母

{

pos=source[i]-'a';//计算出当前字母在字母表中的序号

cipher[i]=alphabeta[pos];

}

else //不是字母,原样复制

cipher[i]=source[i];

}

cout<<"密文为:"<

return 1;

}

3.解密算法

int deciphring( )//解密

{

for(int i=strlen(cipher);i>=0;i--)

{

if(islower(cipher[i]))//假如当前字符是小写字母

{

for (int j=0;j<26;j++)

{

if(cipher[i]==alphabeta[j])

//当前密文字符,在代换字符表的第j个位置,在其明文字符为str[j];

{

source[i] =str[j];

break;

}

}

}

else //不是字母,原样复制

source[i]=cipher[i];

}

cout<

return 1;

}

结果显示:

4.小结

此算法的难点在于如何通过密钥句子写出代换表,根据算法的思路,主要是要解决去掉密钥句子中重复字母,再将未出现过的字母依次填充代换表中,形成最终的代换表。在编程的过程中,看似简单的过程却总是无法正常实现填充过程,后来在与同学讨论之后,发现使用布尔变量来作为是否已存在相同字母的填充标记,最终解决了如何填充的问题。

相关文档
最新文档