先决条件:图像隐写术简介,使用Python实现。
隐写术是将秘密数据隐藏在任何形式的数字媒体中的方法。隐秘术的主要思想是将数据的存在隐藏在音频,视频,图像等任何介质中。当我们谈论图像隐秘术时,这个思想很简单。图像由像素组成,通常指的是该特定像素的颜色。在灰度(黑白)图像中,这些像素值的范围为0-255,0为黑色,255为白色。
基于LSB的数据嵌入的概念:
LSB代表最低有效位。 LSB嵌入背后的想法是,如果我们更改像素的最后一位,则颜色不会有太多可见变化。例如,0为黑色。将该值更改为1不会有太大区别,因为它仍然是黑色,只是较浅的阴影。
编码使用以下步骤完成:
- 将图像转换为灰度
- 根据需要调整图像大小
- 将消息转换为其二进制格式
- 初始化与输入图像相同的输出图像
- 遍历图像的每个像素并执行以下操作:
- 将像素值转换为二进制
- 获取要嵌入的消息的下一部分
- 创建一个可变的温度
- 如果消息位和像素的LSB相同,则将temp设置为0
- 如果消息位和像素的LSB不同,则将temp设置为1
- 可以通过对消息位与像素的LSB进行XOR来完成此温度设置
- 将输出图像的像素更新为输入图像的像素值+温度
- 不断更新输出图像,直到嵌入消息中的所有位
- 最后,将输入以及输出图像写入本地系统。
例子:
输入: message =’geeksforgeeks’
输出:嵌入了给定消息的图像:
下面是在MATLAB中的实现:
% Clear the existing workspace
clear all;
% Clear the command window
clc;
% Read the input image
input = imread('peppers.png');
% Convert image to greyscale
input=rgb2gray(input);
% Resize the image to required size
input=imresize(input, [512 512]);
% Message to be embedded
message='geeksforgeeks';
% Length of the message where each character is 8 bits
len = length(message) * 8;
% Get all the ASCII values of the characters of the message
ascii_value = uint8(message);
% Convert the decimal values to binary
bin_message = transpose(dec2bin(ascii_value, 8));
% Get all the binary digits in separate row
bin_message = bin_message(:);
% Length of the binary message
N = length(bin_message);
% Converting the char array to numeric array
bin_num_message=str2num(bin_message);
% Initialize output as input
output = input;
% Get height and width for traversing through the image
height = size(input, 1);
width = size(input, 2);
% Counter for number of embedded bits
embed_counter = 1;
% Traverse through the image
for i = 1 : height
for j = 1 : width
% If more bits are remaining to embed
if(embed_counter <= len)
% Finding the Least Significant Bit of the current pixel
LSB = mod(double(input(i, j)), 2);
% Find whether the bit is same or needs to change
temp = double(xor(LSB, bin_num_message(embed_counter)));
% Updating the output to input + temp
output(i, j) = input(i, j)+temp;
% Increment the embed counter
embed_counter = embed_counter+1;
end
end
end
% Write both the input and output images to local storage
% Mention the path to a folder here.
imwrite(input, 'path_to_folder\originalImage.png');
imwrite(output, 'path_to_folder\stegoImage.png');
图片比较:
正如我们在上面的屏幕截图中看到的那样,人眼看起来输入和输出图像完全相同。输出图像中嵌入了消息。
这种方法的优点:
- 与其他图像隐写方法相比,该方法非常快速且易于实现。
- 输出图像与输入图像有很小的差异。
- 我们可以将消息嵌入最后两个LSB中,而不是仅将消息嵌入到LSB中,从而甚至可以嵌入较大的消息。
- 此方法构成了许多其他复杂算法的基础
- 我们可以将消息嵌入最后两个LSB中,而不是仅将消息嵌入到LSB中,从而甚至可以嵌入较大的消息。
此方法的缺点:
- 这种数据编码方式很弱,因为可以很容易地通过获取图像的LSB并以二进制格式获取消息来对其进行解码。
- 此方法过旧,因为很久以前还没有开发其他编码方法时就使用了该方法。
- 当将消息嵌入一个以上的LSB中时,图像质量可能会下降,具体取决于更改了多少个像素。