Python实践项目——LSB隐写术

此为北京理工大学某专业某学期某课程的某次作业

一、项目背景

1、隐写术

隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。

2.LSB 隐写术

LSB 隐写术是一种图像隐写术技术,其中通过将每个像素的最低有效位替换为要隐藏的消息位来将消息隐藏在图像中。

3.实现原理

为了更好地理解,让我们将数字图像视为像素的二维阵列,每个像素包含取决于其类型和深度的值,使用最广泛的颜色模式RGB,这些值的范围为0–255之间。

可以使用 ASCII Table 将消息转换为十进制值,然后再转换为二进制。然后,我们逐个迭代像素值,将它们转换为二进制后,我们将每个最低有效位替换为序列中的消息位。

要解码编码图像,我们只需反转该过程,收集并存储每个像素的最后一位,然后将它们分成 8 组,并将其转换回 ASCII 字符以获取隐藏消息。

二、项目目标

1.主要目标

编写LSB图像隐写程序,包括:加密程序解密程序

2.目标分解

a)实现文本信息加密到图像

b)实现图像文件解密到文本

三、技术选型

1.问题:如何以二进制方式读写图像文件?

首先安装pillow库,win+R输入cmd快速打开控制台,直接输入以下代码即可自动安装

pip install pillow

然后读取图片
 

from PIL import Image #从pillow库(即PIL)中导入Image类
img = Image.open('../xx.jpg') #读取图片存入变量img中
print(img.format) #输出图片格式(str)
print(img.size) #输出图片大小信息 (宽度w,高度h)tuple = (int,int)

获取像素信息

#像素载入
pix = img.load()
width = img.size[0] #.size 方法返回的是一个元组 tuple =(int,int) 
height = img.size[1] 
#获取像素点的RGB值
rgb_list = [] #创建一个数组存储RGB值
for y in range(height):#遍历每一个像素点,将图像看作是一个二维数组,
    for x in range(width): #如果x循环在外层输出的图像会发生一个九十度的翻转
        r,g,b =pix[x,y] #此处的r,g,b是像素点pix[x,y]的RGB值
        rgb_list.append(r)
        rgb_list.append(g)
        rgb_list.append(b)

输出图像

#输出图像
j = 0
pixels = [] #以[(r1,g1,b1),(r2,g2,b2)]形式存放每个像素点的RGB值,于绘制图像
img_out = Image.new(img.mode,img.size) #生成新图像,以原图的格式和大小
#img_out此时还是一张白纸,下面的代码旨在更新img_out的像素信息
while j<len(rgb_list):    #循环次数高达786432次
    pixels.append((rgb_list[j],rgb_list[j+1],rgb_list[j+2])) #以元组的形式
    j += 3
img_out.putdata(pixels)#放置像素信息
img_out.save("img_out2.png")#将图像保存为,程序运行后会出现在根目录

2.问题:信息如何转换

二进制转文本(解密)

def bina_to_txt(bina):
    #只要传入一个二进制数组成的序列即可翻译成文本
    tex = []
    for i in bina:
        tex.append(chr(int(i,2)))
    return tex #返回一个单字符序列

#要求bina的格式为['01010101','11111111']

文本转二进制(加密)

def txt_to_bina(txt):
    c=[]
    for a in txt:
        c.append("{:0>8}".format(bin(ord(a)).lstrip('0b')))
        #格式化将二进制码保存起来
        #注意要在右侧补齐八位,否则信息会错位
    resultlist = []
    for i in c:
        for j in range(8):
            resultlist.append(i[j])
    return resultlist
#txt 为字符串类型,如 “hello world!”

#print(txt_to_bina("h"))  输出测试
#test_output:['0', '1', '1', '0', '1', '0', '0', '0']

替换信息位(加密)

#替换信息位的信息
i = 0
while i < len(txt_to_bina(txt)):
    temp =list(bin(rgb_list[i])) #用 bin()强制转换,bin()返回一个字符串类型
    temp[-1]=txt_to_bina(txt)[i] #将二进制型的RGB信息的最后一位转换成文本二进制码
    rgb_list[i] = int(''.join(temp),2)
    i += 1
#txt_to_bina()是自定义的一个函数,旨在将文本转化成二进制码,返回一个单字符的序列
#这里是直接用第一个像素的RGB值作为隐写的开头,所以rgb_list和txt_to_bina()[]的index是一样的
#此处可以做一个加密

#特别注意在python中字符串不能直接修改,replace方法不会改变原来的string
#修改字符串要将字符串转换成一个序列,修改序列后在将序列转成字符串,实现代码如下
s = 'abcde'
temp = list(s)
temp[-1] = 'f' #假设要将s的最后一位“e”修改为“f”
s = ''.join(temp)

提取信息位信息

#这里直接用的是“hello world!”的长度,后期优化可以加个旗帜识别
c = ''
for i in range(96):
    c += bin(rgb_list[i])[-1] #图像处理后得到rgb_list,取二进制码的最后一位
out_list_bin =[]
for i in range(12):
    out_list_bin.append(c[i*8:(i+1)*8])#每八位为一组转换出文本
print(''.join(bina_to_txt(out_list_bin)))

 

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用OpenCV库来实现LSB隐写术LSB隐写术是一种图像隐写术技术,通过将每个像素的最低有效位替换为要隐藏的消息位来将消息隐藏在图像中。 具体实现原理如下: 1. 将要隐藏的消息转换为二进制码。 2. 将图像的RGB值转换为二进制码。 3. 将消息的二进制码逐位替换到图像的RGB值的最低有效位中。 4. 将修改后的RGB值重新转换回整数值。 5. 将修改后的RGB值重新写回图像。 下面是一个示例代码,演示了如何在Python中实现LSB隐写术: ```python import cv2 def hide_message(image_path, message): image = cv2.imread(image_path) binary_message = ''.join(format(ord(char), '08b') for char in message) index = 0 for row in image: for pixel in row: # 获取像素的RGB值 red, green, blue = pixel[0], pixel[1], pixel[2] # 将RGB值转换为二进制码 red_binary = format(red, '08b') green_binary = format(green, '08b') blue_binary = format(blue, '08b') # 将消息的二进制码逐位替换到RGB值的最低有效位中 if index < len(binary_message): red_binary = red_binary[:-1] + binary_message[index] index += 1 if index < len(binary_message): green_binary = green_binary[:-1] + binary_message[index] index += 1 if index < len(binary_message): blue_binary = blue_binary[:-1] + binary_message[index] index += 1 # 将修改后的二进制码转换为整数值 red = int(red_binary, 2) green = int(green_binary, 2) blue = int(blue_binary, 2) # 更新像素的RGB值 pixel[0], pixel[1], pixel[2] = red, green, blue # 保存修改后的图像 cv2.imwrite("output_image.png", image) # 调用示例 hide_message("input_image.png", "Hello World!") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值