1、用MATLAB函数实现LSB信息隐藏和提取; 2、设计一款伪随机函数(LCC伪随机数生成,请参看附件中文件randUx.m),将LSB算法与伪随机函数结合,信息隐藏的位由伪随机函数确定,实现信息隐藏的随机性,从而提高隐藏算法的抗攻击性; 3、为提高LSB的鲁棒性,改进嵌入方式:采用冗余嵌入,即在一个区域(块)中嵌入相同的信息,提取时根据该区域(块)中的所有像素进行判别。区域(块)的大小可选为(3×3或4×4)
时间: 2023-05-30 19:02:32 浏览: 216
LSB信息隐藏和提取的MATLAB函数:
```matlab
% LSB信息隐藏
function stegoImg = LSBembed(coverImg, secretMsg, bit)
% coverImg: 要隐藏信息的载体图像
% secretMsg: 要隐藏的二进制信息
% bit: 用于隐藏信息的最低比特位数
% 将信息编码为列向量
secretMsg = secretMsg(:);
% 计算载体图像像素总数
numPixels = numel(coverImg);
% 计算可用于隐藏信息的像素总数
numUsablePixels = floor(numPixels / bit) * bit;
% 获取可用于隐藏信息的像素
usablePixels = coverImg(:);
usablePixels = usablePixels(1:numUsablePixels);
% 将可用于隐藏信息的像素转为二进制
binPixels = dec2bin(usablePixels);
% 将信息嵌入像素的最低比特位中
for i = 1:numUsablePixels
if i <= length(secretMsg)
binPixels(i, end-bit+1:end) = secretMsg(i);
else
break;
end
end
% 将嵌入信息后的像素转为十进制
stegoPixels = bin2dec(binPixels);
% 构造嵌入信息后的图像
stegoImg = reshape(stegoPixels, size(coverImg));
stegoImg = uint8(stegoImg);
end
% LSB信息提取
function secretMsg = LSBextract(stegoImg, bit)
% stegoImg: 带有隐藏信息的图像
% bit: 用于隐藏信息的最低比特位数
% 获取嵌入信息的像素
stegoPixels = stegoImg(:);
% 获取嵌入信息的像素总数
numUsablePixels = numel(stegoPixels);
% 将嵌入信息的像素转为二进制
binPixels = dec2bin(stegoPixels);
% 提取嵌入的信息
secretMsg = binPixels(:, end-bit+1:end);
secretMsg = secretMsg(:);
secretMsg = secretMsg(1:floor(numUsablePixels/bit)*bit);
% 将信息转为列向量
secretMsg = str2num(secretMsg);
end
```
LSB信息隐藏和提取结合伪随机函数:
```matlab
% LSB信息隐藏
function stegoImg = LSBembed_rand(coverImg, secretMsg, bit, seed)
% coverImg: 要隐藏信息的载体图像
% secretMsg: 要隐藏的二进制信息
% bit: 用于隐藏信息的最低比特位数
% seed: 伪随机数生成器的种子
% 生成伪随机数序列
rng(seed);
randIndex = randperm(numel(coverImg));
% 将信息编码为列向量
secretMsg = secretMsg(:);
% 计算载体图像像素总数
numPixels = numel(coverImg);
% 计算可用于隐藏信息的像素总数
numUsablePixels = floor(numPixels / bit) * bit;
% 获取可用于隐藏信息的像素
usablePixels = coverImg(randIndex(1:numUsablePixels));
% 将可用于隐藏信息的像素转为二进制
binPixels = dec2bin(usablePixels);
% 将信息嵌入像素的最低比特位中
for i = 1:numUsablePixels
if i <= length(secretMsg)
binPixels(i, end-bit+1:end) = secretMsg(i);
else
break;
end
end
% 将嵌入信息后的像素转为十进制
stegoPixels = bin2dec(binPixels);
% 构造嵌入信息后的图像
stegoImg = coverImg;
stegoImg(randIndex(1:numUsablePixels)) = stegoPixels;
end
% LSB信息提取
function secretMsg = LSBextract_rand(stegoImg, bit, seed)
% stegoImg: 带有隐藏信息的图像
% bit: 用于隐藏信息的最低比特位数
% seed: 伪随机数生成器的种子
% 生成伪随机数序列
rng(seed);
randIndex = randperm(numel(stegoImg));
% 获取嵌入信息的像素
stegoPixels = stegoImg(randIndex);
% 获取嵌入信息的像素总数
numUsablePixels = numel(stegoPixels);
% 将嵌入信息的像素转为二进制
binPixels = dec2bin(stegoPixels);
% 提取嵌入的信息
secretMsg = binPixels(:, end-bit+1:end);
secretMsg = secretMsg(:);
secretMsg = secretMsg(1:floor(numUsablePixels/bit)*bit);
% 将信息转为列向量
secretMsg = str2num(secretMsg);
% 恢复原始伪随机数序列
rng(seed);
randperm(numel(stegoImg));
end
```
采用冗余嵌入的LSB信息隐藏和提取:
```matlab
% 采用冗余嵌入的LSB信息隐藏
function stegoImg = LSBembed_redundant(coverImg, secretMsg, bit, blockSize)
% coverImg: 要隐藏信息的载体图像
% secretMsg: 要隐藏的二进制信息
% bit: 用于隐藏信息的最低比特位数
% blockSize: 冗余嵌入的块大小
% 将信息编码为列向量
secretMsg = secretMsg(:);
% 计算载体图像像素总数
numPixels = numel(coverImg);
% 计算可用于隐藏信息的像素总数
numUsablePixels = floor(numPixels / bit) * bit;
% 获取可用于隐藏信息的像素
usablePixels = coverImg(:);
usablePixels = usablePixels(1:numUsablePixels);
% 将可用于隐藏信息的像素分块
usablePixels = reshape(usablePixels, [blockSize, numUsablePixels/blockSize]);
% 将信息嵌入块的最低比特位中
for i = 1:blockSize
blockPixels = usablePixels(i, :);
blockPixels = dec2bin(blockPixels);
for j = 1:size(blockPixels, 1)
if j <= length(secretMsg)
blockPixels(j, end-bit+1:end) = secretMsg(j);
else
break;
end
end
usablePixels(i, :) = bin2dec(blockPixels);
end
% 将嵌入信息后的像素合并
stegoPixels = usablePixels(:);
% 构造嵌入信息后的图像
stegoImg = reshape(stegoPixels, size(coverImg));
stegoImg = uint8(stegoImg);
end
% 采用冗余嵌入的LSB信息提取
function secretMsg = LSBextract_redundant(stegoImg, bit, blockSize)
% stegoImg: 带有隐藏信息的图像
% bit: 用于隐藏信息的最低比特位数
% blockSize: 冗余嵌入的块大小
% 获取嵌入信息的像素
stegoPixels = stegoImg(:);
% 获取嵌入信息的像素总数
numUsablePixels = numel(stegoPixels);
% 将嵌入信息的像素分块
usablePixels = reshape(stegoPixels, [blockSize, numUsablePixels/blockSize]);
% 提取嵌入的信息
secretMsg = '';
for i = 1:blockSize
blockPixels = usablePixels(i, :);
blockPixels = dec2bin(blockPixels);
blockMsg = blockPixels(:, end-bit+1:end);
secretMsg = [secretMsg; blockMsg(:)];
end
secretMsg = secretMsg(1:floor(numUsablePixels/bit)*bit);
% 将信息转为列向量
secretMsg = str2num(secretMsg);
end
```