小工具      在线工具  汉语词典  css  js  c++  java

CTF盲水印详解

算法,人工智能,网络安全 额外说明

收录于:40天前

前言

CTF杂题中,盲水印出现的频率相当高,但大多数人都处于只使用脚本的阶段,对原理没有深入了解。本文主要总结了盲水印的原理和解决过程。一度。

基础知识

盲水印的基本原理如图所示:

主要知识点是傅里叶变换将原始图像转换为频谱图,然后叠加水印,对包含水印的频谱图进行傅里叶逆变换,得到带水印的图像。那么想一想,傅里叶变换是如何将原始图像变成频谱图,然后再将频谱图变成图像的呢?下面分析傅里叶变换。

傅立叶分析

傅里叶变换涉及的知识点太多了,第一次接触傅里叶分析的读者可以先参考一下这篇文章,傅立叶分析:绞杀教程(完整版),带链接

https://zhuanlan.zhihu.com/p/19763358

下面介绍傅里叶变换的一些必备知识。

傅里叶变换的基础知识

我们先介绍一下频域和时域。以音乐为例,在时域中我们观察琴弦的涨跌,就像股票的走势一样;而在频域,只有那一个永恒的音符。任何周期函数都可以看作是不同幅度、不同相位的正弦波的叠加。以音乐为例,任何一首乐曲都可以通过不同力度、不同时间点敲击不同的琴键来创作。

时域的基本单位是“1秒”。如果我们以一个有角频率的正弦波为基础,那么频域的基本单位就是“1”,频域的“0”就是无限周期。正弦波是一条直线!所以在频域中,0频率也称为直流分量。在傅里叶级数的叠加中,只影响整个波形相对于数轴的整体向上或向下的方向,而不改变波形的形状。由于正弦波是有周期性的,所以我们需要设置一些东西来标记正弦波的位置。即是相。

最后借用了文章中的一张图:

傅里叶变换

傅里叶原理表明,任何连续测量的时间序列或信号都可以表示为不同频率的正弦波信号的无限叠加。利用傅里叶变换算法直接测量原始信号,累加计算信号中不同正弦波信号的频率、幅度和相位来表示原始信号。其等价关系可表示为:

让我们看一下图像的傅立叶变换。上面的例子是一维信号的傅里叶变换,并且信号是连续的。我们知道图像是二维的、离散的。连续和离散都可以使用傅立叶进行变换。 ,那么在方向和方向上进行一维傅里叶变换就得到二维信号。我们来看一下二维傅里叶变换。通过对图像进行离散傅立叶变换来获得图像。那么一般公式就是:

其逆变换为

逆变换可以将频域图像恢复为时域图像。对于正变换分析,当u=v=0时,则:

这个公式f(x,y)就是图像在时域的灰度值。事实上,它是整个图像的灰度平均值。在计算中,灰度数字图像是每个像素仅具有一种采样颜色的图像。此类图像通常显示为从最深的黑色到最亮的白色的灰度,尽管理论上该样本可以是任何不同的颜色深浅,甚至可以是不同亮度下的不同颜色。灰度图像不同于黑白图像。在计算机图形学领域,黑白图像只有两种颜色:黑色和白色。灰度图像在黑白之间具有许多级别的颜色深度。那么 F(0,0) 称为频域中的直流分量,所有其他 F 称为交流分量。可以看出直流分量是在0处获得的,因此明显存在于低频分量之下。为了便于观察,我们常常使直流分量出现在窗口的中心。我们可以使用转置法。变换后中心为低频,向外为高频。

在分析图像信号的频率特性时,对于一幅图像,直流分量代表期望的平均灰度级,低频分量代表大背景区域和缓慢变化的部分,高频分量代表其边缘、细节、跳跃部分和颗粒噪声等。

盲水印原理

对于水印和原始图像,我们可以很容易地获得时域表示。为了使水印信息在频域尽可能均匀分布,引入随机变换对水印在时域进行变换,即

同时,我们对原始图像进行二维离散傅里叶变换

接下来我们介绍一下能量系数

通过频域合成水印和原始图像得到

然后通过逆变换,得到带有盲水印的图片(时域表示)

如果要解码水印,那么首先变换得到

 

然后减去原始图像的频域并进行随机变换的逆变换,得到水印的时域表示。

这就是图片盲水印的基本原理。

盲水印功能

水印对称性

因为 和 是共轭的,所以它们的实部应该相同。如果实部不同的话,逆变换必然会丢失虚部的一些信息(我们写图的时候只使用实部),考虑到我们要最大化的隐藏盲水印,所以我们的水印应该是对称的关于图像的中心。

匿名

由于我们在频域叠加时的一般策略是将水印信息尽可能随机地分布在原始图像频域的所有子信号上,因此逆变换回后的整体图像实际上没有太大差异时域。

加密

在前面推导盲水印的过程中,我们实际上是有一个密钥的,因为只有知道了原始图像,我们才能完成解码水印的过程。这相当于完​​成了一次简单的对称加密,也就是说,即使攻击者知道图片添加了盲水印。由于没有(和原始图片),盲水印无法删除或替换。

鲁棒性

有时攻击者可能会对图像进行一些处理,如裁剪、压缩等。由于盲水印在频域上分布了各个子信号的信息,因此可以有效地抵抗这些攻击。

蟒蛇练习

现在我们用和天网安图标来演示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('hetian.jpg',0) #直接读为灰度图像
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)#将图像中的低频部分移动到图像的中心
#取绝对值:将复数变化成实数
#取对数的目的为了将数据变化到较小的范围(比如0-255)
s1 = np.log(np.abs(f))
s2 = np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(s1,'gray'),plt.title('original')
plt.subplot(122),plt.imshow(s2,'gray'),plt.title('center')
plt.show()

