MFC | 图片的傻瓜式加解密方法

414 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

说起了加密算法,不得不提一句,在软件设计师考试中就考到了这一点,例如:对称加密算法有哪些,非对称加密算法有哪些,密钥算法有哪些已经实现思路。

在这里,不讲那么复杂的方式,在前一段时间非要实现这样一个功能:图片加解密方法,想要快速演示,没有办法了,我就稍微偷了个懒,反正只是演示,看看效果得了,其实,我的内心也是很无语的。

实现思路:

一般在使用加密的时候采用各种算法,这次我没有用那么高深的技术,我只是在读取图片数据时,前面添加了些内容,人为破坏了图片流的格式,这样子,再打开时,就看不到图片的内容了。

中心思想:

数据流开头,数据流末尾分别添加固定的头数据、尾数据,并且对前十位数据块进行加密操作。

我猜肯定没有人会做到我这么鸡肋,如果想要看我这么鸡肋的做法,那就继续看下去吧!

在实现过程中,唯一的重点就是:读文件,写文件

所有的文件在C++程序中,都可以使用二进制流的方式读取,这里,我们也采用的二进制流方式。

读文件操作

打开文件 -> 读取文件的长度 -> 获取文件的实际内容 -> 数据组装 -> 关闭文件

FILE  *p = fopen(strSourceFile , "rb");
if(p == nullptr)
{
    return false;
}

使用C底层的访问方式,FILE::fopen打开文件,并且以二进制流的方式读取。

int nlength = _filelength(_fileno(p));  //得到图像的长度

此时,我们可以得到当前文件的整体长度,紧接着,我们要拿着文件的长度,读取整个文件内容

unsigned  char* chTempInfo = new unsigned  char[nlength];
fread(chTempInfo, sizeof(unsigned char),nlength,p);

到这里,已经可以获取到整个文件的内容了。

上述已经说到了,这里采用了傻瓜加密算法,在数据流开头以及结尾处,添加了固定头信息。

那么该如何操作呢?

这里,我们重新new一个与读出的文件相同的内存,用来存放:数据头 + 真实数据 + 数据尾。

两个数据头 和 一个数据尾。

int nLen = nlength + 3;
unsigned char* chReadInfo = new unsigned char[nLen];

//数据头添加
chReadInfo[0]=HeaderData;
chReadInfo[1]=HeaderData;

//数据尾添加
chReadInfo[nLen-1]=TailData;

那么,文件的实际数据如何拼接到chReadInfo呢?

对于char*数据的内容,一般会采用memcpy方式。

//中间数据添加
memcpy(chReadInfo+2 , chTempInfo , nlength);

最后,关闭读取文件。

fclose(p);

当前,要是为了更安全操作,还可以对组装的数据进行加密处理,比如我们经常用到的base64加密算法。

写文件操作

对于写文件来说,会简单不少,直接使用 fwrite写入就可以了

FILE *q = fopen(strGenerateFile , "wb");
fwrite(chReadInfo , sizeof(unsigned char) , nLen, q);
fclose(q);

对于解密操作,我们该如何获取呢?

在读取加密的文件后,假设你对该文件做了类似于base64加密算法时,需要先将数据流进行解密,然后,筛选出数据数据。

其实,就是去掉两个字节的头数据以及最后一个尾数据,还是采用 memcpy方法。这里也就不再过多说明啦!

我是中国好公民st,一名C++开发程序猿~