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)))
Python实践项目——LSB隐写术的更多相关文章
- python实践项目1
python #南昌理工学院人工智能学院实验室 WORKSHOP 实践项目 import time print('welcome to our WORKSHOP') print('.......... ...
- Python实践项目2
#南昌理工学院人工智能学院实验室WORKSHOP实践项目 import time import random SCRIPT_NPC_SCHOOL_SISTER = ['你好!', '你好!', '你是 ...
- python实践项目九:操作文件-修改文件名
描述:多个文件,文件名名包含美国风格的日期( MM-DD-YYYY),需要将它们改名为欧洲风格的日期( DD-MM-YYYY) 代码1:先创建100个文件名为美国风格日期的文件(文件路径为项目当前路径 ...
- python实践项目一:Collatz函数
要求1:编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数,那么 collatz()就打印出 number // 2, 并返回该值.如果 number 是奇数, ...
- python 实践项目
项目一:让用户输入圆的半径,告诉用户圆的面积 思路: 1.首先需要让用户输入一个字符串,即圆的半径 2.判断用户输入的字符串是否为数字 isalpha 3.求圆的面积需要调用到math模块,所以要导 ...
- python实践项目—Collatz序列
Collatz序列题意说明 编写一个名为collatz()的函数,它有一个名为number 的参数.如果参数是偶数,那么collatz()就打印出number // 2,并返回该值.如果number ...
- python实践项目十:zipfile模块-将一个文件夹备份到一个 ZIP 文件
描述:将指定路径下的某文件夹备份到一个zip文件 代码: #!/usr/bin/python # -*- coding: UTF-8 -*- # backupToZip - Copies an ent ...
- python实践项目八:生成随机试卷文件
描述:匹配美国50个州的首府. 下面是程序需要完成的任务: • 创建35 份不同的测验试卷. • 为每份试卷创建50 个多重选择题,次序随机. • 为每个问题提供一个正确答案和3 个随机的错误答案,次 ...
- python实践项目七:正则表达式版本的strip()函数
描述:写一个函数,它接受一个字符串,做的事情和 strip()字符串方法一样.如果只传入了要去除的字符串, 没有其他参数, 那么就从该字符串首尾去除空白字符:否则, 函数第二个参数指定的字符将从该字符 ...
随机推荐
- 阿里云有奖体验:用PolarDB-X搭建一个高可用系统
体验简介 场景将提供一台配置了CentOS 8.5操作系统和安装部署PolarDB-X集群的ECS实例(云服务器).通过本教程的操作,带您体验如何使用PolarDB-X搭建一个高可用系统,通过直接ki ...
- Tapdata 实时数据融合平台解决方案(四):技术选型
作者介绍:TJ,唐建法,Tapdata 钛铂数据CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 常见搭建数据中台的技术产品 数据中台包括: ...
- GRAPH CONVOLUTIONAL NETWORK WITH SEQUENTIAL ATTENTION FOR GOAL-ORIENTED DIALOGUE SYSTEMS
面向领域特定目标的对话系统通常需要建模三种类型的输入,即(i)与领域相关的知识库,(ii)对话的历史(即话语序列)和(iii)需要生成响应的当前话语. 在对这些输入进行建模时,当前最先进的模型(如Me ...
- 159_模型_Power BI 地理分析之形状地图
159_模型_Power BI 地理分析之形状地图 声明以下地图元素仅供学习交流所用,如需地图公开使用请提前做好报审工作. 一.背景 当企业的体量达到一定体量的时候,保持稳定的增长是非常重要的事情.本 ...
- 分库分表真的适合你的系统吗?聊聊分库分表和NewSQL如何选择
曾几何时,"并发高就分库,数据大就分表"已经成了处理 MySQL 数据增长问题的圣经. 面试官喜欢问,博主喜欢写,候选人也喜欢背,似乎已经形成了一个闭环. 但你有没有思考过,分库分 ...
- 总结vue 需要掌握的知识点
使用的开发工具是webstorm,它是默认就安装好了vuejs插件,idea要使用的话,需要安装一下该插件 一.快速搭建项目vue-cli 脚手架(Vue2.0) 1.Vue CLI使用前提 –Nod ...
- CF1700C Helping the Nature
题目大意: 给出一个长度为 n 的序列 a,每次可以进行三种操作中的一种: 选择i,将 a_1,a_2,...,a_i减1. 选择i,将 a_i,a_i+1,...,a_n减1. 将所有 a_i加1. ...
- TCP/IP协议三次握手、四次断开
1.tcp报文格式 1行代表一个字节: 第一行:代表源端口和目的端口,分别占16位: 第二行:32位序列号:表示客户端向服务端发送的报文的序号是多少,这个序号是计算机随机生成的一个代表该报文的唯一标示 ...
- git常见问题及解决方法
简介 由于在git使用过程中会出现各种各样的问题,因此本文将常见的问题记录下来并提供相应的解决方案,方便后续查找. git pull问题: There is no tracking informati ...
- 一键到位「GitHub 热点速览 v.22.32」
作者:HelloGitHub-小鱼干 上上周在 B 站观看了智能键盘--瀚文的制作过程,本周 GitHub 热榜上出现了它的软硬件开源项目 HelloWord-Keyboard,如果你的动手能力强不妨 ...