【信息隐藏技术】隐写术、盲水印知识体系



2020年11月14日    Author:Guofei

文章归类: 0x58_密码学    文章编号: 59003

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2020/11/14/blind_watermark.html


0. 前言

我在做 Blind Watermark 的时候,翻阅了大量材料,学到了关于隐写术、盲水印的很多知识,现在梳理了一遍,发出来。

本文结构:

  1. 简介:隐写术的应用场景、分类、特点
  2. 隐写术:介绍几种巧妙的隐写术的算法
  3. 隐写术的衡量指标:如何衡量算法的好坏
  4. 隐写分析:如何攻击隐写算法

1. 隐写术的简介

隐写术与密码技术的区别。

  • 密码技术主要研究如何将机密信息进行特殊编码,以形成不可识别密文。
    • 核心是如何更加难以破解。
  • 隐写术则主要研究如何将某一机密信息秘密隐藏于另一公开的信息中,然后通过公开信息的传输来传递机密信息。
    • 核心是不被发现、难以破坏
    • 隐写术隐写的内容往往先用密码技术加密过。
    • 密码技术产生的密文,改变一个bit就无法恢复,而隐写术产生的内容可以有一定的变化。

应用场景:

  1. 版权保护。数字水印可以提供所有权证据。
  2. 指纹。合法用户的身份嵌入水印,用于识别非法复制。
  3. 注释。把额外信息写入,同时不占用额外带宽,且不易丢失。
  4. 篡改提醒。脆弱水印,对图像任何修改将破坏水印。
  5. 自动监视。

分类

稳健性分类

  • 易碎水印:主要用于防篡改,例如LSB水印
  • 鲁棒水印:应用非常广,例如版权保护、盗版跟踪。对以下攻击鲁棒。
    • 无意攻击:有损压缩、线性和非线性滤波、修剪、旋转、重取样
    • 故意攻击:打印、重扫描、添加水印、添加噪声

从解密方式分类

  • 盲水印 是指只需要密钥, 不要原始数据的参与
  • 非盲水印 是指需要原始数据的参与。

可感知度上分类

  • 明水印 可感知的数字水印,也叫 可见水印
    • $f_w=(1-a)f+aw$,其中,f是原图,w是水印。a是水印透明度,如果a=1,水印不透明
    • 可见水印的技术发展目标是使水印更难被移除。例如,方案之一是用密钥随机确定水印亮度。
    • (可见水印不是本主题的重点,下面就不涉及了)
  • 暗水印 不可感知的数字水印

按照载体分类

  • 图像水印
  • 音频水印
  • 视频水印
  • 文本水印
  • 办公软件水印。主要是 Word、Excel、PPT
  • 三维模型:网格水印、3D打印水印

从加密方式分类

  • 私钥系统
  • 公钥系统

可逆水印

  • 指的是提取水印后,可以无损恢复原始载体
  • 医学、军事、司法图像领域有用。主要用于完整性验证。

从嵌入的通道分类

  • 替换:用秘密信息替换载体的冗余部分,典型算法是 LSB(下文详细介绍)
  • 变换域:例如把密文信息写入频域,典型算法是基于 DCT 的隐写术(下文详细介绍)
  • 扩展频谱技术
  • 统计方法:更改载体的若干统计特征,在提取时使用假设检验。
    • 用来嵌入1个比特,找到某个统计特征,如果要嵌入1,就显著改变统计特征;如果要嵌入0,就不修改。
    • 解码过程就是一个假设检验函数。
    • 此方法通常应用场景很窄
  • 失真技术:使信号失真来保存信息,解码时测量与原始载体的偏差
    • 例子1:在 html 中插入不可见的字符,这些字符在web浏览器中被忽略,但查看 html 源码可以发现
    • 例子2:在印刷品中,单词(或句子,或整行),做微小的上下移动,可以用来嵌入比特。
    • 例子3:在印刷物中,单词之前的空格,也可以有大小,用来嵌入比特。
  • 载体生成:直接把信息编码成伪装载体
    • 算法1:直接做文本/字母的替换等,如“与佛说禅”
    • 把信息隐藏在字母出现的频率(Huffman树上)。步骤是:首先根据秘文生成 Huffman 树,然后根据 Huffman 树生成一段文字。

历史上的隐写术

  • 不可见墨水:被万用显影剂破解了。万用显影剂可以检测纤维表面,确定哪一部分被加湿过。
  • 纸币防伪技术,紫外线荧光。
  • 微缩胶片,粘到无关杂志的标点符号上。
  • 用正/斜体编码,把二进制编码隐藏在印刷文字里。
  • 藏头诗
  • 蜡板藏书

2. 几个隐写术算法

