作者 | 小白

来源 | 小白学视觉

隐写术是在任何文件中隐藏秘密数据的艺术。

秘密数据可以是任何格式的数据,如文本甚至文件。简而言之,隐写术的主要目的是隐藏任何文件(通常是图像、音频或视频)中的预期信息,而不实际改变文件的外观,即文件外观看起来和以前一样。

在这篇文章中,我们将重点学习基于图像的隐写术,即在图像中隐藏秘密数据。

但在深入研究之前,让我们先看看图像由什么组成:

  1. 像素是图像的组成部分。

  2. 每个像素包含三个值:(红色、绿色、蓝色)也称为 RGB 值。

  3. 每个 RGB 值的范围从 0 到 255。

现在,让我们看看如何将数据编码和解码到我们的图像中。

编码

有很多算法可以用来将数据编码到图像中,实际上我们也可以自己制作一个。在这篇文章中使用的一个很容易理解和实现的算法。

算法如下:

  1. 对于数据中的每个字符,将其 ASCII 值转换为 8 位二进制 [1]。

  2. 一次读取三个像素,其总 RGB 值为 3*3=9 个。前八个 RGB 值用于存储一个转换为 8 位二进制的字符。

  3. 比较相应的RGB值和二进制数据。如果二进制数字为 1,则 RGB 值将转换为奇数,否则为偶数。

  4. 第 9 个值确定是否应该读取更多像素。如果有更多数据要读取,即编码或解码,则第 9 个像素变为偶数;否则,如果我们想停止进一步读取像素,那就让它变得奇数。

重复这个过程,直到所有数据都被编码到图像中。

例子

假设要隐藏的消息是‘Hii’。

消息是三个字节,因此,对数据进行编码所需的像素为 3 x 3 = 9。考虑一个 4 x 3 的图像,总共有 12 个像素,这足以对给定的数据进行编码。