运行结果如下:

将频域变换到时域的操作就是再次进行傅里叶逆变换(例如先分散,再逆变换)。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('hetian.jpg',0) #直接读为灰度图像
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#取绝对值:将复数变化成实数
#取对数的目的为了将数据变化到0-255
s1 = np.log(np.abs(fshift))
plt.subplot(131),plt.imshow(img,'gray'),plt.title('original')
plt.subplot(132),plt.imshow(s1,'gray'),plt.title('center')
# 逆变换
f1shift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f1shift)
#出来的是复数,无法显示,取绝对值
img_back = np.abs(img_back)
plt.subplot(133),plt.imshow(img_back,'gray'),plt.title('img back')

盲水印练习

现在我们已经了解了盲水印的基本原理,下面我们就开始练习吧。在CTF比赛中,遇到盲水印题时,我会使用github上的盲水印脚本。我们使用这个脚本进行盲水印加密和解密。

当前目录下有三个文件,分别是脚本文件、原图(hetian.png)和水印(flag.png)。

运行完生成hetin2.pngflag2.png

其中flag2.png可以很清楚的看到水印。

接下来我们探讨盲水印的隐藏。首先我们将和田的文字添加到hetian2.png中,如图:

然后进行盲水印解密

可以看到,解算处理后的水印变得模糊,但仍然可以清楚地看到水印的内容,说明盲水印的鲁棒性更强。

参考文章

python图像傅里叶变换https://blog.csdn.net/on2way/article/details/46981825​​​​​​​
从傅里叶变换到盲水印https://zhuanlan.zhihu.com/p/33526455​​​​​​
傅里叶分析之掐死教程(完整版)https://zhuanlan.zhihu.com/p/19763358

CTF-Stegano 练习隐写术 8

实验主要介绍CTF-Stegano隐写技术。通过本实验的学习,您可以了解CTF比赛中的图像隐写题,学会通过StegSolve分析bmp图像,学会通过编写Python脚本实现图像隐写分析。

. . .

相关推荐

额外说明

java教程——电商秒杀系统实战&&集成环境mybatis&springboot

QQ 1285575001 Wechat M010527 技术交流 QQ群599020441 纪年科技aming 添加依赖 打开POM 注意版本问题 在 application.properties 配置 下划线变驼峰 延时 接口xml配置文件 在 sr

额外说明

Bug 27092508 - Flashback Queries Fails with ORA-08181 Due to Corrupted Timestamp Mappings

Bug 27092508  Flashback Queries Fails with ORA-08181 and/or ORA-01466 Due to Corrupted Timestamp Mappings in SYS.SMON_SCN_TIME

额外说明

Android DDMS Dump View Hierarchy 调试界面环境搭建

Android DDMS Dump View Hierarchy 调试界面环境搭建 sdk/tools/monitor.bat 双击打开,点击 Dump View Hierarchy 抓取ui界面 jdk环境版本要为jdk8左右的,比较新的jdk环境,

额外说明

jnativehook 简介、中文文档、中英对照文档 下载

jnativehook 文档 下载链接(含jar包、源码、pom) 组件名称 中文-文档-下载链接 中英对照-文档-下载链接 jnativehook-2.1.0.jar jnativehook-2.1.0-API文档-中文版.zip jnativehoo

额外说明

【Go 基础篇】Go语言日期与时间函数详解:时间的掌控与转化

Go语言是一种快速、简洁且高效的编程语言,它在处理日期与时间方面提供了丰富的标准库函数。本文将详细介绍Go语言中处理日期与时间的函数,涵盖常用的日期时间操作、格式化、时区转换等内容,并介绍time.Time结构体中的相关方法。 时间的表示与获取 在Go语

额外说明

Power BI 傻瓜入门 18. 让您的数据熠熠生辉

本章内容包括: 配置Power BI以使数据增量刷新 发现使用Power BI Desktop and Services保护数据集的方法 在不影响性能和完整性的情况下管理海量数据集 如果有更新的、更相关的数据可用,旧数据对组织没有好处。而且,老实说,如果

额外说明

【Jenkins】linux & win 10 :Jenkins + maven/ant + git/SVN 搭建项目自动化集成部署环境

目录 一、完成jdk的安装 二、完成git/svn的安装 三、完成maven/ant的安装 四、完成Jenkins的安装  五、Jenkins初始登录、设置账户和访问URL 六、管理员账户权限配置 ​七、配置jdk、git/svn、maven/ant的根

额外说明

【蓝桥杯基础题】2020年省赛填空题-回文日期

-栏目内容:蓝桥杯问题的解决方案 子夜的星的主页 -座右铭:前面的路并不远,一直走下去 目录 一、问题背景2. 主题说明 1.问题描述2.输入格式3.输出格式4. 一个例子5. 评估用例规模和惯例 三、主题分析 1.获取位数2. 回文检查 检查第一个回文

额外说明

VMware虚拟机安装win10系统教程

在执行本教程之前,请先阅读以下两篇文章以完成环境准备: 1.VMware虚拟机下载安装教程【详细步骤 - 图文结合】 VMware虚拟机下载安装教程【详细步骤-图文结合】_西津No1的博客 - CSDN博客 2.如何在微软官网下载win10镜像文件 如何

额外说明

在VS2010及更新版本的VS系列编译器中使用C语言的不安全库函数时出现C4996(警告或错误)的解决方案

演示代码: #include <stdio.h> int main(void) { int n; scanf("%d", &n); return 0; } 提示内容: 将上述演示代码放入VS2010及更新版本的VS系列编译器中。编译后, 警告 C499

ads via 小工具