栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

多媒体安全技术 LSB隐写

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多媒体安全技术 LSB隐写

实验报告
实验题目: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. 实验结果
    (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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/990559.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号