|
开源,JB2新加密方式!!
JB2.h
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <JB2_decrypt_encrypt.h>
int JB2(char jm[],char mm[])
{
if(jm != 'encrypt' || jm != 'decrypt')
{JB2-encrypt(jm[],mm[]);}
if(jm == 'encrypt')
{JB2-encrypt(jm[],mm[]);}
if(jm == 'decrypt')
{JB2-decrypt(jm[],mm[]);}
if(jm == 'obtain')
{JB2-obtain(jm[],mm[]);}
}
int JB2_encrypt(char jm,char mm[])
{JB2-encrypt(jm[],mm[]);}
int JB2_decrypt(char jm[],char mm[])
{JB2-decrypt(jm[],mm[]);}
int JB2_obtain(char jm[],char mm[])
{JB2-decrypt(jm[],mm[]);}
[/mw_shl_code]
JB2_decrypt_encrypt.h
[mw_shl_code=c,true]#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
char key[512];
char path[100];
char buf[512];
char text[]="这是检验值,用来判断密码是否正确";//放在文件头用于密码校验,防止错误的密码破坏源文件
const int TextLength=strlen(text);
const char tmp[100]="D://tmp";//临时文件路径
int JB2-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=text^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^=key;
fwrite(buf,sizeof(char),n,fp2);
}
fclose(fp);
fclose(fp2);
remove(path);
rename(tmp,path);
return 0;
}
int JB2-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^=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^=key;
fwrite(buf,sizeof(char),n,fp2);
}
fclose(fp);
fclose(fp2);
remove(path);
rename(tmp,path);
return 0;
}
int 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("");
return 0;
}
[/mw_shl_code]
text.c
[mw_shl_code=c,true]#include <JB2.h>
int main()
{
char key[512];
char path[100];
while(1)
{
int cmd,Error;
system("cls");
puts("请选择命令\n[1] 加密文件\n[2] 解密文件\n[0] 退出程序");
cmd=getch();
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=JB2-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=JB2-decrypt(path,key);
if(Error==0)
puts("解密成功!");
else if(Error==1)
puts("密码不正确!\n");
else
puts("文件不存在或路径中存在空格!");
break;
default:
puts("不合法命令!\n");
break;
}
system("pause");
}
return 0;
}
[/mw_shl_code]
|
|