C++ 如何在图像位中设置标志以标记音频文件的结束

C++ 如何在图像位中设置标志以标记音频文件的结束,c++,bitmap,wav,steganography,C++,Bitmap,Wav,Steganography,目前,我正试图在位图格式的图像中隐藏wave格式的音频文件 我将它们都转换成二进制形式,现在我尝试设置某种标志来标记音频文件的结尾,这样当我从图像中提取音频时,我知道在哪里停止 注意考虑 1:图像是24位的 2:音频数据为PCM 16位 3:我使用的是LSB,因此每个16位音频至少需要5个像素和第六个像素的一个元素(5*3=15+1=16)。您不能依赖文件结束标记,因为所有字节值都可能在ByTestStream中。因此,您必须使用标题。这必须以明确的方式实现,以便解码器知道在哪里以及如何查找以提

目前,我正试图在位图格式的图像中隐藏wave格式的音频文件

我将它们都转换成二进制形式,现在我尝试设置某种标志来标记音频文件的结尾,这样当我从图像中提取音频时,我知道在哪里停止

注意考虑 1:图像是24位的

2:音频数据为PCM 16位


3:我使用的是LSB,因此每个16位音频至少需要5个像素和第六个像素的一个元素(5*3=15+1=16)。

您不能依赖文件结束标记,因为所有字节值都可能在ByTestStream中。因此,您必须使用标题。这必须以明确的方式实现,以便解码器知道在哪里以及如何查找以提取其信息。这就意味着在消息的开头有一个标题,在这种情况下,将它作为一个固定的大小是很方便的,尽管不是必需的

如果您的消息长度可以超过65536位,那么您的消息大小显然需要超过16位,例如32位。现在,您可能会争辩说,如果要嵌入一条非常小的消息,那么一个32位消息大小的头在开始时会有太多的零,这将是一种过度杀伤力。然而,即使您计划嵌入1KB的数据,额外的32位也不会增加任何额外的噪声

到目前为止,您确实应该假设攻击者完全熟悉您的方案,并且如果您以静态方式嵌入消息,那么他们提取消息应该很简单。相反,您可以使用密码或密钥作为PRNG的种子,然后使用它来洗牌像素顺序。例如,让我们分别用数字1-3调用第一个像素的RGB分量,用数字4-6调用第二个像素的分量。通过生成数组
[1,2,3,4,5,6]
并将其洗牌,可以获得顺序
[4,3,2,6,5,1]
。因此,当你嵌入你的秘密(包括消息大小)时,第一位隐藏在第二个像素的红色部分,第二位隐藏在第一个像素的蓝色部分,等等。没有人能说这是“可见的”,因为没有正确的像素顺序,他们无法有意义地提取消息


但是,您必须记住,隐写术是一种在另一种媒体中隐藏信息的艺术,甚至没有人怀疑它的存在。相比之下,密码学是公开传输您的消息,但加密方式只有预期的参与者才能知道其内容。这对隐写术来说意味着,人们不一定要提取你的信息来挫败它的目的。你被抓获的原因仅仅是你正在秘密地传递信息,而不管它的内容是否可以阅读。您知道LSB像素修改方法已被破坏,所以尝试使它们稍微更安全是毫无意义的。相反只需担心玩这种方法会弄脏你的手,并学习一些隐写术。

预先设置的计数是否太明显?我曾考虑过保留一些像素,不做任何更改,以便我可以使用它们来写入音频文件的大小,但正如你所说,它太明显了,而且我需要设置一个最大大小对于音频文件,以便我知道在图像数据的开头应该为其保留多少像素。您已经描述了两者,但我不明白您的问题是什么。你不能一点一点地隐藏这些额外的信息以使其不可见吗?嗯,我的问题是,正如我所说的‘我正在将音频转换为比特,一次一点地隐藏它们,当我试图解码图像并从中提取音频时,作为一个例子,如果我是包含音频的图像的接收器,我应该什么时候停止我试着解码它来提取音频,然后把它写成一个波形文件来听,我怎么知道什么时候应该停止提取,文件什么时候结束,唯一的解决方案是写入音频文件的大小,但这将是可见的,我想不出其他解决方案提取音频的方法是,当我收到图像时,我得到LSB的值,一旦取了16个值,这意味着我构建了一个音频单元,所以问题是我应该何时停止提取过程。当我搜索解决方案时,一些人在图像中隐藏文本,他们说连续使用80,但这在我的情况下不起作用,隐藏它首先,开始时的大小太明显,谢谢你的精彩回答和解释,这是非常好的,容易理解和肯定的,正如你所建议的,我将尝试学习更多关于隐写术的知识,但我仍将首先实现这一点。再次感谢你的帮助