Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从PNG图像中获取像素数据,以便进行gpg签名?_Python_Serialization_Pickle - Fatal编程技术网

Python 如何从PNG图像中获取像素数据,以便进行gpg签名?

Python 如何从PNG图像中获取像素数据,以便进行gpg签名?,python,serialization,pickle,Python,Serialization,Pickle,我想对PNG图像中的像素数据进行gpg签名。稍后,我希望能够gpg——验证在像素数据上发现的签名,以了解图像的作者,并且自签名后它没有改变 动机 我正在开发一个系统,该系统允许在以后对PNG图像的完整性进行验证和归属(参见不可否认性)。我在Python中工作。理想情况下,我希望附加信息不会妨碍任何用户像往常一样阅读图像 图像中什么是重要的?在我的应用程序中,只有像素数据是重要的。我需要将这些数据转换成gpg--sign接受的形式,这相当于序列化Python对象。将来验证未被篡改的图像的签名的能力

我想对PNG图像中的像素数据进行gpg签名。稍后,我希望能够gpg——验证在像素数据上发现的签名,以了解图像的作者,并且自签名后它没有改变

动机 我正在开发一个系统,该系统允许在以后对PNG图像的完整性进行验证和归属(参见不可否认性)。我在Python中工作。理想情况下,我希望附加信息不会妨碍任何用户像往常一样阅读图像

图像中什么是重要的?在我的应用程序中,只有像素数据是重要的。我需要将这些数据转换成
gpg--sign
接受的形式,这相当于序列化Python对象。将来验证未被篡改的图像的签名的能力取决于产生相同输出的序列化(pickle.dumps、cPickle.dumps),例如5年后

为什么不用gpg对文件进行签名--sign?将像素数据的签名粘贴回同一图像的元数据中,将保留签名1。附件1和2。有效。无论图像去哪里,签名也会去哪里(除了任何可能删除它的过分热心的软件)

下面的示例将在ipython中运行

签署一个PNG图像。
我想,我会在内存中使用pycrypto对其进行哈希并签名。序列化是不必要的额外步骤

编辑:以下是之前关于此问题的问答:

阅读下面的评论后编辑两个:


我相信PIL tostring()函数只是将像素数据转储到字符串中,例如,它是预序列化的。所以,如果你真的想使用外部程序,也许你可以简单地将这个字符串输出到一个文件。

我可能应该在cPickle.dumps()中显式地指定protocol=something。为什么你要输出它,而不只是将它散列并在内存中签名?嗯,我以前没有考虑过pycrypto,也没有实际使用过它。我不确定它是否提供了与运行命令行gpg相同的“好”UI,例如自动选择默认私钥并以交互方式从您那里获取密钥的密码短语。对于我的应用程序来说,pycrypto.hash.MD5看起来只接受类似字符串的输入,因此我的像素数据仍需要以某种方式序列化。我更新了答案,以描述如何从PIL中获取序列化数据。这看起来很有希望。我需要阅读关于PIL.Image.tostring及其“raw”编码器的信息,以确认它只查看像素数据。In[74]:len(cPickle.dumps(list(Image.open(f).getdata()))Out[74]:73578551 In[75]:len(Image.open(f.tostring())Out[75]:9726760导入枕头作为PIL;tobytes只返回像素数据。我找不到枕头“原始”编码器的文档。。。从好的方面来看,它比cPickle.dumps小得多,速度也快得多(感谢您消除了pickle!)。对于我的应用程序,我想现在重要的问题是“pillow.Image.tobytes的输出有多稳定?”,记住我将来将依赖相同的像素数据来进行签名验证。是的,我不确定。但我认为,按照你最初的策略,你基本上仍然存在这个问题(以及担心泡菜稳定性的问题)。事实上,如果“原始”字节直接来自PNG文件,它们可能比解码后的像素更稳定。。。
# The PNG image to sign.
f = 'image.png'

# Read pixel data from a PNG image.
from pillow import Image
serialized = Image.open(f).tobytes(encoder_name='raw')

open('serialized.txt').write(pixel_data)

# Sign the data with gpg using the default private key.
!gpg --sign --detach --armor --output sig.asc serialized.txt
# <enter gpg passphrase as required>

# Write the signature to the PNG image's metadata using Image Magick.
import subprocess
subprocess.call(['mogrify', '-set', 'gpgsig', open('sig.asc').read()])

# Verify it got added using Image Magick.
!identify -verbose image.png
# Many, many moons go by, and you find a PNG image in the wild.
# It looks familiar, but its provenance and integrity are unknown.
# But lo! it includes a gpg signature in its metadata.
# You want to verify the signature (which may have been signed
# by yourself or anybody else whose gpg public key you have
# access to) to ensure the image is unchanged.

# Read the pixel data, same as before.
from pillow import Image
serialized = Image.open(f).tobytes(encoder_name='raw')

open('serialized.txt').write(serialized)

# Get the included signature.  This may be done
# programmatically, but for the sake of simplicity,
# just use Image Magick.
!identify -verbose image.png

# Save the signature to sig.txt.

# Attempt to verify the detached signature
!gpg --verify sig.txt serialized.txt