type
status
date
slug
summary
tags
category
icon

1. 设计需求

本次实验,需要对一份英文txt文档进行凯撒加密,编译后的可执行文件为caesar.exe,比如要对1.txt 文件进行加密,则需要在终端输入“caesar -e 1.txt 1e.txt” ,-e表示加密,1.txt表示要加密的文件,1e.txt表示指定加密后将信息写入的文件。如果要对1e.txt 文件进行解密,则需要在终端执行“caesar -d 1e.txt 1.txt”,其中-d表示解密,1e.txt表示要解密的文件,1.txt表示解密后的文件。其中需要对txt文档进行预处理,将大写字母转换为小写字母,其他字符都不变,加密时只对小写字母进行加密。

2.程序设计与实现

对于该实验的程序,整个架构并不复杂。但需要在终端进行命令行的输入,之后才开始程序的运行。然后进入对应的加密函数encryption()和解密函数decryption()进行加解密的操作即可。该程序主要有四个部分:

1. 头文件

头文件一共有三个,分别是<stdio.h>、<stdlib.h>、<string.h>。 stdio.h为标准输入输出头文件;stdlib.h表示标准库头文件,string.h表示字符串处理函数的头文件,加入这个头文件的目的是在之后的程序中使用strcmp()函数。

2. 加密函数encryption()

在该函数中首先需要定义一个FILE类型的指针 fp1,指向要打开的文件。使用fopen(input_file, “r”)函数对input_file这个变量所指向的文件进行读(read)操作,用fp1指向它。如果此时fp1为空,则说明不存在input_file文件。
接下来使用fgetc()函数和while()循环来读取input_file文件的字符数n。得到了input_file文件的字符数后,使用malloc操作进行动态数组的分配,得到数组str。之后再使用memset()函数将str数组进行初始化操作,注意这里分配的空间为n+1,这是为了在之后的fputs()函数中成功进行写入操作。
之后再让fp1重新指向input_file文件,原因是之前的fgetc()函数将指针指向了文件的最后一个字符。使用while函数,将input_file里的字符存储到str数组中。最后关闭文件fclose()。
之后就是凯撒加密的核心,使用一个for循环遍历整个str数组,如果str[i]的值大于等于’a’并且小于等于’z’,直接将str[i]往后移动三位;如果str[i]的值大于等于‘A’并且小于等于‘Z’,则需要将str[i]的值加上32,再进行位移操作。
最后定义一个FILE类型的指针f,使用fopen(output_file, “r”)函数对output_file这个变量所指向的文件进行写入(write)操作,用f指向它。之后用fputs()函数将一整行的字符(即字符串)都写入到指针f所指向的文件中。使用fclose(f)关闭文件。释放掉指针str中的内容,并将指针str指向NULL。

3. 解密函数decryption()

解密函数和加密函数的过程非常相似,区别只有在解密算法中,需要将str[i]中的值向左移动3位,其他部分均一致。

4. 主函数main()

程序的主函数,包含了整个程序的运行框架和加密、解密函数。如果参数的个数不等于4个的话,就会提醒用户参数输入不正确;如果参数个数等于4的话,使用strcmp()函数判断是进行加密操作还是解密操作,如果都不是,则输出“输入参数不满足实验条件”。
程序的流程图如图1所示:
notion image

5. 验证

5.1 加密文档为单行字符串

通过ciphers.txt和decode.txt中的内容来判断程序是否合理正确。过程如图2、3所示:
message.txt 内容结果图
message.txt 内容结果图
ciphers.txt 内容结果图
ciphers.txt 内容结果图
加密完成之后,观察ciphers.txt里面的内容,经过验证之后,能和message.txt里的内容一一对应,验证成功。之后再来验证解密过程,如图4所示:
decode.txt 内容结果图
decode.txt 内容结果图
和message.txt对比发现,除了大小写有所不同之外(预处理之后的结果),其余均一致。符合题中的要求,验证成功。

5.2 加密文档为多行英文

通过ciphers.txt和decode.txt中的内容来判断程序是否合理正确。过程如图5所示:
notion image
加密完成之后,观察ciphers.txt里面的内容,经过验证之后,能和message.txt里的内容一一对应,验证成功。之后再来验证解密过程,如图6、图7所示:
notion image
notion image
和message.txt对比发现,除了大小写有所不同之外(预处理之后的结果),其余均一致。符合题中的要求,验证成功。

6.参考文献

[1] C语言数组:https://blog.net/csdn_wangchong/article/details/104364693
[2] C++字符串读取问题:https://blog.csdn.net/ecnu_lmxgofgt/article/details/104605241
[3] C语言文件读写:https://blog.csdn.net/weixin_43545253/article/details/122408990
[4] C语言带命令行参数的程序设计:http://uisu.gitee.io/c_samplecode/

7. 部分代码

完整代码可见:https://github.com/ZeyiLi0922/Cryptography_lab