2.1 图片空域隐写术:LSB

参考项目:

HideInfo

项目实现了2种 LSB

  • 把待嵌入的数据变成 bit 类数据,然后用 LSB 算法
  • 待嵌入的数据是图片,保持隐水印和图片的空间结构(类似明水印),用 LSB 嵌入

LSB(最低有效位,Least Significant Bit)利用人类视觉的一个特点,即对在某一阈值之下的变化感知不明显。

LSB算法比较简单,就是把载体的二进制低位替换为密文。

用公式写,就是用无符号整数运算执行下面的运算:
$f_w=4(f/4)+w/64$

  • 核心原理是,对于8比特图像,最低阶比特对我们感知图像是没有效果的。
  • $4(f/4)$是把最低的两阶置零。$w/64$把水印压缩到最低两阶
  • 算法的特点是易碎,经过有损压缩后,水印全部丢失。

LSB 的优缺点:

  • 人眼无法察觉图像变化
  • 易受剪切和压缩的影响
  • bmp或gif转jpg后,密文就会丢失
  • 可嵌入的信息极多。例如,一幅图像是 800✖️600✖️3 的8位图,如果只嵌入最低位,可以嵌入800✖️600✖️3=1.44e6 bit 数据=180k byte

LSB改进:Hide and Seek

上面提过,LSB可以嵌入极多的数据,那么我们可以放弃一定的嵌入容量,来换取隐蔽性。

Hide and Seek 的思路就是随机选取一些像素点,在这些像素点上嵌入信息。

具体算法就不写了,几个整除。而且方法变种可以有很多。

LSB改进2:LSB替换

规则如下:

  • 如果载体最后一位与密文一致,保持最后一位不变
  • 如果不一致,随机+1或-1

目的是像素点的“平均值”不变

然后真值表:

原载体最后一位 密文 替换方法 替换后的载体最后一位
1 1 1 1
1 0 ±1 0
0 1 ±1 1
0 0 0 0

攻击LSB

chi2测试

  • 假设:计算整体的奇偶比例,假设每个部分的奇偶比例等于整体的
  • 如果隐写术顺序插入的,顺序检测到chi2的p值接近1,密文结束时,p值突然变成0。因此不但能检测出是否嵌入密文,还能检测出密文的长度。
  • 如果隐写术不是顺序嵌入而是随机嵌入(Hide and Seek),Chi2 几乎失效。
  • 因此,要对付 chi2测试,隐写算法必须控制密文信息量,如果密文信息量远小于载体容量,就很难用chi2测试发现隐写了。

拉普拉斯滤波

  • 正常的图像,拉普拉斯滤波后的分布图主要在0附近
  • 但是 LSB 后的图,拉普拉斯滤波后的柱状图有较大变化,中心区域会变形。这是因为一般图像的像素附近点差别较小,但 LSB 会让附近点有变化。

抹除隐藏的信息:LSB嵌入的隐藏信息很容易抹除

  • 压缩图片,例如32位压缩到24位
  • JEPG压缩

2.2 图片频域隐写技术

参考项目: blind_watermark

变换域技术包括:

  • 离散余弦变换(discretecosinetransform,DCT),DCT 变换的好处是,如果原序列是实数序列,那么变换后也是实数序列。二维DCT的最著名的应用是 JPEG 压缩。
  • 离散小波变换(discretewavelettransform,DWT)
  • 离散傅立叶变换(discretefouriertransform,DFT)
  • Mellin傅立叶变换(mellinfouriertransform)

几种主流算法:

  • JSteg是第一个有效公开的基于JPEG的隐写程序。
  • F5所使用的嵌入操作与LSB匹配不同,它使用矩阵嵌入来保证嵌入的改变最小化。
  • MBS1和MBS2使用LSB匹配,并保留DCT系数的模型。
  • OutGuess和Steghide保留了一阶统计,Steghide改变系数对。除了OutGuess和F5,所有算法都以JPEG图像为输入,直接调制它们的DCT系数。

JPEG压缩算法

原图的某个通道(所以可以处理RGB或YUV等),做以下处理:

jpeg算法

JPEG压缩的流程:

  1. 把图片转成 YCbCr 颜色空间
  2. 按照 8x8 分块,对每个分块做DCT
  3. 根据压缩因子,建立一个定义好的 8x8 的整数矩阵
  4. 对第2步的每个分块进行操作,2的结果关于3的整数取整到最接近整数
  5. 4的效果是,每个分块 DCT 的每个值的可能性就大大减少了
  6. 用 Huffman 编码存下来(或者其他熵编码器)

