【问题标题】:Create jpg/png from encrypted image从加密图像创建 jpg/png
【发布时间】:2021-09-03 20:47:27
【问题描述】:

我希望能够转换/显示 AES256 非对称加密图像,即使它看起来是垃圾,我已经阅读了一些关于 SO 的内容,建议删除标题然后重新附加它们,即使看起来很疯狂,它仍然显示它。

我想看看是否可以对使用已知公钥加密的图像数据集执行图像分类。如果我有一张猫的照片,并使用完全相同的密钥对其进行加密,那么结果通常是可重现的,并且生成的图像在某种程度上等同于原始图像。

请原谅缺少代码,我不想用我正在考虑的想法污染讨论,以便从你们可爱的人那里得到适当的批评 - 我会说我不是加密专家,因此我要求建议在这里。

【问题讨论】:

  • 只是一些笔记。 “非对称”加密不起作用,因为非对称加密仅适用于少量数据(因此请使用 AES 等对称加密)。第二:运行加密,例如CBC 模式下的 AES 带有 随机初始化向量 将给出“随机”输出,并且每次运行加密时都会有所不同,因此没有什么比得上“可重现”了。
  • 第三:您可以搜索“ECB Penguin”,您会找到“差”加密的示例 - 这些示例在 AES ECB 模式下运行并剥离 BMP 图像的标题,例如(免责声明是德语,Java 语言,我是作者)javacrypto.bplaced.net/g01-ecb-pinguin
  • Heya Michael,谢谢你 - 所以我想测试的是是否可以进行 e2e 加密,同时仍然允许对令人讨厌的内容进行分类,我已经阅读了有关该主题的各种科学论文,它如果您知道密钥,您似乎可以使用相同的方法加密每个图像。?
  • 这是加密数据的“问题”,您无法对加密内容进行分类,无论它们是否令人讨厌。每个知道密钥(这就是为什么它被命名为秘密...)的人都能够加密和解密。
  • 恐怕你错了,我不想解密,我想显示加密版本,我也想用同样的方法加密其他图像。因此,似乎需要 IV 和公钥来执行“相同”的加密。但是我的问题是,您将如何以加密形式显示加密图像?

标签: image-processing public-key-encryption encryption-asymmetric


【解决方案1】:

有很多选择,但我建议遵循以下准则:

  • 加密图像数据,而不是图像文件。
    如果图像是 100x100x3 字节,请加密 30000 字节(例如,不是 img.jpg 文件)。
    (缺点是元数据不作为加密图像的一部分保存)。
  • 使用无损图像文件格式存储加密图像(例如 PNG 文件格式,而不是 JPEG 格式)。
    JPEG 等有损格式将不可逆转。
  • 将加密图像的分辨率设置为与输入图像相同的分辨率。
    这样您就不需要存储图像标题 - 保存分辨率。
    您可能需要添加填充,因此字节大小是 32 的倍数。

希望你了解 Python...

这是一个演示编码和解码过程的 Python 代码示例:

import cv2
import numpy as np
from Crypto.Cipher import AES

# https://stackoverflow.com/questions/61240967/image-encryption-using-aes-in-python
key = b'Sixteen byte key'
iv = b'0000000000000000'

# Read image to NumPy array - array shape is (300, 451, 3)
img = cv2.imread('chelsea.png')

# Pad zero rows in case number of bytes is not a multiple of 16 (just an example - there are many options for padding)
if img.size % 16 > 0:
    row = img.shape[0]
    pad = 16 - (row % 16)  # Number of rows to pad (4 rows)
    img = np.pad(img, ((0, pad), (0, 0), (0, 0)))  # Pad rows at the bottom  - new shape is (304, 451, 3) - 411312 bytes.
    img[-1, -1, 0] = pad  # Store the pad value in the last element

img_bytes = img.tobytes()  # Convert NumPy array to sequence of bytes (411312 bytes)
enc_img_bytes = AES.new(key, AES.MODE_CBC, iv).encrypt(img_bytes)  # Encrypt the array of bytes.

# Convert the encrypted buffer to NumPy array and reshape to the shape of the padded image (304, 451, 3)
enc_img = np.frombuffer(enc_img_bytes, np.uint8).reshape(img.shape)

# Save the image - Save in PNG format because PNG is lossless (JPEG format is not going to work).
cv2.imwrite('enctypted_chelsea.png', enc_img)



# Decrypt:
################################################################################
key = b'Sixteen byte key'
iv = b'0000000000000000'

enc_img = cv2.imread('enctypted_chelsea.png')

dec_img_bytes = AES.new(key, AES.MODE_CBC, iv).decrypt(enc_img.tobytes())

dec_img = np.frombuffer(dec_img_bytes, np.uint8).reshape(enc_img.shape)  # The shape of the encrypted and decrypted image is the same (304, 451, 3)

pad = int(dec_img[-1, -1, 0])  # Get the stored padding value

dec_img = dec_img[0:-pad, :, :].copy()  # Remove the padding rows, new shape is (300, 451, 3)

# Show the decoded image
cv2.imshow('dec_img', dec_img)
cv2.waitKey()
cv2.destroyAllWindows()

加密图片:

解密图片:


识别加密图像的思路:

  • 计算加密图像的哈希值,并将其与原始图像、keyiv 一起存储在您的数据库中。
  • 获得加密图像后,计算哈希值并在数据库中搜索它。

【讨论】:

  • 我这边只需 2 美分:在 CBC 模式下使用像 AES 这样的块密码需要 16 字节的倍数 - 这是 AES 块大小。要识别任何文件 - 为什么我们不应该计算完整文件的哈希值(仅获取图像数据需要为每种图像格式(例如 JPG、BMP、PNG、TIFF ......)提供一个自己的函数?
  • 干得好Rotem,非常感谢,标记为正确。
  • 在 Python 上没有问题,我们将它用于所有 ML 的东西——现在正要测试你的代码,如果它有效,那将是相当特别的东西。
【解决方案2】:

我正在使用答案,虽然它不是答案,因为我想展示两张图片来演示。

两张图片均取自我的博客文章http://javacrypto.bplaced.net/g01-ecb-pinguin/(德语)。

第一张图是ECB模式下用AES加密后的Tuc企鹅:

形式仍然存在,您可以“想象”显示的是什么动物。

第二张图片在 CBC 模式下使用 AES 加密,输出看起来像垃圾:

结论:如果图片使用 CBC、CTR 或 GCM 之类的模式加密,即使您知道所使用的模式、密钥和初始化向量,您总是会得到类似于第二张图片的内容。

无法进行视觉比较,抱歉。

要在评论“您如何以加密形式显示加密图像”中回答您的问题:您不能显示它们,因为通常图片有一个也被加密的 标题,所以这个信息将丢失。两张“加密”的图片是在加密前剥离头部创建的,然后图片数据被加密,头部被添加。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2020-06-24
    • 2018-01-04
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多