在 C# 中从文件字节数组中删除随机字节

Cutting random bytes off of file byte array in C#

所以我从事这个项目已经有一段时间了,涉及 LSB 隐写术。非常有趣的东西。无论如何,我刚刚完成了从图像(而不是纯文本)中嵌入和提取文件的代码,我 运行 遇到了这个问题。我可以识别字节的 MIME 和扩展名,但由于嵌入文件通常不会占用图像的所有 LSB,因此存在大量垃圾数据。所以我在它之后的字节数组中有提取的文件+一些垃圾。我需要弄清楚如何剪切这些文件,以便导出的文件是正确的、较小的文件。

TLDR:我有一个字节数组,里面有一个可识别的文件,还有一些额外的随机字节。如何找出文件结束位置和随机字节开始位置?

记住这一切都在 C# 中。 任何建议表示赞赏。

Link到我的项目参考:https://github.com/nicosogangstar/Steg

通常你有两种选择。

流结束标记

这是两者中更直接的方法,但它可能缺乏一些通用性,具体取决于您要隐藏的数据。嵌入数据后,继续嵌入一个唯一的 bits/bytes 序列,这样您就知道它不会在之前的数据中过早地遇到。在提取位时,一旦遇到此序列就可以停止阅读。如果您希望仅隐藏可读文本,即 ascii 代码介于 32 和 127 之间的字节,您的标记可以短至八个 0 或八个 1。但是,如果您打算隐藏任何类型的二进制数据,其中每个字节都有可能出现,您可能会在提取合法数据时意外遇到标记,从而过早地停止该过程。

Header 信息

您可以添加一个 header 前置数据,例如,另外 16-24 位(或任何其他数量)可以转换为一个数字,告诉您有多少 bits/bytes/像素停止前阅读。例如,如果你想隐藏一个大小为 1000 的字节数组,首先嵌入与秘密长度相关的 2 个字节,然后是实际数据。更具体地说,将长度分成 2 个字节,其中第一个字节具有二进制数 1000 的第 8 到第 15 位,第二个字节具有第 0 到第 7 位。

00000011 11101000    1000 in binary
       3      -24    byte values

你可以在一个header中嵌入各种信息,例如数据是否加密或使用某种算法压缩,日期的原始文件名,提取信息要读取多少个LSB,等等