DCT 隐写算法

  1. 伪随机拿出一个8x8分块,这个分块之后用来嵌入一个比特
  2. 对分块做 DCT
  3. DCT后的结果,伪随机选择2个数字,b1,b2
  4. 如果要嵌入的比特值是0,确保 b1 小于 b2;如果要嵌入的比特值是1,确保 b2 小于 b1。如果不满足,用交换的办法来满足。
  5. 加入随机性,使 $\mid b1-b2\mid>x$,这里面的x越大,算法抵抗 JPEG 压缩的能力越强,但是图像的质量就越差
  6. 逆向DCT变化,回到空域

2.3 基于调色板的隐写术

GIF和BMP的调色板索引是可以随意交换顺序的,如果有N种颜色,就可以有 N! 种组合,因此可以用调色板的顺序来埋入信息。

  • 鲁棒性很差,攻击者简单的改变调色板就可以破坏隐秘信息

改进方法1:对调色板排序(例如按照亮度排序),然后对调色板用LSB方法

  • 排序方法有很多种,例如,给出一个像素值,找到下一个最接近的像素值,如此形成一个序列

改进方法2:把调色板数量倍增,然后微小的修改备份的调色板。

2.4 声音隐写术

声音中隐藏信息更难,因为人类听觉系统对噪音扰动非常敏感。

  1. 但人类听觉系统对声音的相位不太敏感,这个事实大量用于声音压缩。
  2. 回声隐藏

回声水印

项目: HideInfo

$f_{new}(t)=f(t)+af(t-\Delta t)$

  • 如果要嵌入0,就取 $\Delta t=k_0$
  • 如果要嵌入1,就取 $\Delta t=k_1$

2.5 视频隐写术

把图片盲水印应用的视频时,水印和载体的信息比的问题就不重要了,但是时间维度上的失真就难以控制。

有一种基于运动矢量化的方法,实现把信息嵌入 MPEG 视频流中。原理还是类似基于图像的 DCT 方法。


几种隐写术比较:

方法 示例 埋入信息量 是否有损 鲁棒性 隐蔽性
隐写在频域上   有损 很强,抗各种攻击。 很强
隐写在空域上   无损
图种 copy /b xx.jpg+xx.rar xx.jpg 理论上无上限 无损 几乎无,像素和文件大小不匹配、扫描内容都可以发现

文本隐水印:不可见字符

text_blind_watermark

文本隐水印:自然语言替换

用同义词的对照和替换关系,来嵌入比特编码。可能导致语言风格变化、词不达意。

文本格式微调

  • 载体:文字截图、PDF等

方法

  • 轻微改变字符间距、行间距和字符特征
  • 自定义字体,字体中的某些笔画的颜色有深浅。一个字对应多个字体,因此嵌入信息。
    • 人工智能方法:针对拍屏、打印等场景,训练神经网络。利用神经网络生成字体,以达到抗攻击性。

其它隐写算法

Patchwork算法是

  • 麻省理工学院媒体实验室WalterBander等人提出的一种数字水印算法,主要用于打印票据的防伪。
  • Patchwork数字水印隐藏在特定图像区域的统计特性中,其鲁棒性很强,可以有效地抵御剪切、灰度校正、有损压缩等攻击,其缺陷是数据量较低,对仿射变换敏感,对多拷贝平均攻击的抵抗力较弱。

纹理块映射编码

  • 纹理块映射将水印信息隐藏在图像的随机纹理区域中,利用纹理间的相似性掩盖水印信息。该算法对滤波、压缩和扭转等操作具有抵抗能力,但需要人工干预。

3. 隐写术算法评价指标

  • Imperceptiblility:不可感知性。嵌入信息前后,人眼无法感知到的变化
  • Robustness 鲁棒性
  • 隐秘性。不被各种隐写分析发现的能力。
  • Capacity 嵌入信息的量。一般来说,嵌入信息越多,鲁棒性越低
  • 水印强度。水印对抗抹除、覆盖的能力。一般与水印的可感知性也是一对 trade off
  • 性能。

鲁棒性,嵌入水印后的载体被攻击后,仍然能提取水印。常见攻击:

  • Geometry Attack 几何攻击
    • Cropping:裁剪
    • Rotation:旋转
    • Scaling:缩放
    • Translation:平移
    • Shearing:倾斜(非均匀拉伸)
  • 信号增强:锐化、对比度、色彩校正、伽马校正
  • 噪声:高斯、均衡、斑点、蚊状
  • 滤波:低通、高通、带通
  • 有损压缩:JPEG(图像),MPEG(视频),MPEG(音频)
  • 局部或全局仿射变换:平移、旋转、缩放、剪切
  • 压缩
  • 合成:标志插入、加入布景
  • 格式转化:例如GIF转JPEG
  • D/A和A/D变换,例如:先打印后扫描,转成模拟信号再转回数字信号
  • 多重水印:再次被打上水印,会使一些隐写水印“变淡”甚至被破坏
  • 统计平均:例如,攻击者找到同一个图片的加入不同水印的版本,做一下平均后,往往可以使所有水印都被破坏
  • 马赛克

