一起养成写作习惯!这是我参与「掘金日新计划 · 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++开发程序猿~