【问题标题】:How to access data bytes of an JPEG image in order to encrypt it?如何访问 JPEG 图像的数据字节以对其进行加密?
【发布时间】:2019-05-04 15:15:44
【问题描述】:

对于一个项目,我需要加密 JPEG 图像的数据字节以显示加密和解密的图像。我过去常常通过跳过 1078 个字节然后加密其余部分来轻松地使用 BMP 格式完成此操作。但是对于 JPEG,它要困难得多。我发现 JPEG 有 20 byte markers,但是当我跳过 20 个字节而不是 1078 字节时,我无法像使用 BMP 一样看到加密图像。

那么您能告诉我如何访问 JPEG 格式的数据字节以对其进行加密吗?

注意:代码要大很多,所以我不能发布整个代码。有关如何访问 JPEG 格式的数据字节的信息就足够了。

【问题讨论】:

  • 为什么不加密整个文件,包括标题?
  • @grooveplex 我需要标题完好无损才能进行一些转换。之后,我使用套接字发送图像。由于实际程序比上面的代码大得多,解释起来有点复杂。基本上我需要图像看起来像加密的 JPEG 图像。另外,当我收到另一边的图像时,我仍然必须知道标题才能显示加密的图像。这对我的项目来说是必须的。顺便说一句,对不起我的英语。
  • 如果您可以edit 您的问题包括一个完整的可运行程序,而不仅仅是一个 sn-p,这将有所帮助。
  • jpeg 是一种压缩格式。没有header辅助解压,图像数据就没有意义了。如果压缩数据是加密的,那么幸运的是能够将其解压缩成图像——甚至是垃圾图像。如果要显示图像,最好将其解压缩为位图,然后为位图执行任何操作。
  • @Timo 压缩在随机数据上效果不佳,密文看起来像没有密钥的随机数据。此外,JPEG 是有损压缩,因此您无法完全减少密文。也许您可以将密文存储在标头中,并将 JPEG 压缩为一位或类似的东西。

标签: c++ image-processing encryption cryptography jpeg


【解决方案1】:

JPEG 格式比简单的位图复杂得多。除了图像数据之外,JPEG 还可以包含 cmets、元数据,可能还有一些我不知道的其他信息。 (来自相机的图像几乎肯定包含元数据,例如图像的拍摄地点和时间。)除了标题字节之外还有结构。如果您想更改 JPEG 中的数据并使结果为有效的 JPEG,则需要能够读取和写入 JPEG 结构。

据我了解——而且我的理解还远未完成——JPEG 文件由一系列片段组成。每个段都以标记字节FF 开头,后跟一个指示它是什么类型的段的字节。对于某些类型的segment,后面有两个字节表示segment的数据长度(长度包括length字节,但不包括marker和kind字节)。例如,文件以段 FFD8 开头,这是一个 2 字节的段(无长度字节),表示图像的开始。这之后是另一个片段。您链接到的页面提供了示例数据,其中下一个段是应用程序段:FFE0,后跟 16 个字节的数据。你怎么知道有 16 个字节的数据?这些字节的前两个是0010,即十进制的 16。之后是另一个 FF 标记,表示另一个片段。

FF D8
FF E0 00 10 4A 46 49 46 00 01 01 01 00 48 00 48 00 00
FF DB 00 43 [65 bytes of data]
...

要保留 JPEG 格式,您应该按照分段来处理文件。放弃拥有(20 字节)文件头的想法;只是有一个段序列。一些段扮演头数据的角色,如果没有对格式有更深入的了解,不应该修改。其他段包含您要修改的数据。 我认为您感兴趣的部分是帧,它们是C0CF 减去C4CC 的种类。这些段具有可变长度数据,因此它们的数据以两字节长度开始。如果你幸运的话,只修改这些段中的数据就能得到你想要的结果。如果您不走运,我不知道此数据中存在关键的附加结构,您的修改会破坏该结构。

您可能想要做的是扫描文件以查找标记字节FF。看看之后的字节。它是您要修改的一种吗?如果没有,只需复制字节,直到到达下一个标记。如果是一种修改,读取接下来的两个字节得到数据的长度。然后读取 (length-2) 个字节,记住您已经读取了 2 个字节。这是要处理的数据。处理完后重新计算长度再写入段(FF后面跟着种类,后面是新长度,后面是修改后的数据)。继续进行,直到用完要处理的文件。

要记住一个复杂因素,“重新计算长度”暗示了这一点。如果字节FF 出现在修改后的数据中的某处,则需要通过在其后插入空字节00 将其标记为非标记。这是长度可以改变的一种方式。

如果您仍在关注,您也许可以成功。我可以将您指向a copy of the JPEG standard,这是一个粗略的阅读。尽管如此,它的表 B.1(第 36 页,但编号为 32)中仍然列出了各种段。请记住,您的加密是文件,而不是图像。要解密数据,您将需要加密文件,而不仅仅是它生成的图像。

【讨论】:

  • 感谢您的建议!我假设与原始海报大致相同。我将把它作为一个公开的小项目来做。但现在,我只是将我的 JPG 转换为位图。
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2018-02-07
  • 2020-10-02
  • 2014-05-18
  • 2014-11-10
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多