当前位置: 首页 > article >正文

如何在JPG文件中隐写数据

概述

最近在做资源管理器背景的一个功能时,需要将信息传递到DLL中去,

主要就是传递一些比较简单的参数,包括图片的契合度,透明度之类的。通信方式有多种,毕竟是练手的功能,就想找一些以前没用过的方式。

在我前面的文章中,介绍过数字水印技术,其中的两种方式就是在图像文件中嵌入数据

https://www.cnblogs.com/zhaotianff/p/17222056.html

所以这里我也想直接在图片文件中写入这些数据,然后在DLL中读取。

在网上查了一下资料,确实有一种比较简单的方式可以在JPG文件中写入自己的数据。

而且这种方式理论可以写入不限大小的数据。

再说一些题外话,不管什么格式的文件,它都有一套标准的格式。一般都会包括文件头、文件体之类 的,我们在熟悉文件结构以后,想在不破坏原始文件结构的情况下,在文件头写入一些我们自己的数据,理论上都是可以实现的。

但是这个过程是需要花费一些时间的。

我这里是直接使用了NVISO Labs 现有的方式,给有需要的小伙伴做一个分享。

实现原理

我们先用十六进制编辑器打开一个普通的JPG文件

可以看到前面两个字节的内容是FF D8

FF D8 => 这是表示 JPEG 数据流开始的标记

当我们找到JPEG数据流开始的标记后,可以在它后面插入一个“注释”标记。

FF FE =>这是一个“注释”标记,JPEG 解码器也会忽略它。这些标记正是我们将要插入数据的方式,并且仍然具有有效的图像
 

FF FE之后紧跟2字节,代表“注释”内容的大小。

示例

假设我们在一个jpg文件中写入HelloWorld,“HelloWorld”是十个字节,所以我们在FF FE 之后写入

00 0A(10个字节) 48 65 6C 6C 6F 57 6F 72 6C 64  

这里总共是14个字节,包含FF FE 2个字节的头 00 0A 2个字节的大小,和10个字节的内容。

所以我们用十六进制编辑器在FF D8之后插入14个字节

然后我们用把数据填充进去,如下所示

将文件保存后,JPG文件还是能正常打开

代码实现

这里以C#为例,其它语言实现方式都差不多,我这里是写入了一个opacity和strech的数据进去

 1    private void WriteImageInfoToFile(string filePath,double opacity,int stretch)
 2    {
 3        //读取文件数据
 4        var buffer = System.IO.File.ReadAllBytes(filePath);
 5 
 6        //判断是否是JPG文件
 7        if (buffer[0] == 0xFF && buffer[1] == 0xD8)
 8        {
 9            //将原始数据扩容6个字节
10            var newBuffer = new byte[buffer.Length + 6];
11 
12            //拷贝JPG文件开始标记 FF D8
13            Array.Copy(buffer, 0, newBuffer, 0, 2);
14  
15            //设置数据
16            //注释标记
17            newBuffer[2] = 0xFF;
18            newBuffer[3] = 0xFE;
19            //大小 0x02
20            newBuffer[4] = 0;
21            newBuffer[5] = 0x02;
22            //数据
23            newBuffer[6] = (byte)nOpacity;
24            newBuffer[7] = (byte)stretch;
25            
26            //将原图片剩下的数据拷贝到新buffer中
27            Array.Copy(buffer, 2, newBuffer, 7, buffer.Length - 2);
28            
29            //写入文件
30            System.IO.File.WriteAllBytes(filePath, newBuffer);
31        }  
32    }

读取时,按同样的规则读取就行了。

参考资料

Under the hood: Hiding data in JPEG images – NVISO Labs


http://www.kler.cn/news/284824.html

相关文章:

  • 类实例化和构造函数
  • 【Go语言成长之路】使用 Go 和 Gin 开发 RESTful API
  • 五,Spring Boot中的 Spring initializr 的使用
  • go.uber.org/ratelimit 源码分析
  • MyBatis一级缓存和二级缓存以及 mybatis架构
  • .net开发日常笔记(持续更新)
  • 续:MySQL的并行复制
  • XtQuant是什么?哪家券商支持miniQMT,XtQuant?
  • 使用SQLite进行Python简单数据存储的线程安全解决方案
  • Centos服务器配置使用密钥登录
  • 【C++题解】1722 - 输出两位的巧数
  • Docker 部署 Kafka 可视化 Kafka-UI
  • Arco Voucher - 不知道有什么用的凭证单据录入表单插件
  • 简易STL实现 | Deque的实现
  • PyMOL的开源版和商业版如何选择 PyMOL开源版安装 PyMOL商业版安装 PyMOL安装教程 远程安装PyMOL正式版 官网版
  • PDF文本指令解析与文本水印去除
  • 【IDEA】一键重启多个服务
  • 游戏出海,燃动全球,“安全”如何通关?
  • 【C++】有关vector迭代器失效问题
  • 快速了解Git服务器端基础及基本操作命令(一)
  • mysql的group by怎么用
  • disk manager操作教程 如何使用Disk Manager组件 Mac如何打开ntfs格式文件
  • Open WebUI官方库:解锁人工智能服务的官方通道
  • git常见命令行及分支规范
  • MATLAB智能优化算法-学习笔记(1)——遗传算法求解0-1背包问题【过程+代码】
  • 通过css,js html结合实现第一个页面
  • 网络安全实训六(靶机实例DC-3)
  • 迭代器模式
  • TWRP 使用帮助 第三方Recovery
  • 给鼠标一个好看的指针特效 鼠标光标如何修改形状?