隐写术
基本概念
隐写术(Steganography)是一门关于隐藏信息存在的科学与艺术,其名称源于希腊语"steganos"(隐藏)和"graphein"(书写)。与加密技术不同,隐写术的核心目标不是让信息变得不可读,而是隐藏信息的存在本身,使未经授权者无法察觉秘密通信的发生。其本质是信息论与编码理论在安全领域的延伸应用
加密、隐写与数字水印的区别
对比维度 | 加密 (Encryption) | 隐写 (Steganography) | 数字水印 (Digital Watermarking) |
---|---|---|---|
核心目标 | 保护信息内容安全 | 隐藏信息存在本身 | 证明载体所有权/完整性 |
保护对象 | 信息内容 | 信息存在性 | 载体作品的归属权 |
输出形式 | 不可读的密文 | 看似正常的载体 | 外观不变的载体 |
可见性 | 明显可见(乱码形式) | 完全不可见 | 不可见/可见(版权标识) |
典型载体 | 任意数字数据 | 图像/音频/视频 | 多媒体/文档/3D模型 |
主要攻击类型 | 暴力破解/密码分析 | 统计检测/隐写分析 | 去除攻击/几何攻击 |
信息恢复 | 解密后完全恢复 | 提取隐藏内容 | 检测水印存在/提取标识 |
应用场景 | 安全通信 | 隐蔽通信 | 版权保护 |
信息论基础 | 香农保密系统理论 | 信息隐藏容量理论 | 率失真理论 |
隐写术信息嵌入与提取流程
LSB的原理
基本概念
LSB(Least Significant Bit,最低有效位)隐写术是一种基于空间域的数字隐写技术。其核心原理是利用数字图像像素值的最低有效位对人眼视觉感知影响最小的特性。在灰度图像中,我们通过对像素的灰度值中的LSB进行修改并嵌入二进制隐藏信息,修改后的图像在视觉效果上的影响微乎其微,但却可以隐藏各种信息。基于LSB的数据隐藏技术的数学说明可以定义为:
A′=A−A mod 2n+d
A'= A - A\,\, \mathrm{mod}\,\, 2^n + d
A′=A−Amod2n+d
其中 AAA 和 A′A'A′ 指定覆盖图像和隐写图像的像素值,nnn 指定比特替换的数量,ddd 为待隐藏一位的二进制数。消息提取只需从像素中提取最后n位的LSB即可。提取过程的数学表示为:
d=A′ mod 2n
d = A'\,\, \mathrm{mod}\,\, 2^n
d=A′mod2n
LSB算法流程
隐写质量评价指标
- 峰值信噪比
PSNR(峰值信噪比,Peak Signal-to-Noise Ratio),用于衡量两张图像之间差异,例如压缩图像与原始图像,评估压缩图像质量。
PSNR=10×lg(MaxValue2MSE)
\mathrm{PSNR} = 10 \times lg(\frac{\mathrm{MaxValue}^2}{\mathrm{MSE}})
PSNR=10×lg(MSEMaxValue2)
其中,MSE\mathrm{MSE}MSE 为两张图像的均方误差,MaxValue\mathrm{MaxValue}MaxValue 为图像像素可取到的最大值,例如 8 位图像为 28−1=2552^8 - 1= 25528−1=255。PSNR 最小值为 0,PSNR 越大,两张图像差异越小;PSNR 计算简单,物理意义清晰。但是,这种基于 MSE 的评价指标并不能很好的按人眼的感受来衡量两张图像的相似度。
- 结构相似性
SSIM(结构相似性,Structural Similarity Index Metric)基于人眼会提取图像中结构化信息的假设,比传统方式更符合人眼视觉感知。
SSIM(x,y)=[l(x,y)]α⋅[c(x,y)]β⋅[s(x,y)]γ
\mathrm{SSIM}(x,y)=[l(x,y)]^\alpha \cdot[c(x,y)]^\beta \cdot[s(x,y)]^\gamma
SSIM(x,y)=[l(x,y)]α⋅[c(x,y)]β⋅[s(x,y)]γ
SSIM由三部分组成,α,β,γ>0\alpha,\beta,\gamma \gt 0α,β,γ>0,用于调整权重
l(x,y)=2μxμy+C1μx2+μy2+C1→亮度c(x,y)=2σxσy+C2σx2+σy2+C2→对比度s(x,y)=σxy+C3σxσy+C3→结构
\begin{align*}
l(x,y) &= \frac{2\mu_x\mu_y+C_1}{\mu^2_x + \mu^2_y + C_1} \rightarrow 亮度 \\
c(x,y) &= \frac{2\sigma_x\sigma_y+C_2}{\sigma^2_x + \sigma^2_y + C_2} \rightarrow 对比度 \\
s(x,y) &= \frac{\sigma_{xy}+C_3}{\sigma_x\sigma_y+C_3} \rightarrow 结构
\end{align*}
l(x,y)c(x,y)s(x,y)=μx2+μy2+C12μxμy+C1→亮度=σx2+σy2+C22σxσy+C2→对比度=σxσy+C3σxy+C3→结构
SSIM≤1\mathrm{SSIM}≤1SSIM≤1,SSIM\mathrm{SSIM}SSIM 越大,两张图像越相似。
基于MATLAB进行试验
- 实现嵌入函数
function stego_image = LSB_embed(cover_image, secret_msg)
num_msg = unicode2native(secret_msg, 'UTF-8');
bin_msg = '';
for i = 1:length(num_msg)
bin_msg = [bin_msg, dec2bin(num_msg(i), 8)];
end
bin_msg = [bin_msg '1111111111111110']; % 添加结束标记
[h, w, ~] = size(cover_image);
total_bits = h * w;
if length(bin_msg) > total_bits
error('信息量超过图像容量');
end
% LSB嵌入
stego_image = cover_image;
bin_idx = 1;
for i = 1:h
for j = 1:w
if bin_idx <= length(bin_msg)
stego_image(i, j) = bitset(stego_image(i, j), 1, str2double(bin_msg(bin_idx)));
bin_idx = bin_idx + 1;
end
end
end
end
- 实现提取函数
function extract_msg = LSB_extract(stego_image)
[h, w, ~] = size(stego_image);
lsb_bits = zeros(1, h * w);
idx = 1;
for i = 1:h
for j = 1:w
lsb_bits(idx) = bitget(stego_image(i, j), 1);
idx = idx + 1;
end
end
bin_str = num2str(lsb_bits);
bin_str = bin_str(bin_str ~= ' ');
% 查找结束标记
end_idx = strfind(bin_str, '1111111111111110');
if isempty(end_idx)
error('未检测到结束标记');
end
bin_data = bin_str(1:end_idx(1)-1);
num_bytes = length(bin_data)/8;
if mod(num_bytes,1) ~= 0
error('二进制数据长度不是8的倍数');
end
byte_array = zeros(1, num_bytes, 'uint8');
for i = 1:num_bytes
byte_array(i) = bin2dec(bin_data(8*(i-1)+1:8*i));
end
% UTF-8解码
extract_msg = native2unicode(byte_array, 'UTF-8');
end
- 图像质量评价函数
function ssim_val = ssim(cover_image, stego_image)
C_1 = 0.01 * 255;
C_2 = 0.03 * 255;
C_3 = C_2 / 2;
avg_cover = mean(cover_image(:));
avg_stego = mean(stego_image(:));
var_cover = var(double(cover_image(:)));
var_stego = var(double(stego_image(:)));
cov_total = cov(double(cover_image(:)), double(stego_image(:)));
cov_single = cov_total(1,2);
luminance_val = (2*avg_stego*avg_cover + C_1)/(avg_cover^2 + avg_stego^2 + C_1);
contrast_val = (2*var_stego*var_cover + C_2)/(var_stego + var_cover + C_2);
construct_val = (cov_single + C_3)/(var_stego*var_cover + C_3);
ssim_val = luminance_val*construct_val*contrast_val;
end
function [psnr, ssim_val] = LSB_quality(orig, stego)
% PSNR计算
mse = mean((orig(:)-stego(:)).^2);
psnr = 10*log10(255^2/mse);
% SSIM计算
ssim_val = ssim(orig, stego);
end
- 测试代码
cover_image = imread("img\logo.png");
imwrite(cover_image, "img\cover_image.png");
stego_image = LSB_embed(cover_image, "至诚至坚,博学笃行");
imwrite(stego_image, "img\stego_image.png");
extract_msg = LSB_extract(stego_image);
disp(extract_msg)
[psnr_val, ssim_val] = LSB_quality(cover_image, stego_image);
disp(psnr_val)
disp(ssim_val)
最终得出提取信息:至诚至坚,博学笃行
隐写评价质量:
-
PSNR=∞\mathrm{PSNR}= \infinPSNR=∞
-
SSIM=0.9999\mathrm{SSIM}= 0.9999SSIM=0.9999
- 检查图像



可以发现载体图像和隐写图像人眼几乎无法区别。
总结
本实验系统验证了LSB隐写技术在数字图像中的应用效能。通过将文本信息"至诚至坚,博学笃行"嵌入灰度图像的最低有效位,实现了信息存在的完美隐蔽性。LSB技术以零视觉代价完成信息隐藏,为信息安全领域提供了轻量化解决方案;后续可结合加密算法增强抗隐写分析能力,进一步提升实用安全性。
参考文献
[1] Pratap Chandra Mandal a,b, Imon Mukherjee b,* , Goutam Paul c, B.N. Chatterji a,d .Digital image steganography: A literature survey. 2022