实验报告
实验题目:LSB隐写
课程题目:多媒体安全技术
学号:512018
1、实验目的和要求
(1)实现LSB隐写,仔细观察图像隐写前后的异同。
(2)实现RS隐写。
(3)对100张512*512大小图片,进行嵌入率为0.5的LSB隐写,用RS隐写分析计算正确率。
(4)实现抵抗RS分析的LSB隐写
2、实验设备(环境)
Matlab和python
3、实验步骤
(1)编写python代码实现Lsb隐写和提取图片。
(2)RS分析,编写Matlab代码如下。
(3)RS分析100张图片的平均值,编写Matlab代码如下。
(4)抵抗RS分析的LSB隐写,用matlab编写。
- 实验结果
(1)使用python编写lsb隐写代码,运行结果之后隐写图片为。
(2)提取结果为
(3)RS分析,单张图片结果
(4)RS分析100张的结果。
(5)取平均值的效果
(6)抵抗RS分析的LSB隐写。
5、讨论和分析(分析实验原理,为什么会得到这样的结果以及在试验中应注意的问题)
LSB隐写就是修改RGB颜色分量的最低二进制位也就是最低有效位(LSB)。
RS主要是针对采用伪随机LSB嵌入算法进行攻击的一种方法。
应注意的问题:
因为一开始对Matlab的代码不是很熟悉,所以在写LSB隐写的时候还是选择了python进行编写代码。在写RS分析的时候,用python参考了很多网上的例子都无法成功运行,最后选择了书上的方法。学会了Matlab如何批量处理图片和plot对于图形的绘制。 批处理文件:
Plot: plot(x,y)这种格式中,若x,y是向量,则它们必须具有相同的长度。函数将以x为横轴,绘制y。 若x,y都是矩阵,则它们必须具有相同的尺寸,plot函数将针对x的各列绘制y的每列。更确切的说,将x和y的对应的各列取出来,绘制曲线。比如x和y分别为n*n的矩阵,则plot函数将x的第1列和y的第1列对应取出来,绘制一条曲线,然后将x的第二列与y的第二列对应起来,绘制一条曲线,如此下去直到第n条匹配绘制完成。代码 extract.py
from PIL import Image
# print(watermark)
def deEncry(img, length):
# 计数器
count = 0
wt = ""
for i in range(img.size[0]):
for j in range(img.size[1]):
# 获取像素点的值
rgb = img.getpixel((i, j))
wt = wt + str(rgb % 2)
count += 1
if count == length:
# print(len(wt))
break
return wt
def showImage(wt):
# str2初始化为list
str2 = []
# 将wt的值转变为RGB值
for i in range(0, len(wt), 8):
# 以每8位为一组二进制,转换为十进制
str2.append(int(wt[i:i + 8], 2))
# 绘制和显示水印图片
print(str2)
img_out = Image.new("L", (96, 96))
count = 0
for m in range(0, 96):
for n in range(0, 96):
img_out.putpixel((m, n), str2[count])
count += 1
img_out.show()
img1 = Image.open("D:/schoolstudy/大三下/隐写课/实验一/2.tif")
length = 73728
wt = deEncry(img1, length)
# print(wt)
showImage(wt)
LSB.py
from PIL import Image
# print(watermark)
def plus(str):
return str.zfill(8)
# 获取水印图片的每一个像素值,i:指定要检查的像素点的逻辑X轴坐标。j:指定要检查的像素点的逻辑Y轴坐标。
def getcode(watermark):
str1 = ""
print(watermark.size[0])
print(watermark.size[1])
for i in range(watermark.size[0]):
for j in range(watermark.size[1]):
# 获取每个像素的RGB值
rgb = watermark.getpixel((i, j))
# print(rgb,end='|')
# print(bin(rgb),end='|')
str1 = str1 + plus(bin(rgb).replace('0b', ''))
# print (str)
return str1
# 加密
def encry(img, code):
# 计数器
count = 0
codelen = len(code)
print(codelen)
for i in range(img.size[0]):
for j in range(img.size[1]):
# 获取每个像素的RGB值
if count == codelen:
break
data = img.getpixel((i, j))
# print (r)
# print(codelen)#24
data = (data - data % 2) + int(code[count])
img.putpixel((i, j), data)
count += 1
img.save('D:/schoolstudy/大三下/隐写课/实验一/2.tif')
im = Image.open("D:/schoolstudy/大三下/隐写课/实验一/1.tif")
watermark = Image.open("D:/schoolstudy/大三下/隐写课/实验一/2.png")
code = getcode(watermark)
# print(len(code))
encry(im, code)
rs_program.m
file_path = 'D:schoolstudy大三下隐写课实验1100';
img_path_list = dir(strcat(file_path,'*.tif'));
img_num = length(img_path_list);
images = cell(1,img_num);
rs_final=zeros(10,4);
if img_num>0
for i = 1:img_num
img_name = img_path_list(i).name;
fprintf('正在处理%sn',img_name);
t=imread(img_name);
[p,q]=size(t);
I=t(1:p,1:q);
sz=size(I);
m=floor(sz(1)/8);
n=floor(sz(2)/8);
rs=zeros(10,4);
cor=zeros(1,3);
M=randsrc(8,8,[0 1]);
tmp=zeros(8,8);
for i=1 : 10
r=floor(sz(1)*i/10);
c=floor(sz(2)*i/10);
msg=randsrc(r,c,[0 1]);
s=I;
s(1:r,1:c)=bitset(s(1:r,1:c),1,msg);
for j=1 : m
rv=[(j-1)*8+1:j*8];
for k=1 : n
cv=[(k-1)*8+1:k*8];
tmp=s(rv,cv);
cor(1)=SpaceCor(tmp);
cor(2)=SpaceCor(f1(tmp,M));
cor(3)=SpaceCor(f_1(tmp,M));
if cor(2)>cor(1)
rs(i,1)=rs(i,1)+1;
else
if cor(2)cor(1)
rs(i,3)=rs(i,3)+1;
else
if cor(3) 


