在图像中隐藏数据:用 Python 来实现图像隐写术

什么是“隐写术”?

隐写术是将机密信息隐藏在更大的信息中,使别人没法知道隐藏信息的存在以及隐藏信息内容的过程。隐写术的目的是保证双方之间的机密交流。与隐藏机密信息内容的密码学不一样,隐写术隐瞒了传达消息的事实。尽管隐写术与密码学有所不一样,可是二者之间有许多相似,而且一些做者会将隐写术归类为一种密码学形式,由于隐秘通讯也是一种机密消息。python

不少人学习python,不知道从何学起。
不少人学习python,掌握了基本语法事后,不知道在哪里寻找案例上手。
不少已经作案例的人,殊不知道如何去学习更加高深的知识。
那么针对这三类人,我给你们提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789git

使用隐写术比使用密码学加密有什么优点?

迄今为止,密码学一直是做用于保护发送者与接收者之间的保密性。然而,如今除了密码学以外,隐写术也愈来愈多地用于为须要被隐藏的数据添加更多保护层。使用隐写术比单独使用 密码学 的优点在于,有意加密的消息不会做为被监视的对象而引发注意。明显可见的加密消息,不管其多么难以解破,都会引发人们的注意。而且在 加密 是非法行为的国家中,这自己可能就是在犯罪。github

隐写术的分类

隐写术目前已经能够在图像、视频、文本或音频等多种传输媒介上进行。数组

基本的隐写术的分类模型

如上图所示,原始图像文件(X)和机密消息(M)都做为入参传入到隐写术编码器中。隐写术编码器函数 f(X,M,K) 经过使用最低有效位编码等技术将机密消息写入到封面图像文件中。最后生成的隐写术图像看起来与封面图像文件很是类似,肉眼难辨。这样就完成了编码。若要取出机密消息,将以前生成的隐写术图像输入隐写术解码器便可。函数

本文将使用 Python 来实现图像隐写术。手把手教您使用 Python 语言,经过一种叫“ 最低有效位(Least Significant Bit,LSB) ”的技术来隐藏文本消息。post

最低有效位隐写术

咱们能够将 数字图像 描述为一组有限的数字值,称为像素。像素是图像中最小的不可分割单位,其值表示在任何特定点上给定颜色的亮度。所以,咱们能够将图像想象为像素的矩阵(或二维数组),其中包含固定数量的行和列。学习

最低有效位(LSB)是一种将每一个像素的最后一位修改并用机密消息的数据位代替的技术。google

从上图能够清楚地看出,若是咱们修改最高有效位(MSB),它将对最终值产生更大的影响,可是若是咱们修改最低有效位(LSB),则对最终值的影响将是最小的,所以,咱们使用最低有效位隐写术。编码

最低有效位是如何工做的?

每一个像素包含三个值,红、绿、蓝,这些值的范围从 0 到 255,换句话说,它们是一个 8 位二进制数。让咱们举一个例子来讲明它是如何工做的,假设您想要将消息 “ hi ” 隐藏到一个 4x4 的图像中,该图像具备如下像素值:加密

[(225, 12, 99), (155, 2, 50), (99, 51, 15), (15, 55, 22),(155, 61, 87), (63, 30, 17), (1, 55, 19), (99, 81, 66),(219, 77, 91), (69, 39, 50), (18, 200, 33), (25, 54, 190)]

使用 ASCII 表 ,咱们能够先将机密消息转换为十进制值,而后再转换为二进制: 0110100 0110101 。如今,咱们对像素值逐一进行迭代,在将它们转换为二进制后,咱们将每一个最小有效位依次替换为该信息位。(例如 225 是 11100001,咱们替换最后一位,最右边的(1)和机密消息的第一位(0),依次类推)。这样的操做只会对像素值进行 +1 或 -1 的修改,所以肉眼根本看不出来。执行最低有效位隐写术后获得的像素值以下所示:

[(224, 13, 99),(154, 3, 50),(98, 50, 15),(15, 54, 23),(154, 61, 87),(63, 30, 17),(1, 55, 19),(99, 81, 66),(219, 77, 91),(69, 39, 50),(18, 200, 33),(25, 54, 190)]

使用 Python 在图像中隐藏文本

在本节中,咱们将使用 Python 代码逐步了解隐藏文本和显示文本的过程。首先,打开 google collab notebook ,按照下面的步骤操做:

在开始编写代码以前,可使用左侧菜单栏中的 upload 选项上传要用于隐写的图像(png 文件)。

第一步:导入全部必需的 Python 库。

第二步:定义一个能够将任何类型的数据转换为二进制数据的函数,咱们将在编码和解码阶段使用这个函数来将机密消息数据和像素值转换为二进制。

第三步:编写一个函数,经过改变最低有效位将机密消息隐藏到图像中。

第四步:定义一个函数,用于从隐藏后的图像中解码隐藏信息。

第五步:定义将输入的图像名称和机密消息做为用户的输入的函数。

第六步:建立一个函数,要求用户输入须要解码的图像的名称,而后调用 showData() 函数以返回解码后的消息。

第七步: 主函数

输出/结果:

加密消息:

解码消息:

若是您对代码感兴趣,能够在 Github 上查看个人 jupyter notebook 代码。

相关文章
相关标签/搜索