一、隐写技术
1、概述
隐写术是一种将秘密信息隐藏在另一个文档或图像中并由不同的人提取的技术。我们将了解如何在原始图像的修改不被察觉的情况下将文本消息或图像隐藏在图像中。
2、流程简述
(1)有这样一个矩阵
(2)使用"de2bi"方法转为二进制格式
de2bi方法默认采用right MSB顺序。
(3)'A'和'h'对应的数值分别为65和104
65的二进制表示
替换矩阵中部分LSB位。
(4)同样处理h,104
(5)最终的矩阵变为
二、matlab示例 隐藏文字消息
1、加密代码
要加密的字符串为“this is a matlab demo, if this lenght small”,加密后的图片保存为Encrypt1.png。注意消息的长度和图像的大小的匹配,不能太短也不能太长。
%ENCRYPTION
clear all
%READ THE INPUT IMAGE
A = imread('图片/cameraman.tif');
%
Output = A;
%MESSAGE TO BE HIDDEN INSIDE THE IMAGE
Str = 'this is a matlab demo, if this lenght small';
%NUMBER OF CHARACTERS IN THE MESSAGE
numLetters = numel(Str);
%REPRESENT THE LENGTH OF THE MESSAGE IN BINARY FORMAT
Bi_Total = de2bi(numLetters,8);
Bi_Msg = de2bi(double(Str),8)';
Encrypt_msg = Bi_Msg(:)';
%FIND THE LENGTH OF THE MESSAGE IN THE BINARY FORMAT
num_En_msg = numel(Encrypt_msg);
%DEFINE THE INTERVAL BETWEEN EACH VALUE
dt=floor(numel(A)/num_En_msg);
%BINARY VALUE OF THE INTERVAL
Bi_dt = de2bi(dt,8);
% FIRST 8 BITS - INTERVAL
% SECOND 8 BITS - TOTAL LENGTH OF THE BINARY VALUES
Info_data = [Bi_dt,Bi_Total];
Output(1:16) = bitset(A(1:16),1,Info_data);
%REPLACE THE LEAST SIGNIFICANT BIT IN THE IMAGE
Start_pt =17;
End_pt = (num_En_msg*dt)+16;
Output(Start_pt:dt:End_pt) = bitset(A(Start_pt:dt:End_pt),1,Encrypt_msg);
figure,subplot(121),imshow(A);title('Original Image');
subplot(122),imshow(Output);title('Image with the hidden message');
%SHOW THE DIFFERENCE BETWEEN THE ORIGINAL AND THE ENCRYPTED IMAGE
figure,imagesc(double(A)-double(Output));colormap(jet);colorbar;
%WRITE THE ENCRYPTED IMAGE IN THE PNG FORMAT
imwrite(Output,'Encrypt1.png');
display('Message is hidden inside the image!');
通过将消息转换为二进制格式并将其放置在图像像素的最低有效位中,将消息隐藏在图像中。加密图像保存为“PNG”图像文件,以便进行无损压缩。使用无损压缩技术,像素值不会改变,因此嵌入在 LSB 中的信息不会丢失。
原始图像和加密图像之间的最大绝对值差为 1。因为我们只处理图像的 LSB 位。
我们可以将秘密消息的位以特定的模式或以规则的间隔放置,而不是替换彼此相邻的像素。下图表明这些位以特定的间隔值放置。
2、解密代码
%DECRYPT THE MESSAGE
clear all
clc
%READ THE ENCRYPTED IMAGE
A = imread('Encrypt1.png');
%FIRST 8 BITS REPRESENT THE INTERVAL
Dt = bitget(A(1:8),1);
Dt = double(bi2de(Dt));
%LENGTH OF THE TEXT MESSAGE
Len = bitget(A(9:16),1);
Len = double(bi2de(Len));
%FETCH THE LEAST SIGNIFICANT BIT FROM THE ENCRYPTD IMAGE
Start_pt = 17;
End_pt = (Len*Dt*8)+16;
Decrypt_msg = bitget(A(Start_pt:Dt:End_pt),1);
%CONVERT THE IMAGE INTO DECIMAL
Decrypt_msg = reshape(Decrypt_msg,8,[])';
Dec_Char = bi2de(Decrypt_msg)';
display('Text Message inside the image:');
display(char(Dec_Char));
运行代码,会输出,解密成功。
Text Message inside the image:
this is a matlab demo, if this lenght small
三、matlab示例 隐藏图片
1、图片示例
用于隐藏图片的图片
待隐藏的图片,注意待隐藏的图片应小于大图的10%
1、加密
参考代码
%ENCRYPTION
clear all
%READ THE COVER IMAGE
I = imread('123.png');
%READ THE IMAGE TO HIDE
J = imread('a12345.png');
%PREALLOCATE THE OUTPUT IMAGE
Output = zeros(size(I));
%REPRESENT THE NUMBER OF ROWS AND COLUMNS OF THE SECRET IMAGE
%IN BINARY FORMAT
Jsize = de2bi([size(J,1),size(J,2)]);
%RED,GREEN AND BLUE COMPONENTS OF THE SECRET IMAGE
Red_Ch = J(:,:,1);
Green_Ch = J(:,:,2);
Blue_Ch = J(:,:,3);
%CONVERT THE RED COMPONENT OF THE SECRET IMAGE INTO BINARY FORMAT
Encrypt_Red = de2bi(Red_Ch(:),8)';
Encrypt_Red = Encrypt_Red(:)';
%CONVERT THE GREEN COMPONENT OF THE SECRET IMAGE INTO BINARY FORMAT
Encrypt_Green = de2bi(Green_Ch(:),8)';
Encrypt_Green = Encrypt_Green(:)';
%CONVERT THE BLUE COMPONENT OF THE SECRET IMAGE INTO BINARY FORMAT
Encrypt_Blue = de2bi(Blue_Ch(:),8)';
Encrypt_Blue = Encrypt_Blue(:)';
%CALCULATE THE INTERVAL AND CONVERT IT INTO BINARY FORMAT
dt=floor((size(I,1)*size(I,2))/numel(Encrypt_Red));
Bi_dt = de2bi(dt,8);
Info_data = [Bi_dt,Jsize(1,:),Jsize(2,:)];
%RED,GREEN AND BLUE COMPONENT OF THE COVER IMAGE
Red_mat = I(:,:,1);
Green_mat = I(:,:,2);
Blue_mat = I(:,:,3);
% INTERVAL,NUMBER OF COLUMNS, NUMBER OF ROWS
Red_mat(1:24) = bitset(Red_mat(1:24),1,Info_data);
Green_mat(1:24) = bitset(Green_mat(1:24),1,Info_data);
Blue_mat(1:24) = bitset(Blue_mat(1:24),1,Info_data);
%%REPLACE THE LEAST SIGNIFICANT BIT OF THE COVER IMAGE
%WITH THE BINARY FORMAT OF THE SECRET IMAGE
EndValue = numel(Encrypt_Red)*dt+24;
Red_mat(25:dt:EndValue) = bitset(Red_mat(25:dt:EndValue),1,Encrypt_Red);
Green_mat(25:dt:EndValue) = bitset(Green_mat(25:dt:EndValue),1,Encrypt_Green);
Blue_mat(25:dt:EndValue) = bitset(Blue_mat(25:dt:EndValue),1,Encrypt_Blue);
%ENCRYPTED IMAGE
Output(:,:,1) = Red_mat;
Output(:,:,2) = Green_mat;
Output(:,:,3) = Blue_mat;
Output = uint8(Output);
figure,subplot(121),imshow(I); subplot(122),imshow(Output);
%DIFFERENCE BETWEEN THE ORIGINAL AND THE ENCRYPTED IMAGE
figure,imagesc(double(I)-double(Output));colormap(jet);colorbar;
%WRITE THE ENCRYPTED IMAGE IN THE PNG FORMAT
imwrite(Output,'Encrypt_Image2.png');
原始图像和加密后的图像
隐藏的图像在大图中的分布。
2、解密
%DECRYPT IMAGE
clear all
%READ THE ENCRYPTED IMAGE
A = imread('Encrypt_Image2.png');
%RED,GREEN AND BLUE COMPONENTS
Red_ch = A(:,:,1);
Green_ch = A(:,:,2);
Blue_ch = A(:,:,3);
%INTERVAL
Dt = bitget(Red_ch(1:8),1);
Dt = double(bi2de(Dt));
%NUMBER OF COLUMNS
Ncols = bitget(Red_ch(9:16),1);
Ncols = double(bi2de(Ncols));
%NUMBER OF ROWS
Nrows = bitget(Red_ch(17:24),1);
Nrows = double(bi2de(Nrows));
%FETCH THE LEAST SIGNIFICANT BIT FROM THE ENCRYPTED IMAGE
EndPoint = (Dt*Nrows*Ncols*8)+24;
Decrypt_Red = bitget(Red_ch(25:Dt:EndPoint),1);
Decrypt_Green = bitget(Green_ch(25:Dt:EndPoint),1);
Decrypt_Blue = bitget(Blue_ch(25:Dt:EndPoint),1);
Decrypt_Red = reshape(Decrypt_Red,8,[])';
Decrypt_Red = bi2de(Decrypt_Red);
Decrypt_Red = reshape(Decrypt_Red,Ncols,Nrows);
Decrypt_Green = reshape(Decrypt_Green,8,[])';
Decrypt_Green = bi2de(Decrypt_Green);
Decrypt_Green = reshape(Decrypt_Green,Ncols,Nrows);
Decrypt_Blue = reshape(Decrypt_Blue,8,[])';
Decrypt_Blue = bi2de(Decrypt_Blue);
Decrypt_Blue = reshape(Decrypt_Blue,Ncols,Nrows);
Decrypted_Image = zeros([Ncols,Nrows,3]);
Decrypted_Image(:,:,1)=Decrypt_Red;
Decrypted_Image(:,:,2)=Decrypt_Green;
Decrypted_Image(:,:,3)=Decrypt_Blue;
Decrypted_Image = uint8(Decrypted_Image);
imwrite(Decrypted_Image,'Decrypted_Image2.png');
figure,imshow(Decrypted_Image);title('Secret Image');
解密出来的秘密图像。