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)))
LSB隐写术的更多相关文章
- Python实践项目——LSB隐写术
此为北京理工大学某专业某学期某课程的某次作业 一.项目背景 1.隐写术 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容. 2.L ...
- Wooyun隐写术总结
之前还没有见到drops上有关于隐写术的总结,我之前对于隐写术比较有兴趣,感觉隐写术比较的好玩.所以就打算总结总结一些隐写术方面的东西.写的时候,可能会有错误的地方,请不吝赐教,谢谢. 本篇章中用到的 ...
- javascript图片隐写术,感觉可以用它来干点有想法的事情
1.什么是图片隐写术? 权威的wiki说法是“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容.”,图片隐写术简而言之就是利用图片 ...
- Javascript实现的图片隐写术
javascript图片隐写术,感觉可以用它来干点有想法的事情 1.什么是图片隐写术? 权威的wiki说法是“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人 ...
- CTF之图片隐写术解题思路
参考大佬的博客:https://blog.csdn.net/a_small_rabbit/article/details/79644078 深有感触,觉得写得比较全,因此将此篇文章记录在此方便以后用得 ...
- 在图像中隐藏数据:用 Python 来实现图像隐写术
什么是“隐写术”? 隐写术是将机密信息隐藏在更大的信息中,使别人无法知道隐藏信息的存在以及隐藏信息内容的过程.隐写术的目的是保证双方之间的机密交流.与隐藏机密信息内容的密码学不同,隐写术隐瞒了传达消息 ...
- 【CTF】图片隐写术 · 修复被修改尺寸的PNG图片
前言 今天我们想来介绍一下关于图片隐写相关处理,以及修复被修改尺寸的PNG图片. 关于PNG图片的相关处理,是CTF Misc图片隐写术中极为基础的一项操作,笔者这里是想要提一些做题过程中发现的小技巧 ...
- Linux Standards Base LSB
LSB简介 http://www.ibm.com/developerworks/cn/linux/l-lsb-intr/ http://refspecs.linuxbase.org/ http://t ...
- 字节序相关问题简单总结,LSB与MSB
细细碎碎的知识点还真是不少啊,今天总结下通信中的数据字节序的问题. 先来认识名词: MSB:Most Significant Bit. “最高有效位” LSB:Least Significant ...
随机推荐
- UiPath条件判断活动If的介绍和使用
if的介绍 if语句是指编程语言(包括c语言.C#.Python.Java.汇编语言等)中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一. if在UiPath中的使用 ...
- NC16618 [NOIP2008]排座椅
NC16618 [NOIP2008]排座椅 题目 题目描述 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下 ...
- VScode中配置Java环境
vscode 中配置Java环境 转载说明:本篇文档原作者[@火星动力猿],文档出处来自哔哩哔哩-[教程]VScode中配置Java运行环境 转载请在开头或显眼位置标注转载信息. 1.下载VScode ...
- halcon数组的一些使用
没啥好讲的,这里对于不是数组部分的东西就不进行讲解了. area_center(RegionOpening,Area, Row, Column).使用area_center来求区域的中心和面积时,返回 ...
- CentOS6安装使用ntp同步时间
[root@server yum.repos.d]# yum install ntp已加载插件:fastestmirror, priorities, refresh-packagekit, secur ...
- Whats On Tap | Tapdata Cloud 如何助力大型家居连锁商城推进数字化经营?
Tapdata Cloud 的操作有多便捷,上手试一下就能充分了解了.--Tapdata Cloud 用户 | 报表实施 @某大型家居服务平台 一边是监管政策趋严,推动房地产回归本源,存量竞争时代开启 ...
- 用Bootstrap4写了一个WordPress主题Writing
这是一个简洁的WordPress博客主题,为专注写作而设计. 本主题使用Bootstrap4框架开发. 主要功能 自适应: 标签云页面模板: 两栏设计: 全宽页面模板: 支持设置背景色和背景图片: 8 ...
- 方法的调用和JDK9的JShell简单使用
方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法.在主方法中,直接写要调用的方法名字就可以调用了 public static void ma ...
- 什么?让每一个开源项目更安全?啊?还有IDE工具?难道是它?
背景 入编程界6年来,大大小小的安全漏洞是真滴听了不少,xxx通过日志入侵了,xxxx通过请求入侵了,等等等等. 近期fastJson又报安全漏洞,敢巧自己又"被"跳槽到了新公司, ...
- mysql语法使用详细代码版
mysql 1.什么是数据库 数据库:(DB,DataBase) 作用:用来存储数据,管理数据.Txt,Excel,word是在数据库出现之前存储数据的. 概念:数据仓库,安装在操作系统上的软件. 数 ...