什么是“隐写术”?
隐写术是将机密信息隐藏在更大的信息中,使别人无法知道隐藏信息的存在以及隐藏信息内容的过程。隐写术的目的是保证双方之间的机密交流。与隐藏机密信息内容的密码学不同,隐写术隐瞒了传达消息的事实。尽管隐写术与密码学有所不同,但是两者之间有许多类似,并且一些作者会将隐写术归类为一种密码学形式,因为隐秘通信也是一种机密消息。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
使用隐写术比使用密码学加密有什么优势?
迄今为止,密码学一直是作用于保护发送者与接收者之间的保密性。然而,现在除了密码学之外,隐写术也越来越多地用于为需要被隐藏的数据添加更多保护层。使用隐写术比单独使用 密码学 的优势在于,有意加密的消息不会作为被监视的对象而引起注意。明显可见的加密消息,无论其多么难以解破,都会引起人们的注意。并且在 加密 是非法行为的国家中,这本身可能就是在犯罪。
隐写术的分类
隐写术目前已经可以在图像、视频、文本或音频等多种传输媒介上进行。
基本的隐写术的分类模型
如上图所示,原始图像文件(X)和机密消息(M)都作为入参传入到隐写术编码器中。隐写术编码器函数 f(X,M,K) 通过使用最低有效位编码等技术将机密消息写入到封面图像文件中。最后生成的隐写术图像看起来与封面图像文件非常相似,肉眼难辨。这样就完成了编码。若要取出机密消息,将之前生成的隐写术图像输入隐写术解码器即可。
本文将使用 Python 来实现图像隐写术。手把手教您使用 Python 语言,通过一种叫“ 最低有效位(Least Significant Bit,LSB) ”的技术来隐藏文本消息。
最低有效位隐写术
我们可以将 数字图像 描述为一组有限的数字值,称为像素。像素是图像中最小的不可分割单位,其值表示在任何特定点上给定颜色的亮度。因此,我们可以将图像想象为像素的矩阵(或二维数组),其中包含固定数量的行和列。
最低有效位(LSB)是一种将每个像素的最后一位修改并用机密消息的数据位代替的技术。
从上图可以清楚地看出,如果我们修改最高有效位(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 代码。