📄 1.cpp
字号:
#include"stdio.h"
#include<stdlib.h> /*包含syetem("cls");命令*/
#include"string.h"
#include<conio.h> /*包含getch();命令*/
#define N 256
void menu()
{ system("cls"); /*换页*/
printf("******************************************************************************\n");
printf("\t\t<<欢迎使用本加密程序>>\n");
printf("\t\t1, 文件加密\n");
printf("\t\t2, 文件解密\n");
printf("\t\t3, 使用说明\n");
printf("\t\t4, 退出\n");
printf("*******************************************************************************\n");
return;
}
void function1(FILE * p1,FILE * p2,char * a)
{ int i,j;
char c[1];
j=strlen(a);
for(i=0;!feof(p1);i++)
{
if(i<j)
{fread(c,1,1,p1);
c[0]=c[0]^a[i];
fwrite(c,1,1,p2);
}
else
i=-1;
}
fclose(p1);
fclose(p2);
}
void function2(FILE * p1,FILE * p2,char * a)
{ int i,j;
long b;
char c[1];
fseek(p1,0,2);
b=ftell(p1);
j=strlen(a);
fseek(p1,0,0);
for(i=0;b-j-1;i++,b--)
{
if(i<j)
{fread(c,1,1,p1);
c[0]=c[0]^a[i];
fwrite(c,1,1,p2);
}
else
{i=-1;
b++;
}
}
fclose(p1);
fclose(p2);
}
void keepkey(char * b,char * s)
{ char t[]="123456789:;<=>?@ABCD", a;
int i,j,k;
FILE * f;
if((f=fopen(b,"r+"))==NULL)
{printf("加密失败,按任意键返回。");
getch();
return;
}
else
{
i=strlen(s);
k=i;
i=i+48;
for(j=0;t[j]!=i;j++);
t[0]=t[j];
t[1]='\0';
a=t[0];
strcat(s,&a);
s[k+1]='\0';
for(i=0;s[i]!='\0';i++)
s[i]=~s[i];
fseek(f,-1,2);
fwrite(s,1,k+1,f);
fclose(f);
}
}
void readkey(FILE * f,char * t)
{
char s;
int i;
fseek(f,-1,2);
s=fgetc(f);
s=~s;
s=s-48;
i=-(s+1);
fseek(f,i,2);
fread(t,1,s,f);
t[s]='\0';
for(i=0;t[i]!='\0';i++)
t[i]=~t[i];
}
int judge1() /*容错处理,保证输入主函数的值符合要求*/
{
char j;
do{
j=getch();
j=j-48;
}while(j!=1&&j!=2&&j!=3&&j!=4);
return j;
}
void judge2(char * s) /*容错处理,保证输入的字符串在20个字符之内*/
{
int i=2;
printf("请输入:");
do{
scanf("%s",s);
i=strlen(s);
if(i>20)
printf("输入大于20个字符,请重新输入\n");
}while(i>20);
s[i]='\0';
}
void judge3(char * s) /*判断输入的密码*/
{ int i=2,j=0;
do{
s[j]=getch();
if(s[j]!=13&&s[j]!=8) /*getch()的退格值为8 */
printf("*");
else;
j++;
}while(s[j-1]!=13&&j<21); /*getch()的回车值为13 */
s[j-1]='\0';
}
int judge4(char * s)
{ char t;
FILE * p;
if((p=fopen(s,"rb"))==NULL)
return 0;
else
printf("%s",s);
printf("\t已存在.\n是否将原文件覆盖,回车:是;退格:否。 \n");
do
{ t=getch();
}while(t!=8&&t!=13);
if(t==8)
return 1;
else
return 0;
}
void encrypt()
{ char a[N],b[N],c[N],d;
FILE * p1,* p2;
int i;
system("cls"); /*换页*/
printf("\t<<请输入要加密的文件名(20个字符以内)>>\n");
judge2(a);
if ((p1=fopen(a,"rb"))==NULL)
{ printf("\t文件不存在,按任意键返回\n");
getch(); /*返回等待(按任意键)*/
return;
}
else
do{
printf("\t<<请输入加密后的文件名(20个字符以内)>>\n");
judge2(b);
i=judge4(b);
}while(i);
if ((p2=fopen(b,"wb"))==NULL)
{printf("\t新建文件失败,按任意键返回\n");
getch();/*返回等待(按任意键返回)*/
return;
}
else
{ printf("\t<<请输入加密密码(20个字符以内)>>");
judge2(c);
printf("文件加密中...");
function1(p1,p2,c);
keepkey(b,c);
printf("\n文件加密完成\n");
printf("是否删除源文件,是:y,否:n :");
do {
d=getch();
}while(d!=78&&d!=89&&d!=110&&d!=121);
if(d==89||d==121)
{unlink(a);
printf("\n源文件成功删除,按任意键返回。");
getch();
}
else ;
}
}
void decrypt()
{ char a[N],b[N],c[N],d[N];
FILE * f1,* f2;
int i;
system("cls"); /*换页*/
printf("\t<<请输入要解密文件的文件名(20个字符以内)>>\n");
judge2(a);
if((f1=fopen(a,"rb"))==NULL)
{
printf("\t打开文件失败,按任意键返回\n");
getch(); /*返回等待,同时屏蔽错误的输入*/
return;
}
else
{ printf("\t<<请输入加密密码>>:");
judge3(c);
readkey(f1,d);
if(strcmp(c,d)==0)
{ do{
printf("\n\t<<请输入解密后文件的文件名(20个字符以内)>>\n");
judge2(b);
i=judge4(b);
}while(i);
if ((f2=fopen(b,"wb"))==NULL)
{
printf("\t新建文件失败,按任意键返回\n");
getch(); /*返回等待*/
}
else
{ printf("文件解密中...");
function2(f1,f2,c);
printf("\n文件解密完成,按任意键返回。");
getch();
}
}
else
{ printf("\n密码错误(按任意键返回)。");
getch();
}
}
}
void instruction()
{ system("cls"); /*换页*/
printf(" 1, 加密前,请先将要加密的文件复制到本程序所在的目录下。\n");
printf(" 2, 加密时要输入密码,并牢记密码。\n");
printf(" 3, 加密或解密后的文件名请勿与原文件名相同,否则可导致原文件丢失。\n");
printf(" 4, 加密或解密完成后可按任意键返回。\n");
printf(" 5, 本软件可加密任何格式的文件,但要求解密后文件的格式与被加密文件的相同。");
getch();/*返回等待,同时屏蔽错误输入*/
}
void main()
{
int i;
A: menu();
printf("\t请选择:");
i=judge1();
switch(i)
{
case 1:
encrypt();
goto A;
case 2:
decrypt();
goto A;
case 3:
instruction();
goto A;
case 4:
goto END;
}
END: ;
system("cls");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -