F3隐写

article/2025/7/20 16:15:56

F3隐写


文章目录

  • F3隐写
    • 1. 引言
    • 2. 实验环境
    • 3. 实现使用的现有外部库
    • 4. 实现思路
        • > **预处理**
        • > **DCT量化**
        • >**秘密信息嵌入**
        • > **Z字形序列化**
        • >**Huffman编码**
        • >**反Z字形序列化**
        • >**提取秘密信息**
    • 5.验证
    • 6. 总结

1. 引言

数字隐写技术是一种在数字媒体文件中隐藏秘密信息来打到隐秘通信的目的的技术。区别于信息密写使用负载的加密方案和密钥保证信息传输内容的机密性和完整性,隐写术通过隐藏通信行为的方式保障通信的安全性。数字图像作为使用最广泛的数字媒体,基于图像的数字隐写技术发展成熟。
JPEG有损压缩技术是一种广泛应用于网络图像传输和保存的有损图像压缩技术。作为有损压缩的一种,这一技术通过将图像转换至DCT域,在提供可分级的良好压缩率的同时降低了有损压缩对图像质量的影响。成为最流行的有损压缩格式。
F3隐写是一种针对JPEG压缩技术特性开发的数字图像隐写算法,通过将秘密信息隐藏于量化后的DCT系数的中频区域,兼顾隐写的鲁棒性和不可见性。是一种较为优秀的变换域图像隐写技术。
本次实验的目的在于实现F3隐写算法

2. 实验环境

环境版本
windows10
python3.8
pycharm2019.3.3

3. 实现使用的现有外部库

版本
numpy1.18.2
pillow7.1.2
scipy.fftpack1.4.1
dahuffman.HuffmanCodec0.2

4. 实现思路

具体的隐写流程如图[1]所示:

Created with Raphaël 2.2.0 Start 读入载体图像 提取Y通道像素矩阵 分割为8*8子块 量化DCT系数 utf-8读取秘密信息 转化为8位二进制数组 拆分为01串 将信息按F3规则嵌入子块中频 逐块z字形一维序列化 生成huffman字典 转换为Huffman编码序列 输出Huffman编码序列 End

图一: F3隐写嵌入流程


Created with Raphaël 2.2.0 Start 读入huffman字典和编码序列 Huffman解编码 z字形一维序列二维化 按照F3规则从子块中提取中频秘密信息序列 01串分割成8位二进制串 二进制串utf-8解码 输出解密信息 End

图二:F3隐写提取流程


具体技术细节:

> 预处理

对载体图片的预处理: 使用pillow读入载体图片,转化为YCbCr后,提取Y通道矩阵作为隐写。
对秘密信息的预处理:
Y = 0.2990 R + 0.5870 G + 0.1140 B Y = 0.2990R+0.5870G+0.1140B Y=0.2990R+0.5870G+0.1140B C b = 128 − 0.1687 R − 0.3313 G + 0.5000 B Cb = 128-0.1687R-0.3313G+0.5000B Cb=1280.1687R0.3313G+0.5000B C r = 128 + 0.5000 R − 0.4187 G + 0.0813 B Cr = 128+0.5000R-0.4187G+0.0813B Cr=128+0.5000R0.4187G+0.0813B

将秘密信息转化为由01字串表示的二进制序列。具体包括utf-8编码,数字转8位二进制,二进制转01串P。在正式的秘密信息前使用16位二进制表示嵌入的秘密信息大小。最高支持64KB。

> DCT量化

将Y通道矩阵转化为 n u m p y numpy numpy对象,调用 n u m p y . v s p l i t ( ) numpy.vsplit() numpy.vsplit() n u m p y . h s p l i t ( ) numpy.hsplit() numpy.hsplit()函数均匀切割成8*8大小子块。生成子块矩阵B。Bij表示位于i行j列的子块。逐块调用 f t p a c k . d c t n ( b l o c k ) ftpack.dctn(block) ftpack.dctn(block)进行DCT变换后,量化处理。得到各块的量化DCT系数矩阵。

>秘密信息嵌入

将序列P顺序嵌入DCT量化矩阵中, 具体嵌入规则如下:

  • 每个非零的DCT系数隐藏1bit秘密信息。
  • 秘密信息为0,当前DCT系数为±1时,将当前DCT系数赋0,跳过不嵌入。读取下一个DCT系数重新嵌入。
  • 当秘密信息和当前DCT系数最低有效位相同时,不做改变;当秘密信息和当前DCT系数最低有效位不同时,将当前DCT系数的绝对值减一,符号保持相同复制给当前DCT系数。

python实现如下:

    if not block[m][n]:continueif abs(block[m][n]) > 1:if block[m][n] % 2 != binary[0]:if block[m][n] > 0:block[m][n] -= 1else:block[m][n] += 1binary.popleft()

> Z字形序列化

将8*8子块按Z字形排布转化为一位序列。将所有子块的一维序列连缀在一起。

