所以我现在已经在这个项目上工作了一段时间,涉及LSB隐写术。真有趣的东西。无论如何,我刚刚完成了从图像中嵌入和提取文件的代码(而不仅仅是纯文本),我遇到了这个问题。我可以识别字节的MIME和扩展名,但由于嵌入式文件通常不占用图像的所有LSB,因此存在大量垃圾数据。所以我把提取的文件+字节数组中的一些垃圾放在它之后。我需要弄清楚如何剪切它们,以便正在导出的文件是正确的,更小的尺寸。
TLDR:我有一个带有识别文件的字节数组,还有一些额外的随机字节。如何找出文件的结束位置和随机字节的开始?
请记住这一切都在C#中。 任何建议都表示赞赏。
链接到我的项目以供参考:https://github.com/nicosogangstar/Steg
答案 0 :(得分:1)
一般来说,您有两种选择。
这是两者中更直接的方法,但根据您想隐藏的数据,它可能缺少一些。嵌入数据后,继续嵌入一个唯一的位/字节序列,这样您就不会在之前的数据中过早地遇到它。提取位时,一旦遇到此序列,就可以停止读取。如果您希望仅隐藏可读文本,即ascii代码在32到127之间的字节,则您的标记可以短至8个0或8个1。但是,如果您打算隐藏任何类型的二进制数据,每个字节都有可能出现,您可能会在提取合法数据时意外地遇到标记,从而过早地停止该过程。
您可以在数据之前添加标题,例如,另一个16-24位(或任何其他数量),可以转换为一个数字,告诉您在停止之前要读取多少位/字节/像素。例如,如果要隐藏大小为1000的字节数组,首先要嵌入与秘密长度相关的2个字节,然后将其与实际数据一起使用。更具体地说,将长度分成2个字节,其中第一个字节具有第8到第15位,第二个字节具有第二个数字1000的第0到第7位。
00000011 11101000 1000 in binary
3 -24 byte values
您可以在标题中嵌入各种信息,例如数据是使用某种算法加密还是压缩,日期的原始文件名,读取信息的LSB数等等。