纯C语言编写的xor加密解密程序,来源:http://blog.csdn.net/szhhck/article/details/7724939
#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)//实现delete键的功能,其中delete键的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; }