Python 中的隐写术 - Stepic

Posted

技术标签:

【中文标题】Python 中的隐写术 - Stepic【英文标题】:Steganography in Python - Stepic 【发布时间】:2013-05-26 03:45:47 【问题描述】:

使用 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

然而 print S 和 print data 给了我一个值,比如:6` 或其他一些奇怪的字符。我想我正在使用它们应该使用的功能,为什么我没有得到正确的结果?

【问题讨论】:

也许问题在于JPG是有损格式,stepic中的隐写方案无法处理压缩引入的错误。例如,它适用于 PNG 图像。 是的,就是这样。很奇怪,因为我见过一些使用 .jpg 文件的例子。与 .png 图像完美结合!谢谢! 【参考方案1】:

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 分之一),因此您通常无法真正从视觉上检测到这一点。这意味着实现了该技术的目标:数据隐藏在显而易见的地方,因为没有人可以将其与自然发生的噪音区分开来。

这行得通。至少,它适用于无损格式,例如 PNG。唉,JPG 不是无损的,它的压缩很可能会改变至少一个编码位。只需更改第 9 位即可使该方法变得毫无用处,因为这样隐藏的数据将被截断为单个字节。

JPG 图像中的隐写术仍然可以采用多种形式,但您不能只调整解码的像素值。更好(但更复杂)的方法可能是将数据隐藏在压缩器估计的参数中。

【讨论】:

以上是关于Python 中的隐写术 - Stepic的主要内容,如果未能解决你的问题,请参考以下文章

PDF文件中的隐写术[关闭]

有损压缩中的隐写术 (JAVA)

在 PHP 中阻止图像主机的隐写术?

隐写术总结

Steganography-图片隐写术

隐写术总结