如何用C语言对文件进行简单加密

最近在完成大作业的时候需要实现一个用C语言对文件进行简单加密的操作,这里主要用的加密思路是破坏文件头,使得系统无法识别文件从而进行加密,最初的思路是将用户输入的加密口令转成ASCII码,再与文件头数据循环进行异或操作,从而破坏文件头数据,使得系统无法识别文件,而从安全性上来说,就算破译者拿到了用户的口令,他也无法知道我们拿了多少数据进行异或,从而提高了加密文件破译的安全性,若需要破译加密文件,不仅需要拿到用户的口令,在不知道具体加密数据位数时,只能对加密文件进行爆破异或,所以这种加密方式具有一定的安全性。
在具体实现的时候,以下仅给出最简单的实现方式,仅对文件头的20个字节的数据进行异或操作,且为了方便起见,这里假设用户的加密口令就是123,指定1.bmp文件进行加密和解密操作。本代码仅作加密文件思路参考,各位大佬可以根据自己的情况和需要加以补充,希望能对各位有所启发。
本文仅提供C语言简单加密文件的基本思路,我的后一篇文章对本代码的加解密算法进行了完善和补充,增强了加密文件的安全性,我本人更为推荐,这里放一个链接,需要的朋友也可以看一下C语言简单加密文件+

#include<stdio.h>
//全局变量的定义 
unsigned short int res[10]; //储存加密后的数据,一个unsigned short int占两个字节
unsigned short int temp; //临时储存非加密数据 
int length;  //储存原文件长度 
int i=0;
void encrypto()
{ 
 FILE *fp1=fopen("1.bmp","rb"); //这里可以改为用户输入路径文件,本程序为了便捷就固定了文件名 
 if(fp1!=NULL)
 { 
  for(i=0;i<10;i++){ 
   fread(&res[i],sizeof(unsigned short int),1,fp1); //从原文件种读取20个字节 
   res[i]^=123;  //将读取出的数据与用户输入的密钥做异或,粉碎文件头
  }     //这里为了方便起见假设用户加密口令为123 
  //获取BMP原文件长度 
  fseek(fp1,0,2);  //使文件光标退到文件结尾 
  length=ftell(fp1); //放回文件长度 
  fclose(fp1);
  FILE *fp2=fopen("2.bmp","wb");  //这里也可以改为用户输入的路径 
  fp1=fopen("1.bmp","rb");
  if(fp2!=NULL)
  { 
   for(i=0;i<10;i++){ 
    fwrite(&res[i],sizeof(unsigned short int),1,fp2);//将异或后的数据存储在新文件中 
   } 
   fseek(fp1,20,0);  //将原文件的文件指针向后移动20个字节 
   while(i<length/2) //循环将fp1的非加密数据写入fp2中 
   { 
    fread(&temp,sizeof(unsigned short int),1,fp1);
    fwrite(&temp,sizeof(unsigned short int),1,fp2);
    i++;
   }
   fclose(fp1);
   fclose(fp2);
   printf("加密成功!请牢记您的加密口令\n"); 
  }else{ 
   printf("保存加密文件失败!\n");
  }
 }else{ 
  printf("打开文件失败!\n");
 }      
}

void decrypto()
{ 
 FILE *fp1=NULL,*fp2=NULL; 
  fp1=fopen("2.bmp","rb"); //打开加密文件 
 fseek(fp1,0,2);    //使加密文件的光标移动到文件末尾 
 length=ftell(fp1);   //获取加密文件的长度 
 rewind(fp1);    //使加密文件的光标移动到文件开头
 for(i=0;i<10;i++){    // 
  fread(&res[i],sizeof(unsigned short int),1,fp1); //从加密文件中取出要解密部分的数据
  res[i]^=123; 
 }
 fp2=fopen("3.bmp","wb"); //fp2为解密文件指针 
 for(i=0;i<10;i++)
 { 
  fwrite(&res[i],sizeof(unsigned short int),1,fp2);  //写入解密后的数据 
 }
 fseek(fp1,20,0);
 i=0;
 while(i<length/2)
 { 
  fread(&temp,sizeof(unsigned short int),1,fp1);
  fwrite(&temp,sizeof(unsigned short int),1,fp2);
  i++;
 }
 printf("解密成功!\n");
}

int main()
{ 
 encrypto();
 decrypto(); 
 } 

接下来我们运行这个代码:
《如何用C语言对文件进行简单加密》
可以看到以及生成了两个文件,分别是2.bmp(加密文件)和3.bmp(解密文件),我们利用winhex查看文件头
《如何用C语言对文件进行简单加密》
《如何用C语言对文件进行简单加密》
《如何用C语言对文件进行简单加密》

不难发现对于2.bmp文件的文件头已经无法识别,而3.bmp文件的文件头于原文件(1.bmp)一致,通过查看图片属性也能发现这三个bmp文件的大小完全一致,所以不存在数据的损失,而当你打开2.bmp文件的时候,却会发现
《如何用C语言对文件进行简单加密》
系统已经无法识别和显示出加密文件,至此,我们利用C语言对文件进行加密和解密的操作全部完成。希望能为各位大佬抛砖引玉。

再次感谢你的观看,若还有疑问,欢迎评论留言。

    原文作者:monster663
    原文地址: https://blog.csdn.net/monster663/article/details/107142732
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