关于图片文件的描述我也并不是特别了解,想具体了解的可看这篇文章添加链接描述
首先,对图片的加密解密原理来说很简单,只需要对图片文件的前几个字节进行以一定规则打乱后,就实现的加密,后面需要复原图片时将打乱后的内容按照打乱规则进行逆向操作进行复原,就实现了图片的加密与解密了,要实现这些步骤首先的对文件IO有一个基本了解,下面给大家简短的介绍一下文件IO操作。
文件IO遵循POSIX标准,文件IO实际上使用的系统调用函数
标准IO适用于操作普通文件
文件IO适用于任意 类型文件
标准IO中通过流唯一标识一个文件
文件IO中通过文件描述符唯一标识一个文件
1、文件描述符 文件描述符是一个按顺序分配的最小的非负整数,当用户打开或者新建一个文件时,系统会向当前进程返回一个最小的可用的文件描述符。
三个特殊的文件描述符
标准输入 – 0 – stdin
标准输出 – 1 – stdout
标准错误 – 2 – stderr
2、文件相关系统调用函数 open、close – 打开关闭文件
read、write – 读写文件
lseek – 文件定位
(1)打开、新建文件 – open#include(2)关闭文件 – close#include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 参数: pathname:打开文件的文件名(包含路径) flags: O_RDONLY: 以只读方式打开文件 O_WRONLY: 以只写方式打开文件 O_RDWR:以读写方式打开文件 前三个选项必须选择一个进行填写 O_CREAT:当打开文件不存在时,用该选项创建新文件,并用第三个参数为其设置权限 O_EXCL:一般和O_CREAT联合使用,用于检测文件是否存在 O_APPEND: 以追加的方式打开文件,在文件末尾另起一行继续写入 O_TRUNC:打开文件之后,会将原文件清空 mode: 当需要创建新文件时,需要用该参数给新建文件设置初始权限,一般设为0664; 返回值: 成功返回文件描述符,失败返回-1
#include(3)读写文件int close(int fd); 参数: fd:要关闭文件的文件描述符 返回值: 成功返回0,失败返回-1
#include(4)文件定位 – lseekssize_t read(int fd, void *buf, size_t count); 参数: fd:读取文件的文件描述符 buf:用户自定义的缓冲区,用于存放读取的内容 count:请求读取的字节数 返回值: 成功返回读取的字节数,失败返回-1,返回0表示读到文件末尾; #include ssize_t write(int fd, const void *buf, size_t count); 参数: fd:读取文件的文件描述符 buf:用户自定义的缓冲区,用于存放准备写入的内容 count:请求写入的字节数 返回值: 成功返回写入的字节数,失败返回-1;
#include#include off_t lseek(int fd, off_t offset, int whence); 参数: fd:文件描述符 offset:偏移量,可正可负 whence:基准点 SEEK_SET:定位在文件开头 SEEK_CUR:定位在当前位置 SEEK_END: 定位在文件末尾 返回值: 成功返回当前定位位置相对于文件开头的偏移量,失败返回-1
当了解这些函数的用法后就可以实现对图像加密解密的操作了
具体操作如下
#include#include #include #include #include #include #include int main() { int fd = open("1.jpg",O_RDWR);//将要操作的图片存在该程序相同路径下,我这里命名为1.bmp文件 if(fd < 0) //对打开文件后的返回值进行判断 { perror("open 1.bmp "); //打开失败进行错误提示 return -1; } char buf[64]={0}; //创建一个数组来接收从图片中读取到的内容 read(fd,buf,10); //这里选择读取前10个字符,当然你也可以选择读取更多的字节数 int i=0,j=9; //下面是进行加密的操作,我选用的是将前10个字符进行倒置,从而实现加密,这里可以自行选择加密方式。 for(i=0;i<5;i++) { int tmp = buf[i]; buf[i]=buf[j]; buf[j]=tmp; j--; } lseek(fd,0,SEEK_SET); //这里值得注意的是,当读取10个字符后,文件指针的位置是指向第10个后面,如果这里不将指针置回开头,那下一步操作就会改变后面的信息,并不能改变前10个字节信息 write(fd,buf,10);//将倒叙后的内容与图片前10字节内容进行更改 close(fd);//最后关闭文件,这样就实现的对图片的加密操作。 return 0; }
加密操作后由于这里采用的加密方式只是对其前10进行倒置,故解密方式也很简单,只需要重新在运行一遍程序就能实现解密,这里加密方式有很多种,你可以重新创建一个数组将照片的前面几个字节进行存储,存储后再将其打乱,后面需要解密的话再将你保存的数据重新进行替换,这样就实现的加密解密的方式,当然这些都是一些很基础的东西,正真的加密解密涉及到的密码学知识更复杂。
来看看效果图吧
这是还没加密(运行程序)前的图片
加密后图片不能查看
再次运行程序后就可以再次查看图片(这里就相当与一个解密过程)



