C语言写的(XOR)加密解密的程序

#include<stdio.h>
#include<ctype.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
char buf[512];
char text[]="这是检验值,用来判断密码是否正确";//放在文件头用于密码校验,防止错误的密码破坏源文件
const int TextLength=strlen(text);
const char tmp[100]="D://tmp";//临时文件路径
int Encrypt(char path[],char key[])//加密函数
{
	FILE *fp=fopen(path,"rb");
	if(fp==NULL)
		return -1;
	FILE *fp2=fopen(tmp,"wb");
	int n,i,KeyLength=strlen(key);
	for(i=0;i<TextLength;i++)
		buf[i]=text[i]^key[i%KeyLength];
	fwrite(buf,sizeof(char),TextLength,fp2);//TextLength不能写成sizeof(text)
	while((n=fread(buf,sizeof(char),KeyLength,fp))>0)
	{
		for(i=0;i<n;i++)
			buf[i]^=key[i];
		fwrite(buf,sizeof(char),n,fp2);
	}
	fclose(fp);
	fclose(fp2);
	remove(path);
	rename(tmp,path);
	return 0;
}
int Decrypt(char path[],char key[])//解密函数
{
	FILE *fp=fopen(path,"rb");
	if(fp==NULL)
		return -1;
	int i,KeyLength=strlen(key);
	int n=fread(buf,sizeof(char),TextLength,fp);
	for(i=0;i<n;i++)
		buf[i]^=key[i%KeyLength];
	buf[n]='\0';
	if(strcmp(buf,text)!=0)
		{
			fclose(fp);
			return 1;
		}	
	FILE *fp2=fopen(tmp,"wb");
	while((n=fread(buf,sizeof(char),KeyLength,fp))>0)
	{
		for(i=0;i<n;i++)
			buf[i]^=key[i];
		fwrite(buf,sizeof(char),n,fp2);
	}
	fclose(fp);
	fclose(fp2);
	remove(path);
	rename(tmp,path);
	return 0;
}
void GetPwd(char pwd[])
{
	int p;
	char ch;
	p=0;
	while((ch=getch())!='\r')//判断是否是回车
	{
		if(ch==8)//实现backspace键的功能,其中backspace键的ascii码是8
			{
				putchar('\b');
				putchar(' ');
				putchar('\b');
				if(p>0)//最多只能删到没有字符
				p--;
				continue;
			}
		if(!isdigit(ch)&&!isalpha(ch))//判断是否是数字或字符
			continue;
		putchar('*');//在屏幕上打印星号
		pwd[p++]=ch;//保存密码
	}		
	pwd[p]=0;//结束字符串
	puts("");
}
int main()
{
	char key[512];
	char path[100];
	while(1)
	{
		int cmd,Error;
		system("cls");
		puts("请选择命令\n[1] 加密文件\n[2] 解密文件\n[0] 退出程序");
		scanf("%d",&cmd);
		if(!cmd)
			break;
		puts("请输入要加密文件的路径:(提示:可以直接用鼠标将文件拖动到程序中)");
		scanf("%s",path);
		memset(key,0,sizeof(key));
		switch(cmd)
		{
		case 1:	
		getchar();//吸收换行
		do
		{	
			char str[512];
			puts("请设置密码(请不要使用\\、\/等特殊字符):");
			GetPwd(key);
			puts("请重复密码:");
			GetPwd(str);
			if(strcmp(key,str)!=0||strlen(key)==0)
			puts("两次密码不一致或密码为空!");
			else
				break;
		}while(1);
		puts("加密中……");
		Error=Encrypt(path,key);
		if(Error==1)
			puts("文件不存在或路径中存在空格!");
		else
		puts("加密成功!");
		break;
		case 2:
		puts("请输入密码(请不要使用\\、\/等特殊字符):");
		getchar();
		do{
		GetPwd(key);
		if(strlen(key)==0)
			puts("密码不能为空!");
		else
			break;
		}while(1);
		puts("解密中……");
		Error=Decrypt(path,key);
		if(Error==0)
			puts("解密成功!");
		else if(Error==1)
			puts("密码不正确!\n");
		else 
			puts("文件不存在或路径中存在空格!");
		break;
		default:
			puts("不合法命令!\n");
			break;
		}
		system("pause");
	}
	return 0;
}


程序接受的文件路径时用的是scanf,所以文件路径不能包含空格,否则会提示文件不存在。

因为本人水平有限,程序肯定还存在很多BUG和不对的地方,欢迎大家指出交流。

程序会改写文件,所以不要使用本程序加密重要文件。


  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值