首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

重磅干货,第一时间送达

隐秘术是在任何文件中隐藏秘密数据的艺术。秘密数据可以是任何格式的数据,例如文本,甚至是文件。简而言之,隐写术的主要目的是在任何文件(通常是图像,音频或视频)中隐藏预期的信息,而无需实际更改文件的外观,即,其外观应与以前相同。

本期我们将一起学习基于图像的隐写术,即在图像中隐藏秘密数据。

但是在深入研究之前,让我们先看看图像的组成。

1.像素是图像的基础。

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

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

现在,让我们看看如何将数据编码和解码为图像形式。

01.编码方式

有很多算法可将数据编码到图像中,实际上,大家也可以自己制作。我们将使用的一个简单易于理解和实施的算法。具体步骤如下:

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

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

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

4.第九个值确定是否应读取更多像素。如果还有更多数据要读取(即编码或解码),则第九个像素变为偶数。否则,如果我们想停止进一步读取像素,则将其设为奇数。

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

02.应用实例

假设要隐藏的消息是‘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)]

第一步

第二步

读取前三个像素。

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

第三步

现在,将像素值更改为1的奇数,甚至更改为0的奇数,如数据的二进制等价形式。

例如,第一个二进制数为,第一个RGB值为27,则需要将其转换为偶数26。

类似地,由于下一个二进制数是,因此64被转换63为,1因此RGB值应设为奇数。

因此,修改后的像素为:

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

第四步

由于我们必须编码更多的数据,因此最后一个值应该是偶数。同样,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)]

03.解码

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

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

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

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

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

让我们开始一次读取三个像素。考虑我们以前编码的图像。

[(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,它是偶数,因此二进制位是。同样,对63,二进制位1和164它。该过程一直持续到八个RGB值为止。

第三步

我们最终得到二进制值:01001000将所有单个二进制值连接在一起之后。最终的二进制数据对应于十进制值72,并以ASCII表示字符H。

第4步

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

结果,我们得到的原始消息是Hii。

用于上述算法的Python程序如下:

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

04.程序示例

数据编码

数据解码

输入图像

medium.png

输出图像

newImage.png

05.局限性

对于JPEG 图像,此程序可能无法正常工作,因为JPEG使用有损压缩,这意味着修改了像素以压缩图像并降低质量,因此发生数据丢失。

参考文献

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

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

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

A GUI version of the program can be found here: https://github.com/goelashwin36/image-steganography

交流群

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201019A0394I00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券