Python中的隐写术 - Stepic

7
使用Stepic 0.3版本。我正在执行将消息编码到JPG图像中的命令。我使用的代码如下:
from PIL import Image
import stepic

im = Image.open ("tester.jpg")
im2 = stepic.encode(im, '0987639987069730979076409784690y7689734')
im2.save('stegtest.jpg')
im1 = Image.open('stegtest.jpg')
s = stepic.decode(im1) 
print s
data = s.decode() 
print data

然而,打印S和打印数据给了我一个像6`或其他一些奇怪字符的值。我认为我正在按照它们应该使用的方式使用这些函数,为什么我没有得到正确的结果?


2
也许问题在于JPG是一种有损格式,而stepic中的隐写方案无法处理压缩引入的误差。例如,对于PNG图像,它可以正常工作。 - user824425
是的,就是这样。很奇怪,因为我看过一些使用 .jpg 文件的例子。但是使用 .png 图像完美无缺!谢谢! - user2436704
1个回答

6

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 ____ |

由于这种变化引入的噪音在已经“嘈杂”的图像中很小(1/256),通常无法在视觉上真正检测到。这意味着该技术的目标已经实现:数据被隐藏在明显的地方,因为没有人能够将其与“自然”发生的噪音区分开来。
这个方法是可行的。至少对于PNG等无损格式是可行的。不幸的是,JPG不是无损的,它的压缩很可能会改变至少一个编码位。只需更改第九位就足以使此方法几乎无用,因为隐含数据将被截断为一个字节。
在JPG图像中进行隐写术仍然是可能的,有许多形式,但您不能真正只是调整解码后的像素值。更好(但更复杂)的方法可能是将数据隐藏在压缩器估计的参数中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接