⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 加密程序C语言编写解密程序 输入密码 对密码进行验证
💻 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 + -