原创程序,若要转载,请标明转载出处....谢谢!
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
//位图文件头信息结构定义
//其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)
typedef struct tagBITMAPFILEHEADER {
DWORD bfSize; //文件大小
WORD bfType;//指定文件类型必须为0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节是“BM”
WORD bfReserved1; //保留字,不考虑
WORD bfReserved2; //保留字,同上
DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和
} BITMAPFILEHEADER;
//信息头BITMAPINFOHEADER,也是一个结构,其定义如下:
typedef struct tagBITMAPINFOHEADER{
//public:
DWORD biSize; //指定此结构体的长度,为40
LONG biWidth; //位图宽
LONG biHeight; //位图高
WORD biPlanes; //平面数,为1
WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32
DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩
DWORD biSizeImage; //实际位图数据占用的字节数
LONG biXPelsPerMeter; //X方向分辨率
LONG biYPelsPerMeter; //Y方向分辨率
DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数)
DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的
} BITMAPINFOHEADER;
//调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。
//(似乎是调色板结构体个数等于使用的颜色数。)
void showBmpHead(BITMAPFILEHEADER* pBmpHead)
{
printf("位图文件头:/n");
printf("文件类型%d/n",pBmpHead->bfType );
printf("文件大小:%d/n",pBmpHead->bfSize);
printf("保留字:%d/n",pBmpHead->bfReserved1);
printf("保留字:%d/n",pBmpHead->bfReserved2);
printf("实际位图数据的偏移字节数:%d/n",pBmpHead->bfOffBits);
}
void showBmpInforHead(tagBITMAPINFOHEADER* pBmpInforHead)
{
printf("位图信息头:/n");
printf("结构体的长度:%d/n",pBmpInforHead->biSize);
printf("位图宽:%d/n",pBmpInforHead->biWidth);
printf("位图高:%d/n",pBmpInforHead->biHeight);
printf("biPlanes平面数:%d/n",pBmpInforHead->biPlanes);
printf("biBitCount采用颜色位数:%d/n",pBmpInforHead->biBitCount);
printf("压缩方式:%d/n",pBmpInforHead->biCompression);
printf("biSizeImage实际位图数据占用的字节数:%d/n",pBmpInforHead->biSizeImage);
printf("X方向分辨率:%d/n",pBmpInforHead->biXPelsPerMeter);
printf("Y方向分辨率:%d/n",pBmpInforHead->biYPelsPerMeter);
printf("使用的颜色数:%d/n",pBmpInforHead->biClrUsed);
printf("重要颜色数:%d/n",pBmpInforHead->biClrImportant);
}
void Encrypt(char *in_fname,char *password,char *out_fname);
int main()
{
printf("welcome to 赵世hun blog/n");
char in_fname[30];
char out_fname[30]="encrypted.bmp";
char password[10];
printf("welcome to use zsh program"/n);//赵
printf("/nplease input file name/n");
gets(in_fname);
printf("/nplease input password 8 bit/n");
gets(password);
Encrypt(in_fname,password,out_fname);
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);53137字节
return length;
// fclose(stream);
}
void Encrypt(char *in_fname,char *password,char *out_fname)
{
FILE *fp1,*fp2;
BITMAPFILEHEADER bitHead;
BITMAPINFOHEADER bitInfoHead;
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;
// }
//fseek(pfile,2,SEEK_CUR); // "BM"
fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),fp1);
fwrite(&bitHead,1,sizeof(tagBITMAPFILEHEADER),fp2);
showBmpHead(&bitHead);
printf("/n/n");
//读取位图信息头信息
fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),fp1);
fwrite(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),fp2);
showBmpInforHead(&bitInfoHead);
printf("/n");
long length=Getfilesize(fp1);
printf("%ld/n",length);
int len=0;
while(password[++len]);//获取密码长度
// char buf[8];
//fflush(fp1);
//fread(buf,1,sizeof(buf),fp1);
BYTE buf;
fread(&buf,1,sizeof(buf),fp1);
for(int i=0;i<40;i++)
{
fwrite(&buf,1,sizeof(buf),fp2);
fread(&buf,1,sizeof(buf),fp1);
}
int j=0;
// char temp;
while(!feof(fp1))
{
// for(int i=0;i<len;i++)
//{
//buf[i]=(int)buf[i]^(int)password[i];//与密码进行按位异或,后写入文件
//}
//ch^password[j>=i?j=0:j++]
// printf("%c/n",buf);
buf^=password[j>=len?j=0:j++];//以EBC方式加密
// temp=buf^=password[j>=len?j=0:j++];以CBC方式加密
// buf^=temp;
fwrite(&buf,1,sizeof(buf),fp2);
fread(&buf,1,sizeof(buf),fp1);
}
fclose(fp1);
fclose(fp2);
}
/*void Encrypt(char *in_fname,char *password,char *out_fname)
{
FILE *fp1,*fp2;
register char ch;
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);
}
long length=Getfilesize(fp1);
int i=0;
while(password[++i]);//获取密码长度
// char *buf;
// buf=(char*)malloc(sizeof(char)*10);
//fflush(fp1);
//fread(buf,8,1,fp1);
// int temp[100];
for(int i=0;i<10;i++)
{
fwrite(buf,8,1,fp2);
fread(buf,8,1,fp1);
}
while(!feof(fp1))
{
int j=0;
ch=fgetc(fp1);
int index=0;
//fputc(ch^password[j>=i?j=0:j++],fp2);//与密码进行按位异或,后写入文件
if(index<1000)
{
fputc(ch,fp2);
ch=fgetc(fp1);
}
else if((index>=1000)&&index<=5000)
{
//fputc(ch^password[0],fp2);
//fputc(ch^password[j>=i?j=0:j++],fp2);//与密码进行按位异或,后写入文件
fputc(ch^'a',fp2);
ch=fgetc(fp1);
}
else
{
fputc(ch,fp2);
ch=fgetc(fp1);
}
index++;
for(int i=0;i<8;i++)
{
//buf[i]=(int)buf[i]^(int)password[i];//与密码进行按位异或,后写入文件
//buf[i]^=password[i];
buf[i]-=password[i];
}
fwrite(buf,8,1,fp2);
fread(buf,8,1,fp1);
}
fclose(fp1);
fclose(fp2);
}*/