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)的列表转换为图像。是的,我知道,我已经看到了其他关于堆栈溢出的例子。我想知道为什么我的实现失败了。
答案 0 :(得分:0)
我刚刚重新阅读了你的问题。如果你的immage_array是[0,0,0 ...],你不能这样做。这不是图像,而是位图(细微差别)。使用PIL.Image.frombytes构造函数。
如果要加密图像,只需加密整个内容,而不是提取文件内容,将其转换为位图,然后加密/解密。当你将它转换为位图时,对于初学者来说,它将是一个数量级更多的数据,其次你会丢失关于图像格式(RGB,ARGB,单色等)的信息。
正如您现在所披露的那样,您使用的是PIL.Image.getdata
方法。这将返回一维列表,那么您如何知道另一端的宽度/高度?即如果你的图像是640x480,从另一端你无法判断它是480x640甚至是307200x1