#encrypting an image using AES
import binascii
from Crypto.Cipher import AES
def pad(s):
return s + b"\0" * (AES.block_size - len(s) % AES.block_size)
filename = 'path to input_image.jpg'
with open(filename, 'rb') as f:
content = f.read()
#converting the jpg to hex, trimming whitespaces and padding.
content = binascii.hexlify(content)
binascii.a2b_hex(content.replace(' ', ''))
content = pad(content)
#16 byte key and IV
#thank you stackoverflow.com
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
ciphertext = obj.encrypt(content)
#is it right to try and convert the garbled text to hex?
ciphertext = binascii.hexlify(ciphertext)
print ciphertext
#decryption
obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
plaintext = obj2.decrypt(ciphertext)
#content = content.encode('utf-8')
print plaintext
#the plaintext here matches the original hex input file as it should
with open('path to - AESimageDecrypted.txt', 'wb') as g:
g.write(plaintext)
我的问题是双重的, 1)我怎样才能将加密文件(在hexlify之前出现乱码)转换成图像?这个文件基本上是十六进制字符串的文本文件? 我希望输出可以在任何查看器上以jpg形式查看。
我已经尝试了一些事情,碰到了Pillow,除了我似乎无法掌握它是否可以做我想要的。
感谢任何帮助。
PS:我也想用其他密码尝试这个。所以如果有人能帮助清除这种理解是否合适,我认为这会很有帮助:
jpg - >转换为二进制/十六进制 - >加密 - >乱码输出 - >转换为bin / hex - >转换为jpg
2)以上可能吗?它们应该转换为十六进制还是二进制?
答案 0 :(得分:3)
这里的问题是如何在不解密的情况下将加密图像显示为图像。
加密内容不是图像,不能明确地表示为图像。可以做的最好的事情是将其视为位图,即每个二进制值代表某个坐标处某种颜色的强度。
将数据视为每像素3个字节似乎合乎逻辑:RGB RGB RGB ...
图像是2D,加密数据只是一个字节列表。同样,有几个选项是有效的。我们假设它是方形图像(NxN像素)。
要创建图片,我会使用PIL / Pillow:
from PIL import Image
# calculate sizes
num_bytes = len(cyphertext)
num_pixels = int((num_bytes+2)/3) # 3 bytes per pixel
W = H = int(math.ceil(num_pixels ** 0.5)) # W=H, such that everything fits in
# fill the image with zeros, because probably len(imagedata) < needed W*H*3
imagedata = cyphertext + '\0' * (W*H*3 - len(cyphertext))
image = Image.fromstring('RGB', (W, H), imagedata) # create image
image.save('C:\\Temp\\image.bmp') # save to a file
顺便说一句,这可以用绝对任何字节串完成,而不仅仅是加密图像。