一、实验名称:
古典密码之实验
二、实验目的:
本实验要求用高级语言编写和调试一个简单的密码实现及解密程序,通过本实验可以了解密码原理。
三、实验内容及要求
(1)编写一个字符加密的程序,字符为 MyCode。加密规则是:将该6个字母按字母表上的顺序循环向后移5位,得到的字符即为密文。请注意,循环向后移时,Z的后面是A,B,…。
(2)根据(1)的内容再编写一个解密程序。
四、实验材料、工具、或软件
计算机一台,Dev-C++ 5.11软件
五、实验内容及实验步骤(或记录)
注:按照顺序写清楚实验内容、实验算法思想\步骤、重要操作流程截图等;
实验代码:
加密程序代码:
#include <stdio.h>
int main() {
//定义变量
char a0,a1,a2,a3,a4,a5;
char e0,e1,e2,e3,e4,e5;
//
printf("请输入字母明文:\n");
scanf("%c%c%c%c%c%c",&a0,&a1,&a2,&a3,&a4,&a5);
//加密算法:由于明文由字母组成,故用if和else进行判断字母大小写以及控制流程。
//详细解释:<='z'即小于或等于Z的ask码90,若满足此,则进行大写字母的加密方案,否则进入小写字母加密方案。
/*核心算法:密文=(明文-大写字母A或小写字母a的ask码+偏移量)%26+对应的大写字母A或小写字母a的ask码
(明文-大写字母A或小写字母a的ask码+偏移量)%26-->保证结果在0到25之间,
对应的大写字母A或小写字母a的ask码-->凯撒加密算法的偏移量*/
if (a0<='Z') {
e0=(a0-'A'+5)%26+'A';
} else {
e0=(a0-'a'+5)%26+'a';
}
if (a1<='Z') {
e1=(a1-'A'+5)%26+'A';
} else {
e1=(a1-'a'+5)%26+'a';
}
if (a2<='Z') {
e2=(a2-'A'+5)%26+'A';
} else {
e2=(a2-'a'+5)%26+'a';
}
if (a3<='Z') {
e3=(a3-'A'+5)%26+'A';
} else {
e3=(a3-'a'+5)%26+'a';
}
if (a4<='Z') {
e4=(a4-'A'+5)%26+'A';
} else {
e4=(a4-'a'+5)%26+'a';
}
if (a5<='Z') {
e5=(a5-'A'+5)%26+'A';
} else {
e5=(a5-'a'+5)%26+'a';
}
printf("字母密文输出为:%c%c%c%c%c%c\n",e0,e1,e2,e3,e4,e5);
return 0;
}
解密程序代码:
#include <stdio.h>
int main() {
//定义变量,储存数据。
char a0,a1,a2,a3,a4,a5;
char e0,e1,e2,e3,e4,e5;
//输入变量
printf("请输入字母密文:\n");
scanf("%c%c%c%c%c%c",&a0,&a1,&a2,&a3,&a4,&a5);
//加密算法:由于明文由字母组成,故用if和else进行判断字母大小写以及控制流程。
//详细解释:<='z'即小于或等于Z的ask码90,若满足此,则进行大写字母的加密方案,否则进入小写字母加密方案。
/*核心算法:密文=(明文-大写字母Z或小写字母z的ask码+偏移量)%26+对应的大写字母Z或小写字母z的ask码
(明文-大写字母Z或小写字母z的ask码+偏移量)%26-->保证结果在0到25之间且避免(密文+偏移量)出现负值,
对应的大写字母Z或小写字母z的ask码-->凯撒加密算法的偏移量*/
if (a0<='Z') {
e0=(a0-'Z'-5)%26+'Z';
} else {
e0=(a0-'z'-5)%26+'z';
}
if (a1<='Z') {
e1=(a1-'Z'-5)%26+'Z';
} else {
e1=(a1-'z'-5)%26+'z';
}
if (a2<='Z') {
e2=(a2-'Z'-5)%26+'Z';
} else {
e2=(a2-'z'-5)%26+'z';
}
if (a3<='Z') {
e3=(a3-'Z'-5)%26+'Z';
} else {
e3=(a3-'z'-5)%26+'z';
}
if (a4<='Z') {
e4=(a4-'Z'-5)%26+'Z';
} else {
e4=(a4-'z'-5)%26+'z';
}
if (a5<='Z') {
e5=(a5-'Z'-5)%26+'Z';
} else {
e5=(a5-'z'-5)%26+'z';
}
//输出变量
printf("字母明文输出为:%c%c%c%c%c%c\n",e0,e1,e2,e3,e4,e5);
return 0;
}
程序流程图:
实验结果(截图):
实验存在问题和解决办法
过程中问题:
加密问题:直接偏移5个量,会溢出字母的ask码表范围。
解决方案:将“精准偏移量=(明文-A或a的ask码+偏移量)%26”可保证结果偏移不超过0到25,即“密文=(明文-A或a的ask码+偏移量)%26+对应的A或a的ask码”不会出现溢出。
解密问题:若将“密文”与“明文”位置互调后,仍采用上面算法,则(密文ask码+偏移量)会出现负值。
解决方案:改算法为“明文=(密文-Z或z的ask码+偏移量)%26+对应的Z或z的ask码”即可避免出现负值。