【发布时间】:2018-02-20 06:12:58
【问题描述】:
我使用stepic3 来隐藏一些数据。多个文件被压缩成一个 zip 文件,这将是隐藏的消息。但是,当我使用以下代码时
from PIL import Image
import stepic
def enc_():
im = Image.open("secret.png")
text = str(open("source.zip", "rb").read())
im = stepic.encode(im, text)
im.save('stegolena.png','PNG')
def dec_():
im1=Image.open('stegolena.png')
out = stepic.decode(im1)
plaintext = open("out.zip", "w")
plaintext.write(out)
plaintext.close()
我得到了错误
完全追溯
回溯(最近一次通话最后一次):
文件“C:\Users\Sherif\OneDrive\Pyhton Projects\Kivy Tests\simple.py”,第 28 行,enc_()
文件“C:\Users\Sherif\OneDrive\Pyhton Projects\Kivy Tests\simple.py”,第 8 行,enc_
im = stepic.encode(im, text)
文件“C:\Users\Sherif\OneDrive\Pyhton Projects\Kivy Tests\stepic.py”,第 89 行,编码
编码就地(图像,数据)
文件“C:\Users\Sherif\OneDrive\Pyhton Projects\Kivy Tests\stepic.py”,第 75 行,位于 encode_inplace
对于 encode_imdata(image.getdata(), data) 中的像素:
文件“C:\Users\Sherif\OneDrive\Pyhton Projects\Kivy Tests\stepic.py”,第 58 行,位于 encode_imdata
字节 = ord(数据[i])
TypeError: ord() 预期长度为 1 的字符串,但找到了 int
转成字符串有两种方式。
text = open("source.zip", "r", encoding='utf-8', errors='ignore').read()
有输出
PKn!K\Z
sec.txt13 byte 1.10mPKn!K\Z
sec.txtPK52
或
text = str(open("source.zip", "rb").read())
有输出
b'PK\x03\x04\x14\x00\x00\x00\x00\x00n\x8f!K\\\xac\xdaZ\r\x00\x00\x00\r\x00\x00\x00\x07\x00\x00\x00sec.txt13 byte 1.10mPK\x01\x02\x14\x00\x14\x00\x00\x00\x00\x00n\x8f!K\\\xac\xdaZ\r\x00\x00\x00\r\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x81\x00\x00\x00\x00sec.txtPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x005\x00\x00\x002\x00\x00\x00\x00\x00'
我使用了第二个,我从检索中得到了相同的字符串。
为了重构zip文件(输出为字符串),我使用了代码
plaintext = open("out.zip", "w")
plaintext.write(output)
plaintext.close()
但是当我尝试打开它时,写入的文件说它已损坏。当我尝试读取写入它的内容时,使用任一
output = output.encode(encoding='utf_8', errors='strict')
或
output = bytes(output, 'utf_8')
输出是
b"b'PK\\x03\\x04\\x14\\x00\\x00\\x00\\x00\\x00n\\x8f!K\\\\\\xac\\xdaZ\\r\\x00\\x00\\x00\\r\\x00\\x00\\x00\\x07\\x00\\x00\\x00sec.txt13 byte 1.10mPK\\x01\\x02\\x14\\x00\\x14\\x00\\x00\\x00\\x00\\x00n\\x8f!K\\\\\\xac\\xdaZ\\r\\x00\\x00\\x00\\r\\x00\\x00\\x00\\x07\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xb6\\x81\\x00\\x00\\x00\\x00sec.txtPK\\x05\\x06\\x00\\x00\\x00\\x00\\x01\\x00\\x01\\x005\\x00\\x00\\x002\\x00\\x00\\x00\\x00\\x00'"
与源文件不同。
我必须如何忠实地重建嵌入的文件?
【问题讨论】:
-
请发布完整的回溯。
-
我编辑了问题,有完整的回溯
-
请注意。 Stepic 尚未针对 python 3 进行适当调整。
ord()和chr()的工作方式与 python 2 不同,这是因为前者引入了字节和字符串之间的区别。正如我的回答所证明的,这在我们必须经历的体操中很明显,以便在 python 3 中获得所需的结果。取消ord()和chr()并只使用字节会更自然。更令人担忧的是,在 python 3 中使用这些函数可能会得到错误的结果。ord('€') = 8364,而程序每个字符只嵌入一个字节。
标签: python string python-3.x byte steganography