失真度的度量

正常的图像来说,颜色会逐渐变化,但很少会出现“1比特变化”这种情况。

  • 打上水印的图和原图之间的Lp范数 $Lp=(\dfrac{1}{MN}\sum_i\mid I_i-I’_i \mid ^p)^{1/p}$
    • p=1, p=2 是最常用的
  • 信噪比:$SNR=\dfrac{\sum_i I^2}{\sum_i(I-I’)^2}$
  • 参考以上两条的思路,可以定义很多指标
  • 直方图相似性。先算出两个图的直方图,然后求出相似性。
  • 人工方法:就是找十来个人打分,针对能不能察觉到水印做打分

4. 攻击隐写术

攻击方法的分类

  • 被动攻击:接受载体,分析载体
    • 隐写分析:分析载体是否被隐写
    • 破解隐写术:确定载体被隐写后,提取秘文
  • 主动攻击:截取载体,处理载体(例如压缩图片,要保证人感知不到变化),使密文被去除(或者没去干净但无法再解出来),继续传输载体。

常用攻击手段

  • 多拷贝平均。对同一幅作品的多个发行版本进行数值平均,利用水印的随机性去除水印。针对频域水印算法,可以构造具有特定频率特性的线性滤波器,攻击频域上隐藏的水印信息。
  • 几何变形攻击
  • 非线性滤波。中值滤波或其他各种顺序统计滤波既可以改变信号的频域特性,又可以破坏同步性,是一种复合攻击。
  • 拼接攻击。将含有水印的数字作品分割成若干小块,形成若干独立的文件,然后在网页上拼接起来。由于各种数字水印算法都有一定的解码空间,只靠少量的数据无法读取水印,所以很难抵御拼接攻击。
  • 二次或多次水印攻击。攻击者使用自己的算法在数字作品中加入水印,可能会破坏真正的水印,也可能不会。即使不破坏水印,在司法鉴定时,很难判断哪一个水印操作在前,哪一个在后

隐写分析

隐写分析的目的是分析载体是否被隐写。

  • 属于模式识别或机器学习分类问题。
  • 用机器学习技术,察觉特性很小的偏差
  • 隐写算法在嵌入秘密数据时,必定修改原数据。载体的某些统计特征必然变化。
  • 通用隐写分析针对多种隐写术。专用隐写分析针对某个隐写术。

估计秘密信息长度、破译秘密信息,属于量化分析和解密范畴。

隐写分析方法

  • 视觉隐写分析。(Visual steganalysis)
  • 结构隐写分析(Structural steganalysis)
  • 统计隐写分析(Statistical steganalysis):定义一套随机变量,做参数统计建模
  • 学习隐写分析(Learning steganalysis):用大量的隐写后的文件、未隐写的文件做为样本,做一个二分类机器学习模型。

视觉隐写分析 的例子:
某个隐写术利用了人类视觉的不可感知性。对某个图做二值化,发现有大量噪点,判断用了隐写术,如下图:

隐写术1

(左边是原图二值化,右边是打上隐写的图二值化,显然右边隐写了信息)

结构隐写分析:

  • 任何隐写工具都会引入某种特征。
  • 早期某种文本隐写术,利用html的特点
  • 文本,调整文本颜色、大小、位置
  • 链接:不用下划线,且鼠标指针经过链接时不变化
  • 注释:html注释

主动攻击

  • 降低图像质量
  • 再次加入水印,往往可以削弱原有水印,甚至使之失效。一些版权保护的商业软件为了应对这种攻击,会拒绝对已有水印的图再次加入水印
  • 取平均。例如,同一个视频加入不同的水印,如果攻击者获得了多个加水印后的版本,只需要把它们做个相加,往往就抹除隐水印。
  • 减法攻击。甲的原图是I,水印是x,嵌入图是I+x。攻击者乙的水印是y,然后声称 I+x-y 是自己的原图。

参考资料

  • Wadhera S, Kamra D, Rajpal A, et al. A comprehensive review on digital image watermarking[J]. arXiv preprint arXiv:2207.06909, 2022.
  • 冈萨雷斯:《数字图像处理》,电子工业出版社
  • S.Katzenbeisser:《信息隐藏技术:隐写术与数字水印》,人民邮电出版社
  • 刘粉林:《数字图像隐写分析》,机械工业出版社出版

您的支持将鼓励我继续创作!