为什么hexcode输出失败?

时间:2017-10-12 18:12:41

标签: python image encryption-symmetric

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:无法识别图像文件< _io.BytesIO对象位于0x039F1090>

为了测试目的,图像全是黑色像素,以便于确认我已确认与输入相同的十六进制代码的完整性。

是什么阻止我将十六进制代码转换回图像?我试着到处寻找有效的例子,但我从来没有完全理解它为什么有效。这是我的逻辑。

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

bytes()#将所有整数0的immage_array列表转换为一个由x00组成的字节数组。

io.BytesIO()Image.open()函数操作字节数组所需的函数。

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

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

我老老实实地试图找出逻辑失败的地方。我将非常感谢如何将(0,0,0,...,n)的列表转换为图像。是的,我知道,我已经看到了其他关于堆栈溢出的例子。我想知道为什么我的实现失败了。

1 个答案:

答案 0 :(得分:0)

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

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

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