2017-10-12 111 views
0
from os import urandom 
from PIL import Image 
import io 



for y in range((len(array2) -1), -1, -1): 
    decrypted_initial = decrypt(array2[y], key) 
    if y > 0: 
    decrypted_cipher = decrypt(decrypted_initial, array2[(y -1)]) 
    if y == 0: 
    decrypted_cipher = decrypt(decrypted_initial, fixed_initialization_vector) 
    immage_array.append(decrypted_cipher) 
immage_array = [x for sets in immage_array for x in sets] #The list is all zeros since the image is all black. 


for i in range(1000): 
    print (immage_array[i]) #1000 zeroes printed. 
if immage_array == myMessage: #Comparing the input hexocde for the encryption and output hexcode from the decryption. 
    print("Yay.") #Print successful. 
image = Image.open(io.BytesIO(bytes(immage_array))) #Not sure what this does exactly. I am just trying to get the hexcode to output as an image file. 
image.save(output.png) 

我想在图像上执行链接块密码,这是代码的一部分。我已经能够获取图像的十六进制代码,使用分组密码对其进行加密,并对其进行解密。然后,我将解密后的十六进制代码与原始输入的十六进制代码进行比较,并获得成功的匹配。虽然十六进制代码是以列表而不是字节数组的形式返回的,但if语句仍将它们识别为相等。我很难将十六进制代码转换回图像。为什么十六进制代码输出失败?

我得到这个错误。 OSERROR:在0x039F1090>

的图像是用于测试目的的所有黑象素,可以很容易确认我已确认为与输入相同的十六进制代码的完整性不能识别图像文件< _io.BytesIO对象。

什么阻止我将十六进制码转换回图像?我尝试过寻找可行的例子,但我从来没有能够完全理解它为什么起作用。这是我的逻辑。

immage_array是一个列表==(0,0,0,0,...,N)

字节()#turns所有整数0的immage_array列表到字节数组的所有组成X00的。

io.BytesIO()函数需要由Image.open()函数处理字节数组。

然后我将字节数组作为对象存储在变量图像中。

image.save(output.png)save函数将文件名作为参数。使用图像对象。

我诚实地试图找出逻辑失败的地方。我希望能够解释如何将(0,0,0,...,n)列表转换为图像。是的,我知道,我已经看到了其他堆栈溢出的例子。我想知道为什么我的实施失败。

+0

如果你告诉我们你正在使用哪个图像类 –

+0

bytes.IO对象需要是格式正确的图像文件的内容。不知道你在创建immage_array数组,但它看起来并不像图像的内容。你确定你不是指'PIL.Image.frombytes'构造函数吗? –

+0

我使用myMessage = list(Image.open('myfile.png','r')。getdata())获取了一个图像文件的十六进制代码,然后通过我自己写的连锁分组密码算法传递给它,原来的名单回来。我用if语句来比较它们。 – Dave

回答

0

我只是重新读你的问题。如果你的immage_array是[0,0,0 ...],你不能这样做。这不是一个图像,它是一个位图(细微差别)。使用PIL.Image.frombytes构造函数。

如果要加密图像,只需加密整个内容,而不是提取文件内容,将其转换为位图,然后对其进行加密/解密。当你将它转换成位图时,对于初学者来说,它将会是一个数量级的数据,其次你会丢失关于图像格式(RGB,ARGB,单色等)的信息。

正如你现在透露,您正在使用PIL.Image.getdata方法。这将返回一个一维列表,那么如何知道另一端的宽度/高度?即如果你的图像是640x480,从另一端你不能告诉它是否将是480x640甚至307200x1

+0

这解释了很多。我得到了一份大学作业,用我自己的分组密码算法对图像进行加密并解密。如果我使用PIL获取原始的十六进制代码,我将如何分解连锁分组密码的图像文件?Image.getdata不可行?我把十六进制代码分成了6个相等的长度。我用一个初始化向量对每个块进行异或,然后随机生成一个密钥。每个先前的块必须用作初始化向量。 – Dave

+0

只需使用“open”内置函数从文件中读取字节 –

+0

您是否使用它? –