隐写术:在事物中隐藏事物的艺术与科学 - 第一部分
Dakota Nelson* // 第一部分:图像格式
如果我告诉你这只可爱的小狗隐藏了一条秘密信息,你会怎么想?
在这篇文章中,我们将了解如何让这只狗为我们隐藏信息……以及如何揭示它的秘密。在此过程中,我们将深入了解图像的工作原理,以及足以让你高中老师说“我早就告诉过你”的数学知识。
让我们从基础开始。你可能已经知道其中的一些内容,但请耐心听我讲。
计算机实际上只是处理比特的东西:
01100010 01101100 01100001 01100011 01101011 01101000 01101001 01101100 01101100 01110011 01101001 01101110 01100110 01101111 01110011 01100101 01100011 00101110 01100011 01101111 01101101 00101111 01101100 01101100
并将它们转换成其他比特:
01101010 01101111 01101000 01101110 00100000 01110010 01101111 01100011 01101011 01110011
这构成了世界信息处理的核心。在手机、计算机、互联网以及所有数字设备之下,一切都只是一和零的模式。
不幸的是,没有多少人能读懂二进制,因此这些比特必须转换成实际人类能够理解的东西(因为至少目前,计算机是为人类服务的)。
这带来了问题。谁来决定哪些比特模式在屏幕上变成什么文字和图片?没有人,就是这样。呃,也可以说是每个人。或者可能只是某些特定的人?事实证明,这是一团糟。不同的人和团体,在不同的时间,出于不同的原因,都曾插旗宣称“这就是将一堆比特转换成猫图像的方法!”例如,每当你看到一个搞笑的GIF时,你可以感谢1987年在CompuServe工作的优秀人士,他们决定了GIF的工作方式(但不知道为什么没有决定我们应该如何发音GIF)。想了解更多关于GIF的信息吗?这是它们的完整规范。没关系,我会等。
现在你已经记住了整个GIF格式(你做到了,对吧?稍后会有测验),我们可以继续了。这一切与隐藏东西有什么关系?嗯,我们需要一个地方来隐藏。可以把它看作是在新办公室中寻找最好的捉迷藏地点。
例如,在位图格式中(我们将在本文的其余部分处理;位图文件以.bmp
结尾),每个像素包含一个R、G和B(红、绿、蓝)值,每个值都是一个字节(八位)。由于如果你正确混合红、绿和蓝,可以将它们组合成任何颜色,这意味着仅这三个值就可以让一个像素成为任何颜色。当你得到一个大的像素列表,并决定如何塑造这个列表(即,这500个像素是100 x 5像素的图像,还是50 x 10像素的图像,还是……),那么你可以将这一长串值显示为图像。为什么我们在这里使用位图?因为它们非常简单。
是的,简单。
这意味着我刚刚制作的这个极其蹩脚的2x2像素图像:
实际上是这个: 01000010 01001101 01000110 00000000 00000000 00000000 BMF… 00000000 00000000 00000000 00000000 00110110 00000000 ….6. 00000000 00000000 00101000 00000000 00000000 00000000 ..(… 00000010 00000000 00000000 00000000 00000010 00000000 …… 00000000 00000000 00000001 00000000 00011000 00000000 …… 00000000 00000000 00000000 00000000 00010000 00000000 …… 00000000 00000000 00000000 00000000 00000000 00000000 …… 00000000 00000000 00000000 00000000 00000000 00000000 …… 00000000 00000000 00000000 00000000 00000000 00000000 …… 11111111 00100110 00000000 00000000 00000000 00000000 .&…. 00000000 00000000 00000000 00000000 11111111 00000000 …… 01111111 01011011 00000000 00000000 .[..
但为什么我们要学习这个?我们甚至还没有隐藏任何东西!别担心——我们很快就会。首先,我们需要在寻找隐藏地点的过程中毁掉一些 perfectly good 图片。
使用数字的一个含义是所有比特都是平等的,但有些比特比其他比特更平等。如果你有5005,并将左边的5改为6,这比将右边的5改为6(差值为一)的差异要大得多(差值为一千)。左边千位上的五被称为“最高有效数字”,而右边个位上的五则是“最低有效数字”,选择改变哪个五非常重要。
让我们快速回顾一下:图像(至少我们将在这里处理的那些)由排列在网格中的像素组成。每个像素由三个值组成;R、G和B。通过混合红、绿和蓝值,像素可以是任何颜色。就像在“常规”数字中一样,组成像素的二进制数字越靠左,其重要性(影响越大)就越大。
在图像中,每个像素的R、G和B中的最低有效位几乎什么都不做,而最高有效位真的可以毁了你的一天。例如,这是当你从黑白位图中逐层取出8位中的每一位,并用每一层制作图像时发生的情况。每个图像代表一个“重要性级别”的比特;最高有效位在左上角,最低有效位在右下角。
看到最高有效位(左上角)如何构成图像的大部分,而最低有效位(右下角)基本上只是随机噪声了吗?我敢打赌,你可以改变所有这些最低有效位(甚至可能是最后两位),最终图像看起来不会有什么不同……也许你可以以某种模式改变它们……比如在消息中。只是一个想法。
当我们拿走那只小狗,并将每个像素(每个R、G和B)的最低有效位翻转为全部为1,然后将最后两位都翻转为1,接着最后三位,依此类推时,会发生以下情况:
你注意到前几个看起来完全没问题吗?因此得出结论:我们绝对可以翻转图像每个像素值的前几位,并随意更改它们,没有人能够察觉。
我们刚刚找到了一个隐藏的地方。
*Dakota 运营 Striker Security - 你可以在 https://strikersecurity.com/blog 找到更多他的文章
准备好学习更多了吗? 通过 Antisyphon 的实惠课程提升你的技能! 随付随训培训 提供实时/虚拟和点播服务