图片加密解密程序

原创程序,若要转载,请标明转载出处....谢谢! 

#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);
}*/


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值