gpt4 book ai didi

python - 如何使用python加密图像

转载 作者:行者123 更新时间:2023-12-03 17:36:47 32 4
gpt4 key购买 nike

前言:这是一门课所必需的,我知道不应该使用ECB。

我正在尝试使用 AES 加密图像,然后显示图像

需要的步骤:
读图,
转换为字节对象,
填充字节,
加密字节,
转换回图像对象,
另存为图像文件

这是我现在的代码:

from PIL import Image
from Crypto.Cipher import AES
from Crypto import Random

img = Image.open("photo.jpg")
img.tobytes()

key = '0123456789abcdef'
mode = AES.MODE_ECB
encryptor = AES.new(key, mode)

img.frombytes("RGB")

在这一点上,我被卡住了。我在“img.frombytes(“RGB”)行上收到“图像数据不足”错误,并且还卡在填充字节的部分

最佳答案

所以我需要一种以图像形式传输文件的方法(不要问我为什么),如果您只想传输文本,您可以创建一个txt文件。

这可能不是问题的最佳解决方案,因为您可能想要一种将数据隐藏在现有图像中的方法,但无论如何我还是想共享代码,以防它在某个时候对某人有所帮助。

基本上这将创建一个大小取决于文件大小的图像,并将在一个像素 (RGB) 中放置 3 个字节的序列

于是我写了一个小文件夹2ImageEncoder.py
(默认情况下,它将加密位于名为“ files ”的文件夹中的所有数据)

from PIL import Image
from pathlib import Path
encryptedImagesFolder = 'encryptedImagesFolder'

Path(f"./{encryptedImagesFolder}").mkdir(parents=True, exist_ok=True)
newLine = b'\new\n\rL'


def encode_data_to_image(data: bytes, imagePath: str):
data += b'FINISH_OF_DATA'

data = str(
{
'path': imagePath,
'data': data
}
)
data = data.encode()
n = int((len(data)/3)**0.5) + 1
print(n, len(data))

img = Image.new('RGB', (n, n))
# data = img.getdata()
encryptedPixelsList = []
pixel = []
if len(data) % 3 != 0:
data += (3 - (len(data) % 3)) * b'\x00'
for i, Byte in enumerate(data):
if i % 3 == 2:
pixel.append(Byte)
encryptedPixelsList.append(tuple(pixel))
pixel = []
else:
pixel.append(Byte)

for _ in range(len(encryptedPixelsList), n**2):
encryptedPixelsList.append((0, 0, 0))

img.putdata(encryptedPixelsList)
imagePath = imagePath.replace('\\', '_')
img.save(f'./{encryptedImagesFolder}/{imagePath}.png')
# img.show()


def encode_folder(folder: Path):

for file in folder.iterdir():
if not file.is_dir():
with open(str(file), 'rb') as rb:
data = rb.readlines()
encode_data_to_image(
data=newLine.join(data),
imagePath=str(file))
else:
encode_folder(folder=file)


if __name__ == '__main__':
# ./files is the name of the folder you want to encrypt
encode_folder(folder=Path(r'./files'))

和一个 Image2FilesDecoder.py

这将遍历加密的图像文件夹并检索其以前的形式(在另一个带有加密图像文件夹的文件夹中运行它,这样它就不会覆盖原始文件夹)

from PIL import Image
from pathlib import Path

newLine = b'\new\n\rL'

def decode_encrypted_images(folder: Path):

for pic in folder.iterdir():
img = Image.open(str(pic))
data = img.getdata()
totalData = []
for pixel in data:
totalData.extend(list(pixel))
decryptedData = bytes(totalData)
try:
decryptedData = eval(
decryptedData[:decryptedData.rfind(b'}')+1].decode())
except:
decryptedData.replace(b'\\', '')
decryptedData = eval(
decryptedData[:decryptedData.rfind(b'}')+1].decode())
decryptedData['data'] = decryptedData['data'][:-14]

filePathObj = Path(decryptedData['path'])
Path(filePathObj.parent).mkdir(
parents=True, exist_ok=True)

writeBytes = decryptedData['data'].split(newLine)
with open(str(filePathObj), 'wb') as wb:
wb.writelines(writeBytes)


if __name__ == '__main__':
decode_encrypted_images(folder=Path(
r".\encryptedImagesFolder"))

关于python - 如何使用python加密图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46966917/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com