C语言写的(XOR)加密解密的程序
2012-07-07 18:56
337 查看
#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 ='\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和不对的地方,欢迎大家指出交流。
程序会改写文件,所以不要使用本程序加密重要文件。
相关文章推荐
- c语言实现对密码(字符串)进行加密,并解密
- android ndk 05 C语言 _union_enum 联合体 枚举 IO文件操作(文件加密解密)
- 加密解密程序
- ASP程序加密解密方法全面解析
- 加密解密程序
- 实现playfair(多字母替代密码)加密与解密程序
- openssl aes 加密解密示例程序
- ABAP 加密解密程序
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 文件加密解密程序
- 凯撒(Caesar)密码加密解密c语言
- phpjm解密程序,也适用于其他混淆加密的破解
- MaxtoCode对.Net程序加密的原理及解密探讨
- MD5和一个可逆加密算法相接合的加密和解密程序
- xor算法加密解密功能
- 用c语言对一个字符串进行加密和解密
- C语言写的一个简单文件加密程序
- MaxtoCode对.Net程序加密的原理及解密探讨一
- 某壳对.Net程序加密的原理及解密探讨五(元数据还原以及IL解码的改进)
- c#实现文件加密、解密及文件拖拽至程序图标直接打开(转)