简短介绍
如果有人不记得,隐秘术就是将信息隐藏在任何容器中。 例如,在图片中(
此处和
此处讨论)。 您还可以将数据隐藏在文件系统的服务表中(在
此处编写),甚至隐藏
在TCP服务数据包中 。 不幸的是,所有这些方法都有一个缺点:为了悄悄地“散布”容器中的信息,您需要巧妙的算法来考虑容器内部结构的特征。 是的,并且由于容器难以操纵,因此出现了问题:例如,如果您稍微编辑图片,则会丢失隐藏的信息。
是否有可能以某种方式省掉狡猾的算法和微妙的数据操作,同时仍能确保容器的性能和隐藏数据的可接受的安全性水平? 展望未来,我会说-是的,您可以! 甚至我都会提供实用程序。
血腥方法细节
基本思想很简单,就像击中额头一样:磁盘上的某些区域中操作系统从不写入(或在极少数情况下不写入)。 为了不需要使用狡猾的算法寻找这些区域,我们将使用冗余-也就是说,我们将在磁盘的所有扇区上重复很多次隐藏信息。 然后,在所有这些宏伟之上,您可以创建必要的分区,格式化文件系统,编写文件并安装OS-无论如何,部分秘密数据将被保存并可以提取,并且重复复制将帮助我们从碎片中组成原始整体。
这种方法的优势显而易见:我们不依赖于文件格式,甚至不依赖于所使用的文件系统的类型。
我认为缺点也很明显:
- 只能通过完全重写整个磁盘来更改机密数据,并随后对用户可见的内容进行重构。 同时,您不能使用从映像重新创建磁盘的软件:它将重新创建以前的秘密数据。
- 分类数据量越大,丢失某些信息的可能性越大。
- 从磁盘检索数据可能需要很长时间。 从几分钟到几天(现代光盘很大)。
现在让我们继续进行细节。
显然,如果您仅在磁盘上涂抹秘密数据,那么它们将只被肉眼隐藏。 如果您配备了磁盘编辑器,那么数据将焕然一新。 因此,最好对数据进行加密,使其不会闪烁。 根据aes256-cbc算法,我们将进行简单但有味道的加密。 我们要求用户提供加密密钥,让他想出一个好的密码。
下一个问题是我们如何区分“正确”数据和损坏数据。 这里的校验和将帮助我们,但不是简单的SHA1。 什么啊 对于git来说,它已经足够好了,这意味着它将适合我们。 决定:我们为每个保存的信息提供一个校验和,如果解密后重合,则解密成功。
您还需要片段号和机密数据的总长度。 片段编号-跟踪我们已经解密的哪些片段以及剩余的片段。 在处理最后一个片段时,总长度对我们很有用,以免写入多余的数据(换句话说,填充)。 好吧,由于我们仍然获得标题,因此我们将在其中添加秘密文件的名称。 解密后它将派上用场,以免猜测如何打开它。
实际检查方法
为了进行验证,我们采用了最常见的媒体-闪存驱动器。 我发现一个旧的1 GB,非常适合实验。 如果您像我一样,不使用物理介质进行蒸汽浴,而是在文件(即磁盘映像)上进行测试,那我马上就说:这行不通。 格式化此类“磁盘”时,Linux会再次创建文件,并且所有未使用的扇区将填充零。
不幸的是,作为Linux机器,我不得不使用位于阳台上的Raspberry Pi 3上的气象站,那里的内存不足,因此我们不会隐藏大文件。 我们限制自己的最大大小为10兆字节。 隐藏太小的文件也没有意义:该实用程序将数据写入4 Kb群集中的磁盘。 因此,从下面我们将自己限制为一个3 kb的文件-它适合一个这样的群集。
我们将分阶段模拟闪存驱动器,在每个阶段之后检查是否读取了隐藏信息:
- 以FAT16格式快速格式化,簇大小为16 kb。 这就是Windows 7建议与没有文件系统的闪存驱动器一起使用的方法。
- 50%的闪存盘中充满各种垃圾。
- 用各种垃圾填充闪存驱动器是100%。
- FAT16格式的“长”格式(覆盖所有内容)。
前两个测试有望以完全胜利告终:该实用程序能够从闪存驱动器中成功提取10 MB的敏感数据。 但是在闪存驱动器中充满了文件之后,发生了故障:
Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile
如您所见,只有158个群集被成功解密(632 KB的原始数据,产生636424字节的有效负载)。 显然,没有办法获得10兆字节,并且这些群集之间显然存在重复。 这样一来,即使是1 MB也无法恢复。 但是可以保证,即使在格式化并写入闪存后,我们仍将从闪存驱动器中恢复3 KB的敏感数据。 但是,实验表明,从这样的闪存驱动器中提取120 KB文件是很有可能的。
不幸的是,最后一次测试显示闪存驱动器被全部覆盖:
$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile
可惜的是,没有一个集群幸存下来。 让我们尝试在格式化之前在闪存驱动器上创建一个分区,并且已经在其中-文件系统。 顺便说一句,她以这种格式从工厂来的,所以我们没有做任何可疑的事情。
预计闪存驱动器上的可用空间会略有减少。
预计在完全堵塞的驱动器上仍无法隐藏10 MB。 但是现在,成功解密的集群的数量增加了一倍以上!
Total clusters read: 250752, decrypted: 405
不幸的是,一个兆字节不能拼成一个小块,但是200 kb很容易。
好吧,这是最后一次第四次检查的消息,这次很令人高兴:这样的闪存驱动器的完整格式并没有导致所有信息的破坏! 120 KB的秘密数据完全适合未使用的空间。
测试汇总表:

一些理论化:关于可用空间和未使用的扇区
如果您曾经对硬盘进行分区,则可能会注意到,分配磁盘上的所有可用空间远非总是可能。 第一部分始终以某些缩进(通常为1兆字节,即2048个扇区)开头。 在最后一节的后面也发生了,仍然有一小部分未使用的扇区。 有时,各部分之间存在间隙,尽管很少。
换句话说,磁盘上的某些扇区在正常使用磁盘期间无法访问,但是您可以将数据写入这些扇区! 这也意味着阅读。 调整为还存在一个分区表和引导加载程序代码,它们仅位于磁盘开头的空白区域。
让我们将注意力从分区中分散一会儿,然后从高空看磁盘,可以说是鸟类的飞行。 在这里,磁盘上有一个空分区。 在其中创建一个文件系统。 是否可以说磁盘上的某些扇区仍处于解锁状态?
一鼓一鼓! 答案几乎总是-是的! 实际上,在大多数情况下,文件系统的创建归结为以下事实:仅将几个服务信息块写入磁盘,但是该部分的内容不会更改。
但是,纯粹凭经验,我们可以假定文件系统不能总是占用分配给最后一个扇区的所有空间。 例如,一个簇大小为64 KB的FAT16文件系统显然将无法完全占用一个不是64 KB的倍数的分区。 在此部分的末尾,尾部应保留在几个扇区中,无法存储用户数据。 但是,从实验上来说,这一假设无法得到证实。
因此,为了最大化可用于隐藏图像的空间,您需要使用具有群集大小的较大文件系统。 即使分区是可选的,您仍然可以创建分区(例如,在闪存驱动器上)。 不必创建空白部分或保留未分配的区域-这将引起感兴趣的公民的注意。
实验实用程序
实用程序资源可以在
这里找到
。要构建,您将需要Qt 5.0和更高版本以及OpenSSL。 如果什么都不会发生,则可能必须修复steganodisk.pro文件。
您可以将群集大小从4 KB更改为512字节(在secretfile.h中)。 同时,用于官方信息的费用将增加:标头和校验和占据固定的68个字节。
当然,您必须具有root用户权限并谨慎运行该实用程序。 覆盖指定的文件或设备之前不会有任何问题!
好好享受