当谈到破解隐写术时——就像其他夺旗挑战一样,你可以遵循一种特定的方法。虽然有无数的在线解密和加密工具,但本指南的目的是向展示如何分析文件并了解隐写术的工作原理。 在本指南中,我们将检查文件压缩和最低有效位——可以用到的工具和方法。
首先,当获得图像时,第一步是启动终端并在命令行中运行“文件”以检查文件。假设它是 png 或 jpg 图像——特别注意图像的大小和图像的颜色深度——它是 8 位还是 16 位?
$ file photo.png
对于存储在图像中的可能消息的被动概览,请运行“字符串”命令并查看是否有任何感兴趣的隐藏文本。有时,可以在文件中配置有用的句子——曾经遇到过一个问题,把“IV:Prince”和“Rijndael”这两个词存储在 jpg 文件中。对于那些熟悉密码学的人,会认识到 IV 代表初始化向量,而 Rijndael 是AES(一种常用的密码块算法)的创建者之一。
$ strings photo.png
通过运行这两个命令,已经进行了被动侦察,通常不会发现任何有趣的东西。但是,最好的做法是尽可能多地收集有关该文件的信息,以防万一出现任何问题。
Binwalk 是一种用于分析、逆向工程和检查文件组成的工具。用法非常简单:
$ binwalk photo.png
DECIMAL HEXADECIMAL DESCRIPTION
-------------------------------------------------
0 0x0 PNG image data,
10541 0x292D Zip archive data
该工具将立即分解文件的组成。正如在上面看到的,该文件包含两个隔间 - png 图像数据和一个 zip 文件。通常在这些情况下,zip 文件的提取会给你一个标志,但是在其他情况下,它是一个潘多拉的盒子,在封装中封装(文件中的文件),你必须按照该方法几次来提取最后。 要提取隐藏文件,请运行带有标志“-e”的命令来提取
$ binwalk -e photo.png
这将自动将外部文件解压缩到的当前目录中。此时,“cat”文件以打印内容,检查使用“文件”和“字符串”提取的文件类型,然后再次重复该过程。 提示:通过运行以下命令查看 hexdump,比较提取前后的文件:
$ xxd <your_decompressed_file> | less
Pngcheck是检查任何图像损坏或看起来不合适的部分的好工具。对 png 文件的构成有一个基本的了解对很重要。通常,png 文件是在非关键数据的“块”中创建的。这些“块”类具有与该特定图像相关的特定名称和功能。
要以详细模式运行 pngcheck,请执行以下操作:
$ pngcheck -v photo.png
检查呈现的块。特别要注意以下块:
tEXT:存储在 ISO/IEC 8859-1 中呈现的文本
zTXt:压缩文本
iTXt:可压缩的 UTF-8 文本
pHYs:提供与图像的预期像素大小相关的信息
图像由像素组成。每个像素都包含一个标识,通常称为 RGB。由于计算机以二进制(零和一)的形式表示数据,RGB 代码也可以以相同的方式表示。RGB 的每个值都是一个从 0 到 255 的数字。知道一个字节(由 8 位组成)最多可以存储 255 的二进制数字 – 像素的 RGB 代码以二进制格式存储,如下所示:
Pale Yellow
RGB: 200, 180, 120
Hexadecimal RGB: (C8, B4, 78)
Binary: 11001000, 10110100, 01111000
最低有效位原理也称为最右位原理,因为字节的最后一位值,如果翻转/改变,不会影响肉眼的图像组成。
这意味着,如果将所有这些更改的位聚合在一起并将二进制转换为 ascii - 将找到隐藏的消息。 将每个像素转换为 RGB 的一种简单方法是使用名为PIL的 Python 模块,该模块专为图像处理而设计。以下代码将图像中的每个像素转换为其各自的二进制代码(即一个字节——或每个 R、G 和 B 一个二进制数),然后仅打印出每个像素的最后一位(最低有效位)。
from PIL import Image
im = Image.open("photo.png")
pix = im.load()
for i in range(width):
for j in range(height):
print(bin(pix[j,i][ 0])[-1] + bin(pix[j,i][1])[-1] + bin(pix[j,i][2])[-1], end='')
按照上面的代码,可以将其保存在变量中,然后将其转换为 ascii 以检索消息,而不是打印出二进制文件。
print(binascii.a2b_uu(your_string))