图片加密解密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); }