AI 拼图的探讨

2019-12-31 约 397 字 预计阅读 2 分钟

声明:本文 【AI 拼图的探讨】 由作者 virink 于 2019-12-31 09:26:00 首发 先知社区 曾经 浏览数 294 次

感谢 virink 的辛苦付出!

引子

很早之前就有 Misc 拼图题的存在了,也出现了一些奇奇怪怪的解决方法,包括但不限于以下:

  • PPT 拼图
  • 打印手工拼图
  • Word 拼图
  • PS 平台
  • CAD 拼图
  • 时间排序拼图

今年 HXB 也出了个 AI 拼图题,有点意思,所以今年圣诞节,我们 Venom 也安排的一场圣诞挑战。

本来是分 Easy,Middle,Hell 的,但是感觉 Easy 太简单了,就没安排了。

底图是这个样子的

Meta

  • size: 2560x1600

Easy

easy

Meta

  • part size: 32x20
  • number: 6400

easyx

Meta

  • part size: 16x10
  • number: 25600

Solution

看图说话,就是非常非常 easy。整个图片上除了 secret 文字就没有别的干扰了。因此解决方案就非常简单了

因为给出了底图和碎图,所以可以根据碎图去分割底图为同样大小的碎片。

可以通过分别对底图碎片和 secret 图碎片进行哈希,替换相同哈希的内容后得到哈希不同的碎片,即为 secret 文字的碎片。在组合为大图。

[+] Source   : origin.png
[+] Part     : easy/01JbXsY3sZ.png
[+] Output   : easy.png
[+] ExtColor : #fff
[+] puzzleDiffHash
[+] m = 80, n = 80
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Hash Diff Num : 668
[+] Merge Image
[+] Success! And use 4.248577 s

[+] Source   : origin.png
[+] Part     : easyx/007Mgv3beP.png
[+] Output   : easyx.png
[+] ExtColor : #fff
[+] puzzleDiffHash
[+] m = 160, n = 160
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Hash Diff Num : 1698
[+] Merge Image
[+] Success! And use 12.901666 s

碎片分割越小,secret文字越大,使用哈希对比的方法越准确。也可以用 Middle 或者 Hell 的方法。

Middle

Meta

  • part size: 32x20
  • number: 6400
  • 干扰直线 * 100 [width=(3, 6)]
  • 干扰曲线 * 100 [width=(3, 6)]
  • 干扰文本 * 20

Solution

复杂度瞬间上升 N 倍,主要是多了很多干扰,单纯的 hash 比对是不可能的了。

这时候考虑三种特殊的哈希算法

  • 图像均值哈希算法 Average Hash - ahash
  • 图像感知哈希算法 Perceptual Hash - phash
  • 图像差异哈希算法 Difference Hash - dhash

我这里是利用差异哈希算法实现的


[+] Source   : origin.png
[+] Part     : middle/00CJwpvuuk.png
[+] Output   : middle.png
[+] ExtColor : #fff
[+] puzzleDiffHash
[+] m = 80, n = 80
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Compare Image
[+] Merge Image
[+] Success! And use 19.097951 s

虽然没能完全还原,但是 secret 已经清晰可见了。

低配 Hell

Meta

  • part size: 16x10
  • number: 25600
  • 干扰直线 * 100 [width=(5, 8)]
  • 干扰曲线 * 100 [width=(5, 8)]
  • 干扰文本 * 30

Solution

解决方案应该不是,毕竟给的图都是高清无码无损大图。挑战难度主要在于验证机器低配,干扰复杂度++,最大干扰线粗细接近碎片高度,碎片数量多。

参考方案

  • 低采样点RGB比对
  • 纯【哈希】和【差异哈希】排除一部分碎片,剩下的用全 RGB 比对

反正我的解决方案是无脑比对全 RGB,逐个选用相似度最高的

[+] Source   : origin.png
[+] Part     : hell/03RVA5m7Pm.png
[+] Output   : hell.png
[+] ExtColor : #fff
[+] puzzleDiffRGB
[+] m = 160, n = 160
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Compare Image
[+] Finish Compare
[+] Merge Image
[+] Success! And use 104.166225 s

我是在本地跑的

VerifyServer

验证服务跑出的结果

高配 Hell [只是个设想]

么得图

Meta

  • part size: 16x10
  • number: 25600
  • 干扰直线 * 100 [width=(5, 8)]
  • 干扰曲线 * 100 [width=(5, 8)]
  • 干扰文本 * 30
  • 不给原图
  • png -> jpg 有损格式是不是会被吊打

解决方案大概是边界模糊匹配,具体我也不懂啊

Others

大概了解了一下选手们的解决方案。结果我哭了。

选手甲

选手乙

Ending

大佬们都用CUDA,,,我很绝望啊。

我不懂算法、、所以不要吐槽哈、、机器学习???不存在的。

关键词:[‘安全技术’, ‘CTF’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now