用matlab设计一款伪随机函数(LCC伪随机数生成,请参看附件中文件randUx.m),将LSB算法与伪随机函数结合,信息隐藏的位由伪随机函数确定,实现信息隐藏的随机性,从而提高隐藏算法的抗攻击性;
时间: 2023-05-27 22:05:40 浏览: 144
由于题目中已经给出了LCC伪随机数生成的matlab代码,我们可以直接使用该代码生成伪随机数,并将LSB算法与其结合实现信息隐藏。
首先,我们需要定义一个函数,该函数可以将需要隐藏的信息转换为二进制形式,并将其按照一定的规则与伪随机数进行异或操作,从而实现信息隐藏。下面是代码实现:
```matlab
function [stego_img, prn] = LSB_PRN_hide(cover_img, message, key)
% cover_img: 要隐藏信息的载体图片
% message: 要隐藏的信息,可以是字符串或数字
% key: 伪随机数生成的密钥
% 将信息转换为二进制形式
if isstring(message)
message = char(message);
end
if ischar(message)
message = uint8(message);
end
if isnumeric(message)
message = dec2bin(message)';
message = message(:) - '0';
end
% 生成伪随机数
prn = randUx(size(cover_img), key);
% 将信息与伪随机数进行异或操作
stego_img = cover_img;
stego_img = bitset(stego_img, 1, bitxor(bitget(stego_img, 1), message));
stego_img = bitset(stego_img, 2, bitxor(bitget(stego_img, 2), prn(:)));
```
其中,我们使用了matlab内置函数`dec2bin`将数字类型的信息转换为二进制形式,`bitget`和`bitset`函数实现了对二进制数据的读取和修改,`bitxor`函数实现了异或操作。
接下来,我们可以编写解密函数,将隐藏的信息提取出来。代码如下:
```matlab
function [message, prn] = LSB_PRN_extract(stego_img, key, message_length)
% stego_img: 隐藏了信息的图像
% key: 伪随机数生成的密钥
% message_length: 需要提取的信息长度,单位为比特
% 生成伪随机数
prn = randUx(size(stego_img), key);
% 从图像中提取信息
message = bitget(stego_img, 1);
message = message(1:message_length);
% 从图像中提取伪随机数
prn = bitget(stego_img, 2);
prn = reshape(prn, [], length(prn)/length(prn(:)));
prn = prn(:, 1:length(key(:)));
prn = bi2de(prn);
% 将信息与伪随机数进行异或操作,得到原始信息
message = bitxor(message, prn);
message = char(char(message + '0')');
message = message(:)';
if message_length ~= length(message)
warning('提取的信息长度与指定的长度不符!');
end
```
在解密函数中,我们使用了`reshape`函数将图像中提取出来的伪随机数重新排列,然后使用了`bi2de`函数将二进制形式的伪随机数转换为十进制形式,最后再将信息与伪随机数进行异或操作,得到原始信息。
使用上述函数,我们可以将信息隐藏到图像中,并且实现信息隐藏的随机性。同时,由于使用了伪随机数生成密钥,因此可以提高隐藏算法的抗攻击性。
阅读全文