Z字形扫描
图三:Z字形扫描
可以发现,每条斜线上的点的横纵坐标和是相等的。Z字形扫描就是顺着斜线线的方向读取。当横纵坐标和为奇数时,顺序为右上至左下;当横纵坐标和为偶数时,顺序为左下至右上。据此,设计以下实现:

def zigzag(self, mat):l = [[] for line in range(16)]for i in range(8):for j in range(8):l[i + j].append(mat[i][j])zigzag = []for i in range(15):zigzag += l[i] if i % 2 == 1 else reversed(l[i])return zigzag

>Huffman编码

调用HuffmanCodec.from_data()生成一维序列的Huffman编码表。调用huffmanDict.encode()根据编码表编码一维序列。

>反Z字形序列化

Huffman解编码后反Z字形序列化得到8*8子块矩阵

>提取秘密信息

逐一顺序读取DCT系数,取非零DCT系数的最低比特位连缀成串。
首先取01串前16位转化为二进制数,得到嵌入长度slen。
从01串第17位起每8位作为一个二进制数读入,直到读入slen个数。
将slen个数作为ut-8编码翻译成字符,得到的字符串即为携带的秘密信息。

def deSteg(self, steg_blocks):bin_seq = []for i in range(len(steg_blocks)):for j in range(len(steg_blocks[0])):block = steg_blocks[i][j]width, height = block.shapefor m in range(height):for n in range(width):if block[m][n]:bin_seq.append(str(abs(block[m][n]) % 2))l = "".join([bin_seq[i] for i in range(16)])l = int(l, base=2)print("slen: ", l, type(l))bin_seq = [bin_seq[i] for i in range(16, l * 8 + 16)]bin_seq = np.split(np.array(bin_seq), l)bin_seq = np.array([chr(int("".join(item), 2)) for item in bin_seq])binfile = b""for i in bin_seq:binfile += i.encode("utf-8")return binfile

5.验证

实验选择的载体图片
实验选择的载体图片

向图片中隐写了一个文本文件,通过将提取出的文本文件和原始文件分别生成sha-256摘要。二者的摘要值如下:

原始文件 73897da2063f4c352a5c7a72ed52bd861034c5b9ea9674688a768b82d2ac6e7a
提取文件 73897da2063f4c352a5c7a72ed52bd861034c5b9ea9674688a768b82d2ac6e7a
before and after Steg, the secret is same

结果表明,二者是同一个文件,秘密信息在隐写前后没有发生丢失。

6. 总结

F3隐写算法是一种巧妙利用JPEG压缩技术在量化DCT系数后数据无损失和DCT域将图像主要特征集中体现在低频区域的特点的JPEG图像隐写算法。该算法在具有较好的鲁棒性和不可见性的同时,解决了Jsteg算法嵌入率低下的问题。
存在的问题:未能生成含有秘密信息的图片,只进行到熵编码的步骤。缺乏现有的手段由量化DCT系数或熵编码直接生成图片。而经过逆DCT化形成YCbCr图像的过程会导致隐写信息的缺失和改变,经过实验无法正确提取秘密信息。
逆DCT变换生成的含密图片,实验表明,秘密信息被损坏无法正确提取
逆DCT变换生成的含密图片,实验表明,秘密信息被损坏无法正确提取


http://chatgpt.dhexx.cn/article/5JXdCXFQ.shtml

相关文章

TTL隐写

#拿到一个长成这样的文件,里面是意义不明的数字 63 63 63 255 63 63 63 255 63 63 63 255 63 63 63 255 63 63 63 255 63 63 63 255 63 127 63 255 63转换为2进制,并设置为8位数的2进制,就会有很神奇的事情发生 with open(C:/Users/brighten…

深度学习之图像隐写去除(DDSP模型 Steganography Removal)

文章目录 一 前言二 论文内容2.1 Abstract2.2 Introduction2.3 Background2.3.1 Prior Work2.3.2 Super Resolution GAN 超分辨率GAN 2.4 Data2.5 Deep Digital Steganography Puricication (重头戏)2.5.1 Autoencoder Architecture2.5.1 GAN Training 2.6 Result 三 训练结果四…

SRNet隐写分析网络模型 (pytorch实现)

文章目录 一 SRNet隐写分析模型介绍二 SRNet网络概述三 训练结果展示 一 SRNet隐写分析模型介绍 SRNet模型是宾汉姆顿大学(Binghamton University)Jessica教授团队于2018年提出的图像隐写分析网络模型,应该说是当时SOTA(state-of-the-art)的隐写分析网络模型了&…

GIF隐写

CTF DAY1的倒数第二题: 首先 打开图片 发现打不开 用010 Editor 发现图片开头少了文件头 添加文件头 使得图片能够看到 这时候打开图片 发现 密码一闪而过 这时候 用到另一个软件 Namo_Gif 打开刚刚已经恢复好的GIF 可以清楚的看到每一帧 对于每一帧 修改他…

隐写术--总结

文章来源:http://bobao.360.cn/learning/detail/243.html 1.增加数据的方式 隐藏信息 另存为.zip后解压,正常的.JPG图片在文本编辑器(winhex)中,16进制是以FF D9结尾 原理:a.先制作一个1.zip 把含有隐藏…

