- 原文地址:Hiding data in an image : Image Steganography using Python
- 原文做者:Rupali Roy
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:Jessica
- 校对者:江不知,Baddyo
现在,世界正在经历一场史无前例的数据爆炸。咱们天天产生着的使人难以置信的数据量。《福布斯》文章**“咱们天天创造了多少数据?”**中指出,按照咱们目前的速度,天天大约创造了 2.5 亿字节的数据,可是这种速度会随着物联网(IoT)的增加而加速。仅在过去的两年中,咱们就产生了全球 90% 的数据。这篇文章反应的数据爆炸现象须要引发咱们的重视!php
数据。本质上,现代计算机世界就是围绕着这个词展开的。但它到底有什么魅力使咱们如此着迷呢?在当今世界,不少企业已经开始意识到数据的强大力量,由于它能够潜在地预测客户趋势,增长销售并将公司规模推向更高的高度。随着技术的快速进步和数据使用方式的不断创新,确保数据安全已成为咱们的重中之重。数据共享愈来愈多,由于天天都有成千上万的信息和数据在互联网上从一个地方传送到另外一个地方。数据的保护是发送方最关心的问题,以一种只有接收方可以理解的加密方式加密咱们的消息是很是重要的。前端
在本文中,咱们将了解什么是最低有效位隐写术以及如何用 Python 来实现它。python
隐写术是将机密信息隐藏在更大的信息中,使别人没法知道隐藏信息的存在以及隐藏信息内容的过程。隐写术的目的是保证双方之间的机密交流。与隐藏机密信息内容的密码学不一样,隐写术隐瞒了传达消息的事实。尽管隐写术与密码学有所不一样,可是二者之间有许多相似,而且一些做者会将隐写术归类为一种密码学形式,由于隐秘通讯也是一种机密消息。android
迄今为止,密码学一直是做用于保护发送者与接收者之间的保密性。然而,如今除了密码学以外,隐写术也愈来愈多地用于为须要被隐藏的数据添加更多保护层。使用隐写术比单独使用密码学的优点在于,有意加密的消息不会做为被监视的对象而引发注意。明显可见的加密消息,不管其多么难以解破,都会引发人们的注意。而且在加密是非法行为的国家中,这自己可能就是在犯罪。[1]ios
隐写术目前已经能够在图像、视频、文本或音频等多种传输媒介上进行。git
如上图所示,原始图像文件(X)和机密消息(M)都做为入参传入到隐写术编码器中。隐写术编码器函数 f(X,M,K) 经过使用最低有效位编码等技术将机密消息写入到封面图像文件中。最后生成的隐写术图像看起来与封面图像文件很是类似,肉眼难辨。这样就完成了编码。若要取出机密消息,将以前生成的隐写术图像输入隐写术解码器便可。[3]github
本文将使用 Python 来实现图像隐写术。手把手教您使用 Python 语言,经过一种叫“最低有效位(Least Significant Bit,LSB)”的技术来隐藏文本消息。后端
咱们能够将数字图像描述为一组有限的数字值,称为像素。像素是图像中最小的不可分割单位,其值表示在任何特定点上给定颜色的亮度。所以,咱们能够将图像想象为像素的矩阵(或二维数组),其中包含固定数量的行和列。数组
最低有效位(LSB)是一种将每一个像素的最后一位修改并用机密消息的数据位代替的技术。安全
从上图能够清楚地看出,若是咱们修改最高有效位(MSB),它将对最终值产生更大的影响,可是若是咱们修改最低有效位(LSB),则对最终值的影响将是最小的,所以,咱们使用最低有效位隐写术。
每一个像素包含三个值,红、绿、蓝,这些值的范围从 0 到 255,换句话说,它们是一个 8 位二进制数[4]。让咱们举一个例子来讲明它是如何工做的,假设您想要将消息 “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 代码逐步了解隐藏文本和显示文本的过程。首先,打开 google collab notebook,按照下面的步骤操做:
在开始编写代码以前,可使用左侧菜单栏中的 upload 选项上传要用于隐写的图像(png 文件)。
第一步: 导入全部必需的 Python 库。
第二步: 定义一个能够将任何类型的数据转换为二进制数据的函数,咱们将在编码和解码阶段使用这个函数来将机密消息数据和像素值转换为二进制。
第三步: 编写一个函数,经过改变最低有效位将机密消息隐藏到图像中。
第四步: 定义一个函数,用于从隐藏后的图像中解码隐藏信息。
第五步: 定义将输入的图像名称和机密消息做为用户的输入的函数。
第六步: 建立一个函数,要求用户输入须要解码的图像的名称,而后调用 showData() 函数以返回解码后的消息。
第七步: 主函数
输出/结果:
加密消息:
解码消息:
若是您对代码感兴趣,能够在 Github 上查看个人 jupyter notebook 代码。
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。