信息隐藏的概念和原理
概念
在可以公开的多媒体中以不可察觉的形式隐藏秘密信息的技术
信息隐藏的安全性取决于:第三方有没有能力将载体对象和==伪装对象==区别开来
信息隐藏的可能性: 数据冗余
原理
信息隐藏的分类以及性能指标
分类
-
隐写
- 以传输秘密信息为目的(注重信息的不可察觉和不可感知性,要求有一定的容量,一般不考虑鲁棒性)
- 载体只是起到伪装作用,没有其他使用价值
-
数字水印
- 以保护载体图像为目的
- 载体有利用价值
-
区别
性能指标
-
鲁棒性(稳健性): 指隐藏的秘密信息抵抗各种==信号处理==和==攻击==的能力。
- 常见的信号处理:低通滤波、二次抽样、二次量化、图像增强、插值、A/D 和 D/A 转换、打印等
- 数据压缩,JPEG/MPEG/MP3
- 噪声干扰
- 几何变换和几何失真:如裁剪、尺度拉伸、平移、选择等
-
透明性(不可感知性): 指嵌入的秘密信息导致隐写载体信号质量变化的程度。
-
隐藏的容量: 隐藏秘密信息的容量指在单位时间或一幅作品中能嵌入信息的比特数。
- 图像:嵌入此图像的所有比特数
- 音频:一秒传输过程中嵌入的比特数
- 视频:一帧或者一秒内嵌入的比特数
信息隐藏与密码学技术的差别
-
密码学
- 密文是不可懂的乱码
- 秘密信息不可懂
-
信息隐藏
- 载体和隐写/水印载体类似(肉眼无法分别)
- 秘密信息不可见
图像质量评价
-
主观评价
-
方法
-
平均意见分,MOS(Mean Opinion Score)
观察者根据一些事先规定的评价尺度或自己的经验判断测试图像的视觉效果质量。
所有观察者给出的分数进行加权平均。
-
-
优缺点
-
优点:
- 比较准确
-
缺点:
- 受观察者的知识背景、情绪和疲劳程度等因素的影响
- 可重复性较差
-
-
-
客观评价
处理和分析系统中输入和输出的==图像信号==,提取==图像特征参量==作为研究分析对象,比较特征参量,以此反映图像间的差别。
-
方法
-
均方误差(MSE,Mean Square Error)
- 公式:MSE=\frac{1}{NM}\sum_{i=0}^{N-1}{\sum_{j=0}^{M-1}{(x[i,j]-y[i,j])^2}}
-
平均绝对误差(MAE,Mean Absolute Error)
-
峰值信噪比(PSNR,Peak Signal to Noise Ratio)
-
公式:PSNR=10lg(\frac{x^2_{Max}[i,j]}{MSE})
-
评价依据(PSNR 值==越大越好==):
PSNR 值 评价 高于 40dB 说明图像质量极好(即非常接近原始图像) 30~40dB 通常表示图像质量是好的(即失真可以察觉但可以接受) 20~30dB 说明图像质量差 低于 20dB 图像质量不可接受 -
优缺点
-
优点:
- 使用方便
- 可重复性强
-
缺点:
- 评价结果与主观感觉有时存在不一致
-
-
例题:
已知原始图像部分像素如下:
x[i,j]= \begin{bmatrix} 10 & 12 & 14\\ 8 & 6 & 8\\ \end{bmatrix}隐藏信息后,该图像响应像素值变化为:
y[i,j]= \begin{bmatrix} 11 & 11 & 14\\ 9 & 8 & 6\\ \end{bmatrix}解:
-
计算均方误差 MSE,由公式得:
\begin{align} MSE & = \frac{1}{NM}\sum_{i=0}^{N-1}{\sum_{j=0}^{M-1}{(x[i,j]-y[i,j])^2}}\\ & = \frac{1}{2 \times 3}\sum_{i=0}^{1}{\sum_{j=0}^{2}{(x[i,j]-y[i,j])^2}}\\ & = \frac{1}{6} \times [(11-10)^2+ \dots +(6-8)^2]\\ & \approx 1.83 \end{align} -
计算 PSNR,以灰度图考虑,最大像素值为 255,则:
\begin{align} PSNR & = 10lg(\frac{x^2_{Max}[i,j]}{MSE})\\ & = 10lg(\frac{255^2}{1.83})\\ & \approx 45.50dB \end{align}
-
-
-
-
基于时域替换技术的图像信息隐藏
8x8 的图像,64 个像素点,每个像素点的取值为 0~255。图中每一个横截面代表一个位平面。第一个位平面由每一个像素最低比特位组成,第八个位平面由每一个像素的最高比特位组成。
LSB 算法
图像的低位权比特平面,即,由像素较低有效位组成的平面,对视觉影响较小,可将其替换为秘密信息。
接收方提取相同的比特平面就可以获取秘密信息。
为增强安全性,收发双方也可协商密钥。发方使用密钥将像素位置置乱后,再隐藏信息。
-
LSB 算法嵌入步骤
-
将原始载体图像的空域像素值由十进制转换到二进制表示
-
用二进制秘密信息中的每一比特信息替换与之相对应的载体数据的最低有效位,假设待嵌入的二进制秘密信息序列为(0,1,1,0,0,0,1,0,0),则替换过程如图
-
将得到的含秘密信息的二进制数据转换为十进制像素值,从而获得含秘密信息的图像,如图所示
-
嵌入算法
function embed_image = lsb_embed(cover_object,message,length) embed_message = reshape(message,[1,length]; %重排秘密信息 [Mc,Nc] = size(cover_object); %Mc图像的行数,Nc图像的列数 embed_image = cover_object; %读取图像 k = 1; for i=1 : Mc for j=1 : Nc embed_image(i,j) = bitset(cover_object(i,j),1,0) %最后一个bit位设置为0 + embed_message(k); if k == length break; else k = k+1; end end end
-
-
LSB 算法提取步骤
- 将得到的隐藏有秘密信息的十进制像素值转换为二进制数据
- 将二进制数据的最低有效位提取出来,即为秘密信息序列(0,1,1,0,0,0,1,0,0,)
-
提取算法
function extract_message = lsb_exteact(embed_image,length) [Mc,Nc] = size(embed_image); extract_message = zeros(1,length); k = 1; for i = 1:Mc for j = 1:Nc extract_message(k) = mod(embed_image(i,j),2); %模2得到最后一位bit if k == length break; else k = k+1; end end end
-
LSB 算法的实现
clc %清屏 clear %清空变量 close all %关闭已打开图像 %读入载体图像,并显示 cover_object = imread('Lena.bmp'); if ndims(cover_object) == 3 %如果是RGB图像,转为灰度图像 cover_object = rgb2gray(cover_object); end %读入嵌入信息(嵌入的信息为图片) message = imread('message.bmp'); if ndims(message) == 3 %如果是RGB图像,转为灰度图像 message = rgb2gray(message); end message = double(im2bw(message));%转换为bit信息流,以便嵌入 [Mm,Nm] = size(message); length = Mm * Nm; %调用函数lsb_embed实现信息嵌入 embed_image = lsb_embed(cover_object,message,length); %调用函数lsb_extract实现信息提取 extract_message = lsb_extract(embed_image,length); extract_message = reshape(extract_message,[Mm,Nm]); %重排秘密信息为[Mm,Nm]矩阵 %结果展示 figure; subplot(2,2,1);imshow(cover_object);title('原始载体图像'); subplot(2,2,2);imshow(uint8(message*255));title('嵌入信息'); %将0、1比特流信息转换为0和255,变成黑白图像 subplot(2,2,3);imshow(uint8(embed_image));title('嵌入信息后图像'); subplot(2,2,4);imshow(uint8(extract_message*255));title('提取信息');
-
基于密钥的信息置乱
message = [1,0,0,0,1,1,0,1,0,1]; length = size(message,2); %message的长度为1x10,使用size获取其第二维度(列数),即长度 key = 1; RandStream.setGlobalStream(RandStream('mt19937ar','seed',key)); % 'mt19937ar' 指定随机数生成器的类型 % 'seed' 表示使用种子生成随机数 % key 为生成随机数的种子 % RandStream() 创建一个随机数流 % RandStream.setGlobalStream() 将创建的随机数流对象设置为当前全局随机数流,便于后续计算中使用 randIndex = randperm(length); %生成一个从1到length的随机置乱的整数序列 message_s = message(randIndex); %将秘密信息置乱 message_r(randIndex) = message_s(:); %恢复原始秘密信息 disp(message); %原始秘密信息 disp(message_s); %置乱后秘密信息 disp(message_r); %恢复后秘密信息
基于变换域技术的图像信息隐藏
最低比特位隐藏方法属于在噪声信号中隐藏信息,其稳健性不强。
变换域隐藏技术将信息隐藏在载体的重要部位,只要载体不被破坏到无法使用的程度,隐藏的信息都能保留。
-
常用的变换域方法
- 离散余弦变换(DCT)
- 离散小波变换(DWT)
- 离散傅里叶变换(DFT)
-
基于扩频思想的数字水印的一般模型
-
水印可以嵌入到 DCT、DWT、DFT 等系数上
-
嵌入是通过修改系数实现的,系数修改方式可使用下列任一表达式
-
水印为非盲提取
检测方式分类1
-
-
嵌入方法
-
方法一:每个系数上嵌入的强度相同
嵌入强度一定时:若系数幅值较大,嵌入信息易受破坏;若系数幅值较小,嵌入对系数修改大
-
方法二 : 根据系数的大小,成比例地嵌入
-
-
DCT 水印算法
DCT 又称离散余弦变换。因为图像像素间存在较大的空间相关性,DCT 可以大大减小这些相关性,使图像能量集中在左上角区域,从而利于数据压缩。变换后得到的数据成为 DCT 系数。这一过程是无损的。
-
DCT 变换
DCT 变换将图像分解为 8x8 的块,对每个块进行变换。变换后,
- 左上角的为低频系数,包含了图像中的主要能量,人眼对这些低频细节敏感度较高。左上角第一个系数为直流系数(DC coefficient),包含块的平均亮度信息。而其余的系数为交流系数(AC coefficient),包含了更多的细节和边缘信息。
- 右下角的为高频系数,包含图像中的细节部分,人眼对这些敏感度较低,因此可以在高频系数进行改变。
将变换后的块进行传输,还要使用之型扫描将其转换为一维排列方式。之型扫描后,这些低频系数集中于一维排列数组的前部,后面跟着长串的量化为零的 DCT 系数。
-
相关代码
cover_object = imread('Lena.bmp'); if ndims(cover_object) == 3 cover_object = rgb2gray(cover_object); end dct_coeff = dct2(cover_object); %进行DCT变换 dct_zigzag = zigzag(dct_coeff,0); %将二维DCT系数按照之型排列为一维 %修改dct_zigzag的前N个系数完成信息嵌入(略) dct_reco = zigzag(dct_zigzag',1); %使用zigzag函数的逆操作,将修改后的系数重新排列为二维矩阵 cover_object_R = idct2(dct_reco); %使用DCT逆变换恢复图像 figure; subplot(2,2,1);imshow(cover_object);title('原始载体图像'); subplot(2,2,2);imshow(uint8(cover_object_R));title('嵌入信息后的图像');
-
JPEG 压缩
在 JPEG 压缩中,为了在图像画面降质不明显的前提下获得较高的压缩比,保留的恰是对人眼视觉重要的低频系数,而将大部分高频系数变成了零。
JPEG 压缩对低频系数不敏感,而对高频系数敏感,将信息数据嵌入在高频部分可能在==有损压缩==中丢失。作为一种权衡,可以将信息嵌入在图像的中频系数之间。
-
数字水印
信息隐藏的分类
-
隐写
- 以传输秘密信息为目的(注重信息的不可察觉和不可感知性,要求有一定的容量,一般不考虑鲁棒性)
- 载体只是起到伪装作用,没有其他使用价值
-
数字水印
- 以保护载体图像为目的
- 载体有利用价值
-
区别
数字水印的应用领域
- 版权保护
- 数字指纹
- 认证和完整性校验
- 内容标识和隐藏标识
- 使用控制
- 内容保护
- 安全不可见
数字水印分类
-
按载体分类: 图像水印、视频水印、音频水印、软件水印、文档水印、数据水印
-
按可逆性分类: 可逆水印、不可逆水印
-
按可见性分类: 不可见水印、可见水印
-
按检测方式分类:
-
非盲检测
需要使用原始的无水印媒体作为参考
-
盲检测
不需要原始媒体,仅从已嵌入水印媒体中提取水印
-
半盲检测
不需要原始媒体,但需要额外的信息或参数,如生成水印的密钥、水印嵌入的位置等。
-
-
按鲁棒性分类:
-
鲁棒水印
用来证实数据的所有权。被嵌入的水印可以是一段文字、标识、序列号等,并且通常水印不可见或不可察,与原始数据(如图像、音频、视频数据)紧密结合并隐藏其中,并且可以经历一些不破坏源数据使用价值或商用价值的操作而==能保存下来==。
-
脆弱水印
用于取证数字作品是否完整。要求对载体图像的微小处理就会改变或毁掉其加载的脆弱水印。
算法基本思想为:将图像划分为互不相交的图像块,认证水印信息通过空域算法分别嵌入到每个图像块中。图像子块的认证等价为判断==图像子块==中所隐藏的认证==信息是否改变==。
-
半脆弱水印
用于识别不合理失真和合理失真。对==恶意篡改攻击脆弱==,以检测图像的恶意篡改;对==非恶意篡改攻击(如信号处理)鲁棒==。适用于多媒体内容的认证和恢复
-
感知哈希
感知哈希是指一个多媒体对象的感知特征通过压缩生成的简短摘要,将多媒体对象映射到很短的位串。(多对一映射)
-
特点
- 对“不改变内容的保持操作”鲁棒,而对“内容篡改”敏感
- 具有==相同内容且不同数字化表示==的多媒体对象具有==相同的感知哈希==
-
与密码学哈希区别
密码学哈希 感知哈希 概念 传统密码学中的哈希如 MD5、SHA1 等将任意数据通过一个函数转换成长度固定的数据串(通常用 16 进制字符串表示)(一一映射) 感知哈希是指指一个多媒体对象的感知特征通过压缩生成的简短摘要,将多媒体对象映射到很短的位串。(多对一映射) 特点 对于输入特征非常敏感,对原数据进行任何改动,所得到的 MD5 值都有很大区别 对“不改变内容的保持操作”鲁棒,而对“内容篡改”敏感 用途 验证信息完整性,文件或数据识别,密码认证 基于内容的图像检索,图像验证
隐写与隐写分析
隐写
以表面正常的数字载体(如静止图像、数字音频和视频信号等)作为掩护,在其中隐藏秘密信息。额外数据的嵌入既不改变载体信号的视听觉效果,也不改变计算机文件的大小和格式(包括文件头),使隐蔽信息能以不为人知的方式进行传输。
隐写分析
指在已知或未知嵌入算法的情况下,从观察到的数据检测判断其中是否存在秘密信息,分析数据量的大小和数据嵌入的位置,并最终破解嵌入内容的过程。
-
隐写
-
LSB 隐写
将秘密信息写到载体图像最低位平面上。容量大、嵌入速度快、对载体图像质量影响小。
-
JPEG 隐写
-
-
按检测方式分类:
-
非盲检测
需要使用原始的无水印媒体作为参考
-
盲检测
不需要原始媒体,仅从已嵌入水印媒体中提取水印
-
半盲检测
不需要原始媒体,但需要额外的信息或参数,如生成水印的密钥、水印嵌入的位置等。 ↩
-
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于