使用逐步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数据给我的值是: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
secret 数据的每个八位位组,加上一个标志(是否为最后一个字节),都隐藏在三个连续的像素中。更准确地说,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 - Python中的隐写术-Stepic,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16838341/