C语言,简单的凯撒加密及解密实验

一、实验名称:
古典密码之实验

二、实验目的:
本实验要求用高级语言编写和调试一个简单的密码实现及解密程序,通过本实验可以了解密码原理。

三、实验内容及要求
(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;
}

程序流程图:15803e8848c8442c9a4137b8d97c73ba.png

 


实验结果(截图):8a3253ac77f84e34acdd52d7baac7318.png

8aa46bb7d15543778d0a18906ec0ffe1.png 

 实验存在问题和解决办法
过程中问题:
加密问题:直接偏移5个量,会溢出字母的ask码表范围。
解决方案:将“精准偏移量=(明文-A或a的ask码+偏移量)%26”可保证结果偏移不超过0到25,即“密文=(明文-A或a的ask码+偏移量)%26+对应的A或a的ask码”不会出现溢出。
解密问题:若将“密文”与“明文”位置互调后,仍采用上面算法,则(密文ask码+偏移量)会出现负值。
解决方案:改算法为“明文=(密文-Z或z的ask码+偏移量)%26+对应的Z或z的ask码”即可避免出现负值。


 

 

 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Celestial dust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值