图片马赛克可以恢复?福尔摩🐷教您去除图片的马赛克
作者:FancyPig | 发布时间: | 更新时间:
杂谈
之前有人问我能不能去除图片的马赛克,恢复图片,我当时是很确信的说「不能」
经过最近热心网友的分享,我现在想更改一下我的结论「有可能」
挑战题目
原版
来自JumpSec的挑战题目,原文《Can Depix deobfuscate your data?》(译为:《Depix能对你的数据进行解密吗?》)

您可以尝试通过阅读本文,最终破解上面的马赛克部分!
猪头的题目
猪头给大家准备了下面的题目,看看你能不能通过本文提供的工具将他转换回原始的字符!
我们在文末会揭晓答案!

视频讲解
近日,BishopFox安全公司的首席研究员Dan Petro公开了一项研究成果。用自己写的工具可以将打了马赛克的文字进行还原。
图文讲解
以下内容来源《Never, Ever, Ever Use Pixelation for Redacting Text》

马赛克的工作原理
想进行图片马赛克恢复,首先要弄懂马赛克的原理。
马赛克看起来像这样:


这个算法非常简单:你把你的图像分成一个给定大小的网格(上面的例子是8x8)。
然后,对于每个区块,你将编辑后的图像的颜色设置为等于同一区域内原始图像的平均颜色。
就是这样--只是对每个区块进行滚动像素平均。

这种效果有点像把图像的信息 "涂抹 "在每个区块上。虽然在这个过程中会丢失一些信息,但绝对会有很多信息被泄露出来。
而我们正是要利用这些泄露的信息来发挥我们的优势。
值得注意的是,这种算法被广泛地标准化了,因为它是如此简单。
因此,无论你是在GiMP、Photoshop,还是在其他任何工具中进行编辑,编辑的结果都是一样的。
对于我们的概念证明,我们假设攻击者知道。
- 文本的字体类型
- 文本的字体大小
- 文本前几个字
我认为这些假设是相当合理的,因为现实中,攻击者可能会收到一份完整的报告,只是有一部分被编辑掉了。
在我们的挑战文本中,你可以看到在像素化的文本上方有几个字,给我们提供了这些信息。

思路分享
被还原的内容是在本地完成打码过程。从密码学的角度来解释,就是这些信息还没有扩散(diffusion)。
因此,如果原始图片中某个像素有所变化,也只会影响到这个像素所对应的色块,对整体影响不大。所以,可以对字符进行循环深度优先搜索,推测字母内容,再根据与编辑文本的边缘匹配程度确定字母。简单来说码就是猜到一个字母a,就拿a打码之后的图片与原来打码后的字母对照,查看匹配度。不过这个过程也需要解决一些难题。
- 字母溢出字符不会与色块一一对齐,有时候两个字母的一部分会存在于同一个色块里。随意会导致一些错误。在这种情况下,就要调整算法,让它把色块切断,只保留一边。

- 空格如果字母前后有空格,再加上问题1的影响,也会导致算法枚举、匹配的结果出错。这个时候,依旧需要对相对空白的色块进行特殊分割,并调低阈值。

- 字母宽度不同字母宽度不同,占用的空间不一样,而有些排版方式会让不同的字母等宽。在等宽的情况下,猜测的难度会增大。而如果字母以原始宽度呈现,就会更容易根据形状去匹配正确的字母。

- 字体呈现效果对于完全相同的字体,在不同的编辑器里呈现的图像也会略有不同。下图就是例子,上一行是来自GiMP,下一行来自FireFox:

- 可以看到,长度 (上一行长一些)、和文本的光栅化方式(下一行粗一点)不太一样。这也会对还原结果造成影响。
像素偏移在文本打码时,会有X轴和Y轴的标准去衡量偏移度。在大多数编辑器中,打码的人随手从一个点开始涂抹,最终出现的打码色块完全不同。Unredacter 也设置了偏移量测试,进行多重猜测与匹配。

解决了上面的这些问题,再完成JumpSec的挑战题目就会很轻松了。
运行了几分钟后,Unredacter 吐出了最终的猜测:

您甚至可以用肉眼看到我们的猜测非常接近!
顶部:原始挑战图像(灰度和底行固定)
底部:Unredacter 的猜测

忠告
请以后尽量少使用像素化的马赛克,专家建议您用纯色的画笔遮盖敏感信息!
工具的使用
工具下载
工具编译

选择unredacter-main

点击新建终端

安装依赖
npm install

工具运行
运行项目
npm start
然后界面就出来了~

实战:完成JumpSec的挑战
我们可以直接使用它的界面完成上面的挑战预测,首先,我们需要先将图片进行裁切,只保留马赛克的部分

并将其命名为secret.png然后在项目根目录下覆盖原图片

然后重新启动工具
npm start
点击Click to Start就可以开始运行了

运行过程中可能会比较占用CPU,不过问题不大了,运行个几分钟就会有答案了

附录:猪头挑战答案揭晓
答案请评论获取