[(27, 64, 164), (248, 244, 194), (174, 246, 250), (149, 95, 232),
(188, 156, 169), (71, 167, 127), (132, 173, 97), (113, 69, 206),
(255, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

第 1 步

H 的 ASCII 值为 72 ,其二进制等效值为 01001000 。

第 2 步

读取前三个像素。

(27, 64, 164), (248, 244, 194), (174, 246, 250)

第 3 步

现在,将像素值更改为奇数为 1,偶数为 0,就像在二进制等效数据中一样。

例如,第一个二进制数字是0,第一个 RGB 值是 27 ,它需要转换为偶数,这意味着 26 。类似地,64 被转换为 63 因为下一个二进制数字是1 所以 RGB 值应该是奇数。

因此,修改后的像素为:

(26, 63, 164), (248, 243, 194), (174, 246, 250)

第4步

由于我们必须对更多数据进行编码,因此最后一个值应该是偶数。同样,i可以在这个图像中进行编码。

通过执行 +1 或 -1 使像素值成为奇数/偶数时,我们应该注意二进制条件。即像素值应大于或等于 0 且小于或等于 255 。

新图像将如下所示:

[(26, 63, 164), (248, 243, 194), (174, 246, 250), (148, 95, 231),
(188, 155, 168), (70, 167, 126), (132, 173, 97), (112, 69, 206),
(254, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

解码

对于解码,我们将尝试找到如何逆转之前我们用于数据编码的算法。

  1. 同样,一次读取三个像素。前 8 个 RGB 值为我们提供了有关机密数据的信息,第 9 个值告诉我们是否继续前进。

  2. 对于前八个值,如果值为奇数,则二进制位为 1 ,否则为 0 。

  3. 这些位连接成一个字符串,每三个像素,我们得到一个字节的秘密数据,这意味着一个字符。

  4. 现在,如果第 9 个值是偶数,那么我们继续一次读取三个像素,否则,我们停止。

例如

让我们开始一次读取三个像素。

考虑我们之前编码的图像。

[(26, 63, 164), (248, 243, 194), (174, 246, 250), (148, 95, 231),
(188, 155, 168), (70, 167, 126), (132, 173, 97), (112, 69, 206),
(254, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

第1步

我们首先读取三个像素:

[(26, 63, 164), (248, 243, 194), (174, 246, 250)

第2步

读取第一个值:26,它是偶数,因此二进制位是 0 。类似地,对于 63 ,二进制位是 1 ,对于 164 它是 0 。这个过程一直持续到 8 个 RGB 值。

第 3 步

将所有二进制值连接后,我们最终得到二进制值:01001000。最终的二进制数据对应于十进制值 72,在 ASCII 中,它代表字符 H 。

第 4 步

由于第 9 个值是偶数,我们重复上述步骤。当遇到的第 9 个值是奇数时,我们停止。

结果,我们得到了原始信息,即 Hii 。

上述算法的 Python 程序如下:

# Python program implementing Image Steganography# PIL module is used to extract
# pixels of image and modify it
from PIL import Image# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):# list of binary codes# of given datanewd = []for i in data:newd.append(format(ord(i), '08b'))return newd# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):datalist = genData(data)lendata = len(datalist)imdata = iter(pix)for i in range(lendata):# Extracting 3 pixels at a timepix = [value for value in imdata.__next__()[:3] +imdata.__next__()[:3] +imdata.__next__()[:3]]# Pixel value should be made# odd for 1 and even for 0for j in range(0, 8):if (datalist[i][j] == '0' and pix[j]% 2 != 0):pix[j] -= 1elif (datalist[i][j] == '1' and pix[j] % 2 == 0):if(pix[j] != 0):pix[j] -= 1else:pix[j] += 1# pix[j] -= 1# Eighth pixel of every set tells# whether to stop ot read further.# 0 means keep reading; 1 means thec# message is over.if (i == lendata - 1):if (pix[-1] % 2 == 0):if(pix[-1] != 0):pix[-1] -= 1else:pix[-1] += 1else:if (pix[-1] % 2 != 0):pix[-1] -= 1pix = tuple(pix)yield pix[0:3]yield pix[3:6]yield pix[6:9]def encode_enc(newimg, data):w = newimg.size[0](x, y) = (0, 0)for pixel in modPix(newimg.getdata(), data):# Putting modified pixels in the new imagenewimg.putpixel((x, y), pixel)if (x == w - 1):x = 0y += 1else:x += 1# Encode data into image
def encode():img = input("Enter image name(with extension) : ")image = Image.open(img, 'r')data = input("Enter data to be encoded : ")if (len(data) == 0):raise ValueError('Data is empty')newimg = image.copy()encode_enc(newimg, data)new_img_name = input("Enter the name of new image(with extension) : ")newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))# Decode the data in the image
def decode():img = input("Enter image name(with extension) : ")image = Image.open(img, 'r')data = ''imgdata = iter(image.getdata())while (True):pixels = [value for value in imgdata.__next__()[:3] +imgdata.__next__()[:3] +imgdata.__next__()[:3]]# string of binary databinstr = ''for i in pixels[:8]:if (i % 2 == 0):binstr += '0'else:binstr += '1'data += chr(int(binstr, 2))if (pixels[-1] % 2 != 0):return data# Main Function
def main():a = int(input(":: Welcome to Steganography ::\n""1. Encode\n2. Decode\n"))if (a == 1):encode()elif (a == 2):print("Decoded Word :  " + decode())else:raise Exception("Enter correct input")# Driver Code
if __name__ == '__main__' :# Calling main functionmain()

程序中使用的模块是 PIL ,它代表Python 图像库,它使我们能够在 Python 中对图像执行操作。

程序执行

数据编码

数据解码

输入图像

输出图像

局限性

该程序可能无法对 JPEG 图像按预期处理,因为 JPEG 使用有损压缩,这意味着修改像素以压缩图像并降低质量,因此会发生数据丢失。

参考

  1. https://www.geeksforgeeks.org/program-decimal-binary-conversion/

  2. https://www.geeksforgeeks.org/working-images-python/

  3. https://dev.to/erikwhiting88/let-s-hide-a-secret-message-in-an-image-with-python-and-opencv-1jf5

  4. A code along with the dependencies can be found here: https://github.com/goelashwin36/image-steganography

资讯

谷歌使出禁用2G大招

技术

干货满满的python实战项目!

技术

25个Python文本处理案例

技术

11款可替代top命令的工具!

分享

点收藏

点点赞

点在看

如何使用 Python 隐藏图像中的数据相关推荐

  1. 基于Pyhton的图像隐写术--如何隐藏图像中的数据

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 隐秘术是在任何文件中隐藏秘密数据的艺术.秘密数据可以是任何格式的数 ...

  2. 使用OpenCV和Python从图像中提取形状

    Welcome to the first post in this series of blogs on extracting features from images using OpenCV an ...

  3. 编程实战(4)——python识别图像中的坐标点并保存坐标数据

    编程实战(4)--python识别图像中的坐标点并保存坐标数据 文章目录 编程实战(4)--python识别图像中的坐标点并保存坐标数据 综述 代码思路 库的安装 图片预处理 图像细化 图像二极化 提 ...

  4. 使用python读取excel中的数据,并绘制折线图

    使用python读取excel中的数据,并绘制折线图 做实验的时候采集到一些数据,从文本拷贝到excel,然后从十六进制转换成十进制.图表是分析数据的有利工具,使用python绘制出的图表简明美观.所 ...

  5. Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件、zip压缩文件

    Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件.zip压缩文件 目录 Python将Pandas中Dataframe数据保存为gzip/zip文件:gz ...

  6. python向数据库写入数据_如何用Python向Mysql中插入数据

    我们使用Python经常会和Postgresql进行搭配,很少将python和mysql进行搭配.下面小编给大家分享如何用Python向Mysql中插入数据. 工具/原料 Pycharm 方法/步骤 ...

  7. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  8. 【论文党福利】如何提取图像中的数据

    [论文党福利]如何提取图像中的数据 从事科研的老师和同学们在撰写论文时,经常需要将文献中的曲线与自己的结果进行对比,为获取原始数据,最靠谱的方法当然是找原作者要.如果没有要到呢?本文将成为论文党的福利 ...

  9. python 从同花顺获取数据导出,通达信PYTHON读取本地数据,如何使用python在文件中读取数据?...

    Q1:如何使用python在文件中读取数据? file = open('a','r').readlines()[1] Q2:python怎么将本地一个文件夹的所有文本读进内存中 列出文件,把各个文件打 ...

最新文章

  1. 泰尔指数r语言_还在用Excel算区位基尼系数?用geo.gini吧!
  2. OSPF如何选举DR/BDR规则
  3. Java实现BASE64编解码
  4. 通过Zookeeper动态感知服务器上下线[案例]
  5. html5 去掉 li的样式,css li 去掉点的样式写法
  6. warning: directory not found for option“XXXXXX”
  7. 查询表授权给谁了_SQL Server 全局临时表竞争条件漏洞利用
  8. 企业要做好安全遵从的五个实用技巧
  9. PyTorch源码解读之torch.utils.data.DataLoader
  10. Python案例实操1-网络爬虫
  11. 50以内的质数顺口溜_100以内的质数顺口溜口诀
  12. iOS学习爬坑记录4:ios8中的搜索栏,使用UISearchController
  13. HMM原理解析(转载)
  14. AMiner推荐论文
  15. 教你认识系统进程_电脑维修啦 PCWXL.com
  16. Swift新async/await并发模型中子任务取消不能被其它子任务感知的原因及解决
  17. Terraform学习2
  18. VS2008+DDK+ddkwizard环境的配置
  19. java 时分秒 转换 秒_JAVA将时分秒格式的时间转化成秒数
  20. Mac 平台 Android FFmpeg 编译与集成实践

热门文章

  1. 学习Python有什么优势?
  2. linux之shell脚本学习篇一
  3. Linux命令-安装zip和unzip命令
  4. PostgreSQL:Java使用CopyManager实现客户端文件COPY导入
  5. 用 Handler 轻松实现专属Android定时器
  6. 我和freelancer不得不说的故事5 --- 心理落差
  7. CentOS6.3编译安装Nginx1.4.7 + MySQL5.5.25a + PHP5.3.28
  8. 关于ProGuard的学习了解(从别处转来)
  9. SpringBoot面试题及答案 110道(持续更新)
  10. java-方法。(新手)