type
status
date
slug
summary
tags
category
icon
password
图片隐写笔记罢了
常用函数
常见图片隐写题目示例
图像高、低位置零
题目1
读取图片“house.png”,将其每个像素的最低2位清0,保存为”house01.png”并显示该图片
解题思路:
- 读取图像A,用size函数读取图像宽高信息
- 用位运算符和嵌套for循环将每个像素的最后两位设为0
- 结果写回图像B
运行结果

代码分析(展开)
题目2
读取图片“house.png”,将其每个像素的最高2位清0,保存为”house02.png”并显示该图片
解题思路:
- 同上,开搞!😛
运行结果:

代码分析(展开)
- 自己看上面(bushi
题目3
读取一幅RGB图像“baboon.bmp”,分别提取R、G、B颜色分量,将每个颜色分量最低位清0,再合成为RGB图像,保存为“baboon01.bmp”,并显示该图像
解题思路:
- 将RGB图像按三个颜色通道分别拆为3个颜色分量Ar、Ag、Ab
- 读取其中一个分量的size,通过嵌套for循环作位运算,将最后一位清0
- 将三个颜色分量分别写回图像B
运行结果:

代码分析(展开)
🤔没什么好分析的,只是这个题目的图片要求是RGB,imread读出来是个三维矩阵,需要对每个分量进行位运算操作,比上个题多了点步骤
题目4
读取一幅RGB图像“baboon.bmp”,提取R(或G、B)颜色分量,将该颜色分量最低4位清0,再与其它分量合成为RGB图像,保存为“baboon02.bmp”,并显示该图像
解题思路:
- 跟上题差不多,只是不用每个颜色分量都需要低4位清0
运行结果:

LSB隐藏
LSB全称为 Least Significant Bit(最低有效位),是一种简单而有效的数据隐藏技术。LSB隐写的基本方法是用欲嵌入的秘密信息取代载体图像的最低比特位,原来的图像的高位平面与代表秘密信息的最低平面组成含隐蔽信息的新图像。 灰度化的图像为单通道格式存储像素,每个像素值在0~255内,而像素的位平面则是对应二进制的像素的各个位。把每个像素的相同位抽取出来组成一个新的平面,就是所谓的图的位平面。而LSB隐写算法,如其名字,是在LSB也就是最低位平面(00000001)进行信息嵌入/隐藏。 需要注意的一点是,LSB嵌入的时候,载体图像格式应该为灰度图格式。
题目1
读取“house.png”图像,使用LSB方法,将sec.txt中的信息<HelloWorld!>隐藏到该图像中,并保存为“house01.png”,显示该图像
解题思路:
- 以二进制的方式读取文档信息
- 用嵌套for循环使像素的最低位置零,将嵌入信息嵌入到需要嵌入的像素的最低位中
- 嵌入信息后的图像另存为一张新图像
这里贴上sec.txt的文件内容:

运行结果

代码分析
题目2
读取“house01.png”图像,提取其中隐藏的信息,保存到sec01.txt文件中,显示其中的内容。
解题思路:
- 基本是上一题反着来,需要知道嵌套信息的长度
- 通过嵌套for循环遍历每个像素的最低位,得到该像素最低位的值
- 将得到的值写到新的文本文件中
运行结果

代码分析
题目3
读取“pepper.bmp”图像,使用LSB方法,将sec.txt中信息<LinuxIsNum1>隐藏到该图像R分量中。再与其它分量合成,并保存为“pepper_sec.bmp”,显示该图像
解题思路:
- 由于要读取的图像是RGB图像,要把R分量位平面单独分出来
- 步骤跟第1题相似,也是把图像每像素最低位置零,再把待嵌入信息写入最低位
- 最后将该分量转换为8位无符号整型格式,再覆盖原图像的R分量

运行结果

代码分析
题目4
读取“pepper_sec.bmp”图像,提取R分量,再提取其中隐藏的信息,保存到sec01.txt文件中,显示其中的内容。
解题思路:
- 和第2题步骤类似,区别在于需要分离R分量
运行结果

DCT隐藏
DCT又称离散余弦变换,是一种块变换方式,只使用余弦函数来表达信号,与傅里叶变换紧密相关。常用于图像数据的压缩,通过将图像分成大小相等(一般为8*8)的块,利用DCT对其进行变换,得到更加简洁的数据。因为图像像素间存在较大的空间相关性,DCT可以大大减小这些相关性,使图像能量集中在左上角区域,从而利于数据压缩。变换后得到的数据称为DCT系数。这一过程是无损的。 DCT可逆信息隐藏主要是利用载体中两个特定数的相对大小来表 示隐藏信息。发送方和接收方事先约定好嵌入过程中所使用 的两个DCT系数的位置(为了隐藏的健壮性和不可觉察性,这 两个 DCT 系数应该在 DCT 的中频系数中选择)。 例如,设定 (u,v) 和 (m,n) 为所选定的两个系数的坐标。嵌入过程为:如果 Bi(u,v)> Bi(m,n) ,就代表隐藏信息“1”,如果 Bi(u,v)< Bi(m,n) 就代 表 隐 藏 信 息“0”。 如 果 需 要 隐 藏 的 信 息 位 为 1,但 是 Bi(u,v)<Bi(m,n) 那么就把这两个系数交换,最后发送方通过二 维逆DCT变换将图像转化为空间域进行传输。 提取方法:接收方接收到图像后,对图像进行二维DCT变 换,通过比较每一块中约定位置的DCT系数的相对大小,得到 隐藏信息的比特串,从而提取出秘密信息。
常用DCT变换函数:
- 使用dct函数
- 使用dctmtx函数
题目1
读取“house.png”图像,使用DCT方法,将sec.txt中信息 <HelloLinux!> 隐藏到该图像中。并保存为“housedct.png”,显示该图像
解题思路
- 我也不会(
- 没看懂……这个估计要会傅里叶变换
sec.txt的文本信息

运行结果

代码分析
题目2
读取“housedct.png”图像,提取其中隐藏的信息,保存到sec01.txt文件中,显示其中的内容
逆着来就是了(
运行结果

代码分析
4bit替换法
这是将秘密图像信息嵌入载体图像的一种最简单的方法,指直接用秘密图像像素值的高 4bit 去替换载体图像像素值的低 4bit。但无论选择R G B三层中的哪层嵌入,都会在不同程度上对原始图像造成破坏
题目1
读取“huawei.png”转变为灰度图,再采用4bit替换法将其隐藏到“pepper.bmp”中,保存为“pepper01.bmp”,显示该图像
解题思路
- 比较简单,先读取两张图像信息,对载体图像分层
- 注意秘密图像如果是RGB图像需要先转成灰度图
- 将秘密图像的低4位置0,高4位移至低4位
- 然后将载体图像的低4位置0,通过for循环将秘密图像嵌入到载体图像的低4位中
- 写回保存
huawei.png

运行结果

题目2
读取“pepper01.bmp”,提取其中隐藏的图像,显示该图像
解题思路
- 用直接4bit替换法嵌入的隐秘图像,秘密图像所在的bit位就是秘密图像
- 提取隐秘图像R分量的低4位,然后将低4位往左移,移到高4位
- 基本就是怎么嵌进去的,就怎么逆着取出来
运行结果

待施工
基于LSB的水印嵌入 ( something gone wrong 🥲 )
题目
编写脚本程序,使用LSB方法把一张图像嵌入到另一个图像中去
(注意:需要进行水印图像的二值化操作)
再编写脚本程序把隐藏的水印提取出来
基于DCT的数字水印图像隐藏
- 作者:sleepfat
- 链接:https://blog.sleepfat.top/ctf-01
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章