隐写术技术深入分析

文章目录 0x01 隐写术概要0x02 特征0x03 隐写术应用0x04 题目解析思路 0x01 隐写术概要 首先看一下官方定义,“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。” 简单说就…

隐写术基础

目录 前言 一. 隐写系统模型 二. 隐写分析系统模型 三. 对比隐写技术与密码技术 四. 隐写术的基本术语与概念 4.1 不可感知性 4.2 安全性 4.3 隐蔽性 4.4 鲁棒性 4.5 隐藏容量 4.7 检测粒度 总结 前言 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐…

CTF学习之MISC之图片隐写与文档隐写

CTF学习之MISC之图片隐写 隐写术概述 图片隐写技术图片EXIF信息隐写图片LSB低位隐写 隐写术(Stega) 隐写术(Steganography,简写Stega) 一门关于信息隐藏的技巧与科学 信息隐藏:不让除预期的接收者之外的…

隐写术

目录 隐写(信息隐藏,steganography) Stegsolve Binwalk MP3Stego Bftools(Brainfuck) F5-steganography-master S-Tools 隐写(信息隐藏,steganography) 目的:以表面正常的数字载体如静止图象、数字音频和视频信号等作为掩护&#xff…

OMNET++安装教程

安装: 如果你是windows系统,那么强烈推荐你跟着B站上的教程来学习,下面是链接。 这个博主讲的特别细致,而且会捎带讲几个例子,有助于我们快速的建立起来学习的信心!!! 当时我看到…

【OMNET++】OMNET如何开启Debug调试

1.前言 OMNET作为网络仿真软件,其编译语言为NEDC和C,在学习过程中我们该如何运用debug跟踪代码呢?这一讲我们简单和大家分享一下OMNET如何开启Debug调试。 可能我们翻阅很多资料,都会提到一句话,Window下的OMNET是基于…

【OMNET++】OMNET安装卸载说明以及原理探讨

前言 我们安装OMNET,参考file:///D:/omnetpp-5.4.1-src-windows/omnetpp-5.4.1/doc/InstallGuide.pdf的官方文档,其支持的平台很多,例如window、Ubuntu 、Linux以及红帽等系统,这篇博文以window为例,简单说明其中注意…

Ubuntu18.04 安装 omnet 5.6.2

1. 下载所需的OMNet版本 下载链接: OMNeT官网下载 2. 解压下载的omnet包,找到安装教程 解压方式:可以鼠标右击,选择Extract here;也可以在终端中使用命令行解压. 安装教程在: omnetpp-5.6.2-src-linux/omnetpp-5.6.2/doc/Install…

OMNeT学习之TicToc2-7详解

OMNeT学习之TicToc2-7详解 前言 安装好OMNeT,学会新建项目之后,开始学习OMNeT提供的tictoc案例,共17个,之前的博客中已经讲解了Tictoc1,本次学习2-7。 本人学习一个tictoc工程,主要就是看它的cc文件、ned…

omnet++构架与源码分析(1)

omnet模型以及运行环境部分使用c开发,IDE以及插件使用Eclipse以及插件方式开发。其中c代码位于解压后的include与src目录; src下面分为: sim:仿真内核类的CC代码;各种头文件,都在include目录;…

linux下运行omnet,Ubuntu安装Omnet++

1.官网下载Omnet++压缩包(https://omnetpp.org/),解压到安装文件夹 tar -zxvf omnetpp-5.1.1-src-linux.tgz /opt 2.运行./configure 报错configure: error: Bison not found, needed to build OMNeT++/OMNEST – please install it! 解决办法:安装bison,安装完成后会提示还…

OMNeT学习之新建工程

OMNeT学习之新建工程 前言 之前学习了OMNeT的安装与运行官方的实例代码,这篇文章记录一下,OMNeT如何创建一个新的项目。 本人为初学者,如有错误望批评指正! 本文原创,创作不易,转载请注明! …

omnet++ 之aloha示例 的动画效果分析

void Host::refreshDisplay() const {cCanvas *canvas getParentModule()->getCanvas();const int numCircles 20;const double circleLineWidth 10;// 第一次使用时候创建:如果没有传输波形图,则创建一个圆环内部填色,创建20个圆环&am…

【OMNeT+INET】详解OMNeT开源库INET(一)

1、前言 在我看来,网络模拟器是用于评估目标系统性能和能力的方便工具,不同的设计方案,在不同的配置下不同的操作条件和运行场景下,可以用于帮助理解系统并获得与性能相关的参数(例如吞吐量、延迟、稳定性、健壮性和可…

omnet结果分析anf文件

运行omnet项目,在result文件夹里生成vec 和sca 文件。这两个文件是模拟的统计信息。 我们下面来进行结果分析,首先要新建一个.anf 的分析文件。(直接双击vec文件系统会提示新建一个anf文件,finish)Finish 之后,把左侧result 文件夹里面所有的.sca、.vec 文件拖到Input fi…