buffer[i]=buffer[i]-key;
}
该函数将缓冲区buffer中储存的密文进行解密,并将明文存放于缓冲区之中。
参数file_size为文件的长度,key为用户输入的密码。
并将“保存密文”模块与“保存明文”模块合并成-----------“保存目标文件”模块,因为他们的操作系统是一样的,都是讲缓冲区中的buffer中的数据(明文数据或者密文数据)保存在指定的文件目录上。
保存在目标文件的函数定义如下:
voidsaveDstFile(char*buffer,longfile_size)
{
FILE*myfile_dst;/*源文件指针*/
charfilename[20];/*文件名数组*/
printf("Pleaseinputthepathandfilenameofthefileyouhaveprocessed\n");
scanf("%s",filename);
if(!
(myfile_dst=fopen(filename,"wb")))
{
printf("ERROR!
");
}
fwrite(buffer,1,file_size,myfile_dst);
printf("OK");
fclose(myfile_dst);
}
调用函数saveDstFile()时,主调函数(调用函数saveDstFile的函数)中定义的指针buffer指向缓冲区中已存在处理好的数据(明文数据或密文数据)。
通过函数saveDstFile只是将缓冲区buffer中的内容写到用户自定义的文件夹中去。
参数file_size为文件的长度,即缓冲区buffer的长度。
将上述函数通过一个函数Process()整合在一起,函数Process()由主函数main()调用。
函数Process()的定义如下:
viodProcess(inta)
{
FILE*myfile_dst;
char*buffer;
intkey;
longfile_size;/*记录文件的长度*/
file_size=openSrcFile(&buffer);/*读入源文件*/
printf("Pleaseinputthekey(ainteger)forencryptionordecryption\n");
scanf("%d",&key);/*用户输入密钥*/
if(a==0)
{
/*加密状态*/
encryption(buffer,file_size,key);
}
else
{
/*解密状态*/
decryption(buffer,file_size,key);
}
saveDstFile(buffer,file_size);
}
函数Process()的参数由用户指定,当参数a等于0时为加密模式。
当a等于1时为解密模式。
对文件(明文文件或者密文文件)的操作由函数openAreFile()来完成,对文件进行不同的处理,主函数main()的定义如下:
main()
{
charflag;
menu();
flag=getchar();
getchar();
while(flag!
='Q')
{
switch(flag)
{
case'E':
Process(0);break;
case'D':
Process
(1);break;
default:
printf("InputError!
\n");break;
}
flag=getchar();
getchar();
}
}
整个程序调用关系结构如图4所示。
有一下几点值得指出:
1.这个“简易加密解密系统”的设计程序遵循了“自顶向下的分析”和“自低向上的设计”的原则。
2.题目中给定的加密函数M=P+key和解密函数M=P-key是不安全的,也不具有实用性,这里之所以使用是为了简化题目。
在实际加密/解密系统中,都是以更长的二进制位(64位.128位等)作为加密工具。
不存在本题中的8位长度,故实际生活中密钥的长度会随之增加。
3.本题只为了了解怎么使用“对称密码体制”的基本思想,通过这个程序简要的说出软件的沟图思想。
五.附件
以下为“简易解密/加密系统”的源代码。
(完整)
#include"stdio.h"
voidencryption(charbuffer[],intfile_size,intkey);
voiddecryption(charbuffer[],intfile_size,intkey);
voidProcess(inta);
intopenSrcFile(char**buffer);
voidsaveDstFile(char*buffer);
voidmenu();
main()
{
charflag;
menu();
flag=getchar();
getchar();
while(flag!
='Q')
{
switch(flag)
{
case'E':
Process(0);break;
case'D':
Process
(1);break;
default:
printf("InputError!
\n");break;
}
flag=getchar();
getchar();
}
}
voidmenu()
{
printf("*****************************************************************\n");
printf("=========ASIMPLEENCRYPTION/DECRYPTIONSYSTEM=========\n");
printf("ENCRYPTIONpress'E'DECRYPTIONpress'D'QUITpress'Q'\n");
printf("*****************************************************************\n");
}
intopenSrcFile(char**buffer)
{
FILE*myfile_src;/*源文件指针*/
charfilename[20];/*文件名数组*/
longfile_size;/*记录文件的长度*/
printf("Pleaseinputthepathandfilenameofthefileyouwanttoprocess\n");
scanf("%s",filename);
if(!
(myfile_src=fopen(filename,"rb")))
{
printf("ERROR!
");
}
fseek(myfile_src,0,SEEK_END);
file_size=ftell(myfile_src);
fseek(myfile_src,0,SEEK_SET);
*buffer=(char*)malloc(file_size);
fread(*buffer,1,file_size,myfile_src);/*读入文件*/
fclose(myfile_src);
returnfile_size;
}
voidsaveDstFile(char*buffer,longfile_size)
{
FILE*myfile_dst;/*源文件指针*/
charfilename[20];/*文件名数组*/
printf("Pleaseinputthepathandfilenameofthefileyouhaveprocessed\n");
scanf("%s",filename);
if(!
(myfile_dst=fopen(filename,"wb")))
{
printf("ERROR!
");
}
fwrite(buffer,1,file_size,myfile_dst);
printf("OK");
fclose(myfile_dst);
}
viodProcess(inta)
{
FILE*myfile_dst;
char*buffer;
intkey;
longfile_size;/*记录文件的长度*/
file_size=openSrcFile(&buffer);/*读入源文件*/
printf("Pleaseinputthekey(ainteger)forencryptionordecryption\n");
scanf("%d",&key);/*用户输入密钥*/
if(a==0)
{
/*加密状态*/
encryption(buffer,file_size,key);
}
else
{
/*解密状态*/
decryption(buffer,file_size,key);
}
saveDstFile(buffer,file_size);
}
voidencryption(charbuffer[],intfile_size,intkey)
{
inti;
for(i=0;ibuffer[i]=buffer[i]+key;/*M=2*(P+key)*/
}
voiddecryption(charbuffer[],intfile_size,intkey)
{
inti;
for(i=0;ibuffer[i]=buffer[i]-key;
}
程序运行界面如图5所示:
图-5
如图5所示在程序中输入字母E表示进入加密模式,按照提示首先输入明文件的路径名字,然后输入密钥,最后密文保存的路径和文件名,当程序出现OK时则说明加密成功。
然后是D进入解密模式同样的办法,出现OK则表示解密成功。
反之则是解密失败。
加密前明文C:
\\test.txt的内容如图6.。
图-6
加密后密文C:
\\a.txt的内容(乱码)如图-7所示。
图-7
解密后成功的文件C:
\\a.txt内容如图-8所示。
图-8
六.心得体会
通过本软件的使用,使我深刻体会到C语言的全面性,实用性和安全性。
通过对文件系统的加减密程序,我学会了对基本文件的加减密码。
同时能自己给出一个简单key,来给文件进行基本的加减密码。
一定程度的增加了自己电脑文档的安全性。