Wong 脆弱水印实现
00 分钟
2023-8-6
2024-6-22
type
status
date
slug
summary
tags
category
icon
password
 
源码及实验报告所在仓库链接 : wong_watermark
 
这是一个检测图像是否被篡改,以及定位篡改区域的脆弱水印方案, 由 Ping Wah Wong 设计, 参考此 pdf ( 加载需几秒钟 ) :
 
 
 
水印嵌入流程图 :
notion image
所谓的”水印”即指上图的块级水印比特面 Br, 它是一个二值图像(每个像素值只能是0或255), 它具有一定的携带信息的潜能, 但更主要的功能是显示被篡改的区域, 基于此需求, 它需要有较为明显的视觉特征,像素值不能是随机混乱分布的, 要有一点秩序. 一个纯白的图像就很合适.
嵌入流程 : 先将图像和水印都均匀划分为小矩形图像块 ( 如 16 x 16 的正方形 ),记作 Xr 和 Br . 对于每个 Xr : 先将其最低有效位置为零. 再将其与原图宽高,及这个图像块特有的下标 index (为什么要额外加 index, 可参见上面给的链接 ) , 作为参数进行哈希运算. 哈希值 Pr 与 Br( 展开为一维数组 ) 进行异或得到 Wr. 将 Wr 用私钥签名得到 Cr, Cr 以 LSB 替换的方式嵌入到 Xr 中. 得到含水印图像块 Yr. 将每个 Yr 小块拼装起来,就是加入了水印的图像. 这里的 Xr, Pr, Br, Wr, Cr, Yr 数组的一维形式都是等长的二进制流.
 
水印提取流程图 :
notion image
提取流程 : 与嵌入过程相似, 先分块, 基于异或运算的特性 ( 若 c = a ⊕ b, 则 a = b ⊕ c , b= a ⊕ c ) 来计算得到 Br’. 如果这里的 Yr’, M, N, index 等参数相对于原先的图像都没有改变, 那么 Br’ = Br. 就说明这个矩形小块并没有被篡改. 原因 : 但凡篡改了小块中的某个像素值, 若其最低有效位改变了,则 Wr ≠ Wr’ , 即 Br ≠ Br’; 若像素值的非最低有效位改变了, 则由哈希函数的性质可知 Pr ≠ Pr’ , 即 Br ≠ Br’. 即使没有修改此小块中的像素值, 而是对原图进行了裁剪, 放缩等操作, 则 M 与 N 不会与原来的相等, 则 Pr ≠ Pr’ , 导致 Br ≠ Br’.
可以看出这个水印方案对单个像素值比特级的修改都十分敏感. 一旦产生了篡改行为, 由于哈希运算与RSA解密都有较强的扩散效果 ( RSA的扩散是指 : 整数 x = y + Δ, 即使Δ很小, 解密后的 x’ 与 y’ 的差也可能是很大的 ) . 那么经这个小块生成的 Br’ 很可能就是黑白杂乱无章相间的. 如果将原始水印图和某张图像里提取出的水印图对比, 发现某些部分是黑白雪花状的, 就可以判断 : 在这个区域里有像素值被篡改了. 如果整个水印都是黑白雪花, 可能篡改的幅度太大了, 或者图像的宽高被篡改了.
所以这个水印方案对篡改区域的定位不是精确到像素点 ( 那太逆天了 ), 而是能精确到此像素点所在的小块. 其越小, 则定位越精准, 函数调用的次数也会更多一些. 但不能过小导致算法都无法实现.
 
总结

  • 水印功能 : 检测图像是否被篡改, 并定位到大致的篡改区域
  • 水印透明性 : 与 LSB 隐写的透明性是一致的, 无法抵抗直方图分析. 想拥有更好的透明性, 使用其他隐写算法即可. ( 隐写算法并不是这个水印方案的核心内容, 使用 LSB 只是因为易于实现 )
  • 水印鲁棒性 : 脆弱水印,几乎为零
  • 水印携带信息的能力 : 取决于怎么设计水印二值图像, 理论上能携带一定的先验信息.
  • 更多具体细节请参见源码和实验报告 :

留言区