💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
1. 引言
本文旨在实现一种数据隐藏嵌入加密图像中的方案,该方案由上海大学的教授 Ximpeng Zhang 提出。
2. 论文
2.1 引言
该论文 [1] 提出了一种方法,通过修改未压缩但已加密的图像的小部分来嵌入数据,采用流密码进行加密。使用解密密钥解密图像后,得到的图像与原始图像相似。根据数据隐藏密钥进行解密时,借助自然图像中的空间相关性,可以恢复数据和图像。
这种方法在医疗、军事等领域可能会非常有用,这些领域需要加密图像并随后向其中添加数据,而不考虑图像的内容。在稍后的时间里,数据库管理员可能需要直接在图像中添加患者信息,而不引入与解密图像和原始图像之间的差异。
2.2 提出的方案
原始未压缩图像使用加密密钥进行加密,然后利用另一把密钥添加数据,与原始数据的内容无关。接收方使用加密密钥解密图像,从而获得一幅与原始图像相似的图像,随后提取使用第二把密钥添加的数据,并获得原始图像。
图像加密通过对每个像素的单个比特进行异或(XOR)操作实现(图像深度为8位 - 值范围为[0, 255]),并使用从流密码生成的伪随机比特串。加密的安全性将依赖于流密码的安全性。
加密图像随后被分成不重叠的块 sxs。每个块用于携带一个附加的信息比特。因此,使用数据隐藏密钥,一个块(包含 s² 个像素)被伪随机地划分为两个集合:S0 和 S1(在不知道密钥的情况下,一个比特以约 ½ 的概率属于 S0 或 S1)。如果要添加的比特为 0,则翻转(取反)S0 中像素的 3 个最低有效位;否则,翻转 S1 中的像素。其他比特不被修改。
当接收方收到带有隐藏数据的加密图像时,首先可以使用相同的流密码(以及相同的加密密码)进行解密,只需逐位进行异或操作。这样可以得到一幅与原始图像非常相似(但由于内部隐藏比特的原因并不完全相同)的图像。实际上,计算原始图像与解密图像之间的峰值信噪比(PSNR)将得到 37.9 dB 的值,证实肉眼无法察觉差异。
此时可以提取数据,通过第二把密钥确定每个块中属于 S0 的像素和属于 S1 的像素,并在 H0 中翻转第一个集合的 LSB,以及在 H1 中翻转属于第二个集合的 LSB。
为了确定 H0 和 H1 哪一个是原始块,利用空间相关性。特别是,提出了一种波动函数的定义:
“波动较小的块将是原始块,另一个将是翻转像素的块。因此,如果原始块是 H0,插入的位是 0, 否则就是 1。我们由此获得了每个块中插入的位和原始块,以重建原始图像。”
2.3 结果
由邢鹏张教授进行的实验是在著名的 512x512 像素的 Lena 图像上进行的。每个块的尺寸为 32x32。计算得到的 PSNR 确认了理论数据。如果块的尺寸小于 32x32,则由于波动减少会引入提取错误。图像越平滑,性能越好。通过对 LSB 的隐写分析,可以检测到隐藏位的存在,但无法在没有密码的情况下恢复隐藏数据。全部文章见第4部分。
📚2 运行结果
部分代码:
function bit=trivium(n,Key)
% Expresar los arrays sin comas! (es lo mismo...)
Key= [1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
IV=[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
Comp_A = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
Comp_B = [0, 0, 0, 0];
%n = 12;
output_array = [];
%n = str2num(n);
%Convierto la clave pasaada como argumento desde java en binario (primero
%cada char en su representaci髇 decimal en ASCII y luego en binario)
%long=length(Key_string)
%for i= 1:long
% binary=dec2bin('i',8);
% Keys= [Keys binary];
%end
%Key=Keys
% Armo los shifter concatenandoles los complementos
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%2.2 Key and IV setup
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
shifter_A=cat(2,Key, Comp_A);
shifter_B=cat(2,IV, Comp_B);
shifter_C=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1];
shifter_A_aux=shifter_A;
shifter_B_aux=shifter_B;
shifter_C_aux=shifter_C;
%bitxor(Key,IV)
%length(shifter_A)
%length(shifter_B)
%length(shifter_C)
%NOTA: El primer elemento en un array en matlab es el 1 (a diferencia de bash que es el 0)
%
tic;
for i = 1:(4*288)
s=cat(2,shifter_A_aux, shifter_B_aux, shifter_C_aux);
t1 = bitxor((bitxor((bitxor(s(66),(bitand(s(91),s(92))))),s(93))),s(171));
t2 = bitxor((bitxor((bitxor((bitand(s(175),s(176))),s(162))),s(177))),s(264));
t3 = bitxor((bitxor((bitxor((bitand(s(286),s(287))),s(243))),s(288))),s(69));
shifter_A_aux = [ t3 shifter_A_aux(1:end-1) ];
shifter_B_aux = [ t1 shifter_B_aux(1:end-1) ];
shifter_C_aux = [ t2 shifter_C_aux(1:end-1) ];
end
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%2.1 Key stream generation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%shifter_A = [0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1]
%shifter_B = [0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1]
%shifter_C = [1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1]
%output_array = zeros(1, n);
for i = 1:(n)
s=cat(2,shifter_A_aux, shifter_B_aux, shifter_C_aux);
t1 = bitxor(s(66),s(93));
t2 = bitxor(s(162),s(177));
t3 = bitxor(s(243),s(288));
zi = bitxor((bitxor(t1,t2)),t3);
output_array(end+1) = zi;
t1 = bitxor((bitxor((bitand(s(91),s(92))),s(171))),t1);
t2 = bitxor((bitxor((bitand(s(175),s(176))),s(264))),t2);
t3 = bitxor((bitxor((bitand(s(286),s(287))),s(69))),t3);
shifter_A_aux = [ t3 shifter_A_aux(1:end-1) ];
shifter_B_aux = [ t1 shifter_B_aux(1:end-1) ];
shifter_C_aux = [ t2 shifter_C_aux(1:end-1) ];
end
%disp(output_array)
%fprintf('%g\t\n',output_array)
fprintf('%d',output_array)
time = toc;
disp(time)
%h=histogram(output_array)
bit = output_array;
end
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
[1] Paper: Zhang, Xinpeng. (2011). Reversible Data Hiding in Encrypted Image. Signal
Processing Letters, IEEE. 18. 255 - 258. 10.1109/LSP.2011.2114651.
🌈4 Matlab代码、文档下载
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取