stepic 0.3使用最简单的方法来隐写图像。直接从模块报价:
def decode_imdata(imdata):
'''Given a sequence of pixels, returns an iterator of characters
encoded in the image'''
imdata = iter(imdata)
while True:
pixels = list(imdata.next()[:3] + imdata.next()[:3] + imdata.next()[:3])
byte = 0
for c in xrange(7):
byte |= pixels[c] & 1
byte <<= 1
byte |= pixels[7] & 1
yield chr(byte)
if pixels[-1] & 1:
break
机密数据的每一个字节的,再加上标志是否是最后一个字节,是隐藏在连续的三个像素。更确切地说,stepic使用每个像素的前三个分量(通常是RGB)的最低有效位。看到这非常难看图,对于具有每分量4位的RGBA流(D装置数据,E意味着结束流):
| pixel 0 | pixel 1 | pixel 2 |
image viewer sees: | rrrr gggg bbbb aaaa | rrrr gggg bbbb aaaa | rrrr gggg bbbb aaaa |
stepic sees: | ___D ___D ___D ____ | ___D ___D ___D ____ | ___D ___D ___E ____ |
由于由这种变化所引入的噪声是在已经“噪声”小图像(256次),你通常不能直观地察觉到这一点。这意味着这项技术的目标是实现的:数据隐藏在明显的视野中,因为没有人能够区分它自然发生的噪音。
This Works。至少,它适用于无损格式,如PNG。唉,JPG不是无损的,它的压缩很可能会改变至少一个编码位。只需要改变第九位就可以使这个方法变得毫无用处,因为隐藏的数据将被截断为单个字节。
在JPG图像中的隐写图仍然是可能的,在许多形式中,但你不能真正调整解码的像素值。一个更好的(但更复杂的)方法可能是隐藏压缩机估计的参数中的数据。