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所示:

5. 验证
5.1 加密文档为单行字符串
通过
ciphers.txt
和decode.txt
中的内容来判断程序是否合理正确。过程如图2、3所示:

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

和
message.txt
对比发现,除了大小写有所不同之外(预处理之后的结果),其余均一致。符合题中的要求,验证成功。6.参考文献
[4] C语言带命令行参数的程序设计:http://uisu.gitee.io/c_samplecode/