Python 实现图片隐写术
一、实验简介
wikipedia 关于隐写术的介绍:
隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做 Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作 _Steganographia_,该书书名源于希腊语,意为“隐秘书写”。
1.1 知识点
- Pillow 模块
- 最低有效位
- lambda 表达式递归
- UTF-8 编码
二、实验步骤
本节将通过实践操作,带领大家使用 Python3 实现图片隐写术。
2.1 实验原理
还是引用 wikipedia 的解释:
载体文件(cover file)相对隐秘文件的大小(指数据含量,以比特计)越大,隐藏后者就越加容易。
因为这个原因,数字图像(包含有大量的数据)在因特网和其它媒介上被广泛用于隐藏消息。这种方法使用的广泛程度无从查考。例如:一个 24 位的位图中的每个像素的三个颜色分量(红,绿和蓝)各使用 8 个比特来表示。如果我们只考虑蓝色的话,就是说有 2^8 种不同的数值来表示深浅不同的蓝色。而像 11111111 和 11111110 这两个值所表示的蓝色,人眼几乎无法区分。因此,这个最低有效位就可以用来存储颜色之外的信息,而且在某种程度上几乎是检测不到的。如果对红色和绿色进行同样的操作,就可以在差不多三个像素中存储一个字节的信息。
更正式一点地说,使隐写的信息难以探测的,也就是保证 “有效载荷”(需要被隐蔽的信号)对 “载体”(即原始的信号)的调制对载体的影响看起来(理想状况下甚至在统计上)可以忽略。这就是说,这种改变应该无法与载体中的噪声加以区别。
(从信息论的观点来看,这就是说信道的容量必须大于传输“表面上”的信号的需求。这就叫做信道的冗余。对于一幅数字图像,这种冗余可能是成像单元的噪声;对于数字音频,可能是录音或者放大设备所产生的噪声。任何有着模拟放大级的系统都会有所谓的热噪声(或称 “1/f” 噪声),这可以用作掩饰。另外,有损压缩技术(如 JPEG)会在解压后的数据中引入一些误差,利用这些误差作隐写术用途也是可能的。)
隐写术也可以用作数字水印,这里一条消息(往往只是一个标识符)被隐藏到一幅图像中,使得其来源能够被跟踪或校验。
总而言之,本实验便是利用图片四个颜色分量(rgba)的最低有效位(英语:Least Significant Bit,lsb)来隐藏信息(本实验隐藏的是文字)。
2.2 安装包
本实验用到了 pillow 这个模块,实验环境中已经安装了 Python3 的包管理工具 pip3 ,升级 pip3 然后安装 pillow 模块。终端执行以下命令:
$ sudo pip3 install -U pip # 升级包管理工具 pip3$ sudo pip3 install pillow # 安装所需工具包 pillow
2.3 编码
我们将以下代码写入 /home/shiyanlou/Code/steganography.py 脚本文件中。
先导入 Pillow 模块和 sys 模块:
import sys
from PIL import Image
根据前文所述实验原理创建一个函数,用于将图片的像素点数据值的二进制末位全部变成 0 ,以便后续事宜末位存储数据。该函数命名为 make_even_image ,它接收一个图片对象作为参数,返回一个处理后的图片对象:
def make_even_image(image):"""取得一个 PIL 图像并且更改所有值为偶数,使最低有效位为 0"""# image.getdata 方法返回的是一个可迭代对象,其中包含图片中所有像素点的数据# 每个像素点表示一个颜色,每种颜色有红绿蓝三种颜色按比例构成# R Red 红色;G Green 绿色;B Blue 蓝色;A Alpha 透明度# 更改所有像素点中四个数值为偶数(魔法般的移位)# 这里使用位运算符 >> 和 << 来实现数据处理# 奇数减一变偶数,偶数不变,这样处理后,所有数值的最低位变为零# pixels 为更改后的像素点数据列表pixels = [(r >> 1 << 1, g >> 1 << 1, b >> 1 << 1, a >> 1 << 1)for r, g, b, a in image.getdata()]# 调用 Image 的 new 方法创建一个相同大小的图片副本# 参数为模式(字符串)和规格(二元元组)# 这里使用 image 的属性值即可even_image = Image.new(image.mode, image.size)# 把处理之后的像素点数据写入副本图片even_image.putdata(pixels)return even_image
图片处理功能写好之后,就可以向图片对象中写入信息了,也就是把字符串编码到图片中。完成这一功能的函数为 encode_data_in_image ,该函数接收两个参数:图片对象和要隐藏到图片中的信息,函数的返回值是隐藏了字符串信息的新图片。函数代码如下:
def encode_data_in_image(image, data):"""将字符串编码到图片中"""# 获得最低有效位为 0 的图片副本even_image = make_even_image(image)# 匿名函数用于将十进制数值转换成 8 位二进制数值的字符串int_to_binary_str = lambda i: '0' * (8 - len(bin(i)[2:])) + bin(i)[2:]# 将需要隐藏的字符串转换成二进制字符串# 每个字符转换成二进制之后,对应一个或多个字节码# 每个字节码为一个十进制数值,将其转换为 8 位二进制字符串后相加binary = ''.join(map(int_to_binary_str, bytearray(data, 'utf-8')))# 每个像素点的 RGBA 数据的最低位都已经空出来,分别可以存储一个二进制数据# 所以图片可以存储的最大二进制数据的位数是像素点数量的 4 倍# 如果需要隐藏的字符串转换成二进制字符串之后的长度超过这个数,抛出异常if len(binary) > len(even_image.getdata()) * 4:raise Exception("Error: Can't encode more than " +len(even_image.getdata()) * 4 + " bits in this image. ")# 二进制字符串 binary 的长度一定是 8 的倍数# 将二进制字符串信息编码进像素点中# 当二进制字符串的长度大于像素点索引乘以 4 时# 这些像素点用于存储数据# 否则,像素点内 RGBT 数值不变encoded_pixels = [(r+int(binary[index*4+0]),g+int(binary[index*4+1]),b+int(binary[index*4+2]),t+int(binary[index*4+3]))if index * 4 < len(binary) else (r,g,b,t)for index, (r, g, b, t) in enumerate(even_image.getdata())]# 创建新图片以存放编码后的像素encoded_image = Image.new(even_image.mode, even_image.size)# 把处理之后的像素点数据写入新图片encoded_image.putdata(encoded_pixels)# 返回图片对象return encoded_image
相关函数的文档链接:
Image.getdata()
PIL.Image.new()
PIL.Image.Image.putdata()
encode_data_in_image
函数中,bytearray
方法将字符串转换为整数值序列(数字范围是 0 到 2^8-1),数值序列由字符串的字节数据转换而来,如下图:
utf-8 编码的一个中文字符就占了 3 个字节,那么四个字符共占 3×4=12 个字节,于是共有 12 个数值。然后 map(int_to_binary_str, bytearray(data, 'utf-8'))
对数值序列中的每一个值应用 int_to_binary_str
匿名函数,将十进制数值序列转换为二进制字符串序列。匿名函数里 bin
方法的作用是将一个 int 值转换为二进制字符串,详见: Built-in Functions — Python 3.10.1 documentation
Python 实现图片隐写术相关推荐
- 用python写情书_资深Python程序员用图片隐写术写情书,全公司只有她能看懂,绝了...
谁说程序员不浪漫!他从事python工作七八年,为了追公司的女同事,竟然用python的图片隐写术在图片上写情书,让全公司只有她才能看懂. image 先介绍一下图片隐写术吧,这是一门有关于将信息隐藏 ...
- 【Python】简单的图片隐写术
图片隐写术,即在图片里非显式地嵌入信息,实现图片隐写有很多方法. 第一种方式(来自维基百科): 要从上图中获取下图的信息,只需要将上图色彩空间中的每个二进制数都只保留最后两位(即相当于与3做按位与计算 ...
- python开发图片_python实现简单的图片隐写术
本文转载自Python3图片隐写术 载体文件相对隐秘文件的大小越大,隐藏后者就越加容易.因为这个原因,数字图像在因特网和其他传媒上被广泛用于隐藏消息.例如一个24位的位图中的每个像素的三个颜色分量(红 ...
- 使用 Python 的图像隐写术
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 今天,世界正在见证前所未有的数据爆炸,我们每天产生的数据量确实令人 ...
- 杂项题的基本解题思路——2、图片隐写术
图片隐写术 图片隐写的常见隐写方法 ①firework工具 使用winhex打开文件时会看到头部中包含fireworks的标识 ,通过firework可以找到隐藏图片 使用场景:查看隐写的图片文件 ② ...
- python控制台图片_Python实现图像信息隐藏
Python实现图像信息隐藏 之前学习密码学的时候老师有提到过『信息隐藏』,现在用图像的方法尝试一下.思想是:把信息藏到RGB通道中的B通道,然后利用奇偶性可以恢复过来 原理 从源图中提取文字图像信息 ...
- RGB图片隐写术免杀
微信公众号:乌鸦安全 扫取二维码获取更多信息! 1. 前言 目前杀软比较厉害,如果直接运行exe的话,相对来说免杀难度大一点(但也不绝对),尤其是某些厂商,针对一些打包exe的工具进行无脑杀,所以这里 ...
- Python3 图片隐写术
Python3 图片隐写术 一.实验简介 wikipedia 关于隐写术的介绍: 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容 ...
- python爬图片_网络爬虫经验:反爬和反反爬
我想很多人入门python是图片爬虫,就是HTTP请求,保存一下图片,用python实现非常快.网上很多爬虫的教程就讲到这里,实际上很单一,看了跟没看没什么区别,都是找一下网页的规律,然后Beauti ...
最新文章
- 别再说程序员不懂时尚
- Delphi:对TNotifyEvent的理解
- 【计算机视觉】Objectness算法(一)---总体理解,整理及总结
- 【强化学习】从强化学习基础概念开始
- 计算机动漫设计VR主要学什么,动漫设计专业学什么 要学什么软件
- CCNA第五章WAN连接
- mysql 强制读主库_laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题...
- Shell编程入门基础上
- 中心药库管理系统 v6.85 是什么
- 简单的贪吃蛇代码,可上机运行
- TB6612驱动和MG513P3012V电机
- 阿里云服务器apt install 出错怎么办?出现Package gdb is not available, but is referred to by another package怎么办
- iOS 此应用需要开发者更新以在此ios版本上运行
- vue3 watch 监听多值以及深度监听用法
- Centos7配置DNS访问百度
- 当Android遇上设计模式之代理(Proxy)模式
- 梁漱溟:做学问的八层境界
- SparkStreaming读Kafka- Couldn't find leaders for Set
- Android百度地图地理围栏定位间隔
- 微波射频学习笔记22-------场效应管(MOS管)
热门文章
- 猜数字1~100内的数字
- 必看!爆火的“Staking经济”最全解读,普通人如何躺赚?(附指南)
- 长虹电视+刷回android,【当贝市场】长虹电视刷机方法,如何刷机
- 微信公众平台测试号的url和token原理
- 师者,传道授业解惑也
- macos安装joy工具
- hdl_graph_slam源码分析(4)——SLAM建图
- 怎么用计算机的记录,如何查看电脑使用记录,手把手教你查看电脑使用记录的方法...
- Python中的魔幻语法记录
- 思博伦收购octoScope