首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的隐写

Python中的隐写
EN

Stack Overflow用户
提问于 2013-05-30 14:04:13
回答 1查看 6.5K关注 0票数 7

使用Stepic 0.3。我正在执行命令将一条消息编码为JPG图像。我使用的代码如下:

代码语言:javascript
复制
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‘或其他一些奇怪的字符。我认为我在使用函数,因为它们应该被使用,为什么我不能得到适当的结果呢?

EN

回答 1

Stack Overflow用户

发布于 2013-05-30 15:37:39

stepic 0.3使用最简单的方法在图像中隐写。直接引用模块的话:

代码语言:javascript
复制
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表示流的结束):

代码语言:javascript
复制
                   | 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不是无损的,它的压缩很可能会改变至少一个编码位。只需更改第九位就可以使该方法变得非常无用,因为这样隐藏的数据将被截断为一个字节。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16838341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档