图片加密解密c语言实现
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
void ECBencrypto(char *in_fname,char *password,char *out_fname);
void CBCencrypto(char *in_fname,char *password,char *out_fname);
int main()
{
char in_fname[30];
char out_fname[30];
char password[10];
printf("-------------welcome to use zsh program -------------/n");
printf("/nplease input infile name/n");
gets(in_fname);
printf("/t/t请选择要加密的方式:1.EBC 2.CBC 0.退出/t/n");
char ch;
ch=getchar();
while(!(ch>='0'&&ch<='2'))ch=getchar();
while(1)
{
switch(ch)
{
case '1':
printf("/nplease input outfile name/n");
fflush(stdin);
gets(out_fname);
printf("/nplease input password /n");
fflush(stdin);
gets(password);
ECBencrypto(in_fname,password,out_fname);
break;
case '2':
printf("/nplease input outfile name/n");
fflush(stdin);
gets(out_fname);
printf("/nplease input password /n");
fflush(stdin);
gets(password);
CBCencrypto(in_fname,password,out_fname);
break;
case '0':
return 0;
}
printf("/t/t请选择要加密的方式:1.EBC 2.CBC 0.退出/t/n");
ch=getchar();
// fflush(stdin);
while(!(ch>='0'&&ch<='2'))ch=getchar();
}
printf("end/n");
return 0;
}
long Getfilesize(FILE *stream)
{
long curpos1,curpos2,length;
curpos1=ftell(stream);//测定文件当前指向
fseek(stream,0L,SEEK_END);
curpos2=ftell(stream);//测定文件当前指向
length=curpos2-curpos1;
fseek(stream,curpos1,SEEK_SET);//恢复文件开始位置
//printf("%ld/n",length);
return length;
// fclose(stream);
}
void ECBencrypto(char *in_fname,char *password,char *out_fname)
{
FILE *fp1,*fp2;
if(NULL==(fp1=fopen(in_fname,"rb")))//以只读的方式打开二进制文件
{
printf("can not open the file/n");
exit(1);
}
if(NULL==(fp2=fopen(out_fname,"wb")))//以只写的方式打开一个二进制文件,如果文件不存在,则创建该文件
{
printf("can not create file /n");
exit(1);
}
//printf("file bkwood.bmp open success./n");
WORD fileType;
fread(&fileType,1,sizeof(WORD),fp1);
fwrite(&fileType,1,sizeof(WORD),fp2);
if(fileType != 0x4d42)
{
printf("file is not .bmp file!");
return;
}
long length=Getfilesize(fp1);
printf("此文件的大小为:%ld/n/n",length);
int len=0;
while(password[++len]);//获取密码长度
BYTE buf;
fread(&buf,1,sizeof(buf),fp1);
for(int i=0;i<50;i++)
{
fwrite(&buf,1,sizeof(buf),fp2);
fread(&buf,1,sizeof(buf),fp1);
}
int j=0;
while(!feof(fp1))
{
buf^=password[j>=len?j=0:j++];//以EBC方式加密
fwrite(&buf,1,sizeof(buf),fp2);
fread(&buf,1,sizeof(buf),fp1);
}
printf("do Ebc/n");
fclose(fp1);
fclose(fp2);
}
void CBCencrypto(char *in_fname,char *password,char *out_fname)
{
FILE *fp1,*fp2;
if(NULL==(fp1=fopen(in_fname,"rb")))//以只读的方式打开二进制文件
{
printf("can not open the file/n");
exit(1);
}
if(NULL==(fp2=fopen(out_fname,"wb")))//以只写的方式打开一个二进制文件,如果文件不存在,则创建该文件
{
printf("can not create file /n");
exit(1);
}
//printf("file bkwood.bmp open success./n");
WORD fileType;
fread(&fileType,1,sizeof(WORD),fp1);
fwrite(&fileType,1,sizeof(WORD),fp2);
if(fileType != 0x4d42)
{
printf("file is not .bmp file!");
return;
}
long length=Getfilesize(fp1);
printf("此文件的大小为:%ld/n/n",length);
int len=0;
while(password[++len]);//获取密码长度
BYTE buf;
fread(&buf,1,sizeof(buf),fp1);
for(int i=0;i<50;i++)
{
fwrite(&buf,1,sizeof(buf),fp2);
fread(&buf,1,sizeof(buf),fp1);
}
int j=0;
char temp;
while(!feof(fp1))
{
buf^=password[j>=len?j=0:j++];
temp=buf^=password[j>=len?j=0:j++];//以CBC方式加密
buf^=temp;
fwrite(&buf,1,sizeof(buf),fp2);
fread(&buf,1,sizeof(buf),fp1);
}
printf("do Cbc/n");
fclose(fp1);
fclose(fp2);
}