Geek
更高级的藏文件法:数码隐写术
之前我们提到过怎样把文件藏在图片里、怎样往音频里藏图片这两种方法。
前一种弱爆了,仅仅只是把图片压缩包合体一下;后一种太过麻烦,还藏不了复杂的图,而且图像的还原度并不高。今天我们来介绍一种高级一些的方法:数码隐写。
[-]
上面这张图就是一张很有内涵的超载鸡(顺带一提搬到云服务器之后大家没见过超载页面了吧,是不是很想它?),里面藏了……嘿嘿我先不说,看看有没有同学会去解密。
先解释一下原理:图片里每个像素是由红绿蓝三色组成的,每色分别有8比特的位置存放数据,然而它们用不了这么多空间:红占5比特,绿是6比特,蓝也是5比特,因此每个像素我们都能再多塞3+2+3=8个比特(1字节)的数据进去。说到这里你大概也明白了,没错,我们要做的就是把需要隐藏的文件拆散,塞进这些没有被使用的空间里去。
这段就是用于解码的Ruby代码,运行之前请确保你安装了ImageMagick、cURL、mplayer以及Ruby:
#!/usr/bin/env ruby
name='omf'
`curl http://i129.photobucket.com/albums/p240/roveme/jandan/#{name}.png | convert - -compress none #{name}.ppm`
ppm = File.open("#{name}.ppm")
3.times { ppm.readline }
enc = ppm.read.split(' ').map { | x | x.to_i }
bytes = 0.upto(enc.length / 3 - 1).map { | x |
(enc.shift & 7) < < 5\ | (enc.shift & 3) << 3\ | (enc.shift & 7) }.pack('C*') name = bytes.slice!(0, bytes.slice!(0, 1).unpack('C')[0]) out = File.open("#{name}", "w") out << bytes[0, bytes.slice!(0, 8).unpack('q')[0]]
运行以后就会出现一个3gp文件。“3gp”绝对不是三级片的意思,这我会随便告诉你么?
同时也附上加密用的代码,这段比较长所以我就不贴出来了,要的同学点这里下载
本文译自 Chris McKenzie's blog,由 ivanchaos 编辑发布。