这些天入门MISC,对隐写术产生了兴趣,想 了改 一下,顺便写个博客记录,主要讲解F5隐写的矩阵编码和隐写工具。
建议先阅读计算机图像显示原理与BMP图像文件格式,对计算机的图像显示有初步认识。

一、什么是隐写术

wiki:隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。

为了方便理解wiki中关于隐写术的定义,现在举个关最简单的例子:一个24位图中8个bit的数据代表一个像素点,在这样的图片中,人眼是无法识别1111111111111110所代表的蓝色的,最低有效位(LSB)就可以被用来存储其他我们想保密的信息。

二、F5隐写

1.矩阵编码

矩阵编码的基本思想是用n位LSB表示k位信息(n>k),还是先从一个例子引入。如果要写入的原LSB是a=a1a2a3(n==3),要写入的信息x=x1x2(k == 2),

(这里的带下标的a和x都是值为0或1的二进制位,代表各个位上的对应值)

则让a的每两位异或得到的结构跟对应要写入的信息比对,不相等则修改LSB,相等则不改变。这个例子会导致下面四种情况:

  • x1 == a1^a3,x2 == a2^a3,此时不做任何修改
  • x1 != a1^a3 ,x2 == a2^a3,此时修改a1
  • x1 == a1^a3,x2 != a2^a3,此时修改a2
  • x1 != a1^a3 ,x2 != a2^a3,此时修改a3

由于二进制的异或运算的特性可以发现,这个例子里最多只要更改1位就可以达成数据嵌入的效果。

最大更改位数 dmax 的不同代表着不同的编码方式,毫无疑问, dmax取值不同使n和k的关系不同。每种编码方式都可以用有序数组(dmax,n,k)表示,而对于F5隐写,采用的矩阵编码是属于dmax == 1,即(1,n,k)的编码方式,此时n和k满足n ==2k - 1。

(1)嵌入

那么对于n位LSB和k位信息,我们也可以根据以上的例子推测出来通用形式了,下面给出具体的F5隐写的矩阵编码。(忽略了一开始的格式校验步骤等等)

  • 根据待嵌入消息x的长度就算出nk

  • 将待嵌入消息x分组,k个消息为一组,每一组写入n个LSB。

  • nk满足关系 n=2k-1,即k位信息嵌入n位LSB。

  • a=a1a2a3……an是嵌入之前原LSB组成的n位二进制数据,计算散列函数f(a)

计算散列函数f(a)
i项表示为ai * i ,i从1开始到n每一项异或相加得到散列函数f(a)
在这里插入图片描述

  • 计算要修改的是a的第几位,y==x ^ f(a)

  • 如果用a'代表信息处理后的待嵌入LSB的码文,那么a'只会出现下面两种情况:

    1. a'==a,此时y==0,无需修改任何位。
    2. a'!=a,此时y!=0,aa'只有从左往右第y个二进制位不同(dmax==1),则将第y个二进制数取反 修改即嵌入成功。
  • 进入下一组k位消息的嵌入。

(2)提取

提取的话很容易,关键看下面的推导公式
在这里插入图片描述
也就是说只要提取出a',然后进行f(a')运算就可以得到信息了

2.隐写工具

安利一下,https://github.com/matthewgao/F5-steganography

(1)使用

cd到安装目录下命令行输入

java Extract “待提取的图片路径”

最后在安装目录下会生成一个output文件,这就是提取出的文件,举例如下。
在这里插入图片描述
在这里插入图片描述

【参考:

  • https://xueshu.baidu.com/usercenter/paper/show?paperid=b15b8bd5deef65cfa827b9a9a254458c&site=xueshu_se】
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