在linux中,图片也是文件,所以本质上也是对文件的操作。
每种不同类型的图片类型的格式头不一样,加载图片时首先加载的是图片格式头,如果格式头破坏,则图片会加载失败。
基于以上对 liunx 中图片的简单的介绍,一下是对图片加密、解密的思路分析,以及实现步骤:
加密:
要达到加密的效果,我们只需要由规律的破坏文件的格式头即可,这里是破坏文件格式头的前10个字节,其中一种破坏的思路是将前10个字节头尾交换,实现字符的倒序;
解密:
将上面加密过程中破坏的格式头恢复即可。这里加密是实现字符的倒序,那么再运行一次加密过程,把倒序后的字符串再倒序一次,恢复原来的字符顺序,便实现了解密的过程;
特别注意的是,在加密完成之后,此时是指向第10个字符的,如果直接运行,是对10个字节之后的重复操作,没办法达到解密的效果,所以在加密完成之后,需要再将文件位置定位在文件开头。
步骤:
1.打开图片 --- open;
2.读取图片的前10个字节 -- read;
3.将读取的十个字节有序的打乱--头尾交换--字符串倒序(破坏部分格式头数据即可);
4.将文件指针重新定位在文件开头--lseek;
5.将打乱的10个字节写入函数--write;
6.关闭文件--close。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
char pic_name[64] = {0};
printf("please input a pic_name!\n");
fgets(pic_name, 64, stdin);//从键盘输入要加密的图片名
pic_name[strlen(pic_name)-1] = '\0';//去掉换行符
//1.打开文件
int fd = open(pic_name, O_RDWR);//用读写权限打开文件
if(fd < 0)//打开失败
{
perror("open");
return -1;
}
//2.读取图片的前10个字节
char buf[10] = {0};
int ret = read(fd, buf, 10);
if(ret < 0)//读取失败
{
perror("read");
return -1;
}
//3.将读取的十个字节按头尾交换实现字符串倒序,破坏格式头
int i = 0;
int tmp = 0;
for(i = 0; i < 10/2; i++)
{
tmp = buf[i];
buf[i] = buf[9-i];
buf[9-i] = tmp;
}
//4.将文件指针重新定位在文件开头
ret = lseek(fd, 0, SEEK_SET);
if(ret < 0)//定位失败
{
perror("lseek");
return -1;
}
//5.将打乱的10个字节写入函数
ret = write(fd, buf, 10);
if(ret < 0)
{
perror("write");
return -1;
}
//关闭文件
close(fd);
return 0;
}