我知道如何根据分辨率,图像类型和隐藏的每像素位数找到图像的最大可能容量。如何找到估计的邮件大小?
假设图像为100 x 200像素,并且是8位调色板图像。我们隐藏了4位LSB。估计的邮件大小是多少?
答案 0 :(得分:0)
估计的消息长度是您要嵌入的总长度1和0。它由标题(可选)和消息流组成。
这取决于邮件的大小以及隐藏方式。通常,您希望在将消息转换为1和0(消息流)时询问消息采用何种形式。数字0-255和ASCII字符可以用8位表示。最直接的例子包括:
纯文字:number of characters
x 8
二进制(黑白)图片:height
x width
灰度图片:height
x width
x 8
彩色图片:height
x width
x 24
您还可以决定在嵌入之前压缩消息,例如,使用霍夫曼编码。这应该将您的消息转换为比上述示例更少的位,但您还需要在消息中包含解码表,以便收件人可以解码消息。总的来说,霍夫曼压缩的长度更短,包括表格,甚至只有几百个字符。
说到元数据,在很多情况下,仅嵌入您的消息流是不够的。对于短于最大消息容量的消息流,您有3个选项可以处理剩余空间:
用随机1s和0填充它(有效地将大部分失真引入封面图像),
什么都不做,或者
拉伸邮件,使其占用尽可能多的最大邮件容量,例如: F5隐写系统中的矩阵编码。
如果您决定什么也不做,您可能需要告诉收件人他必须读取多少像素才能提取整条信息,以免继续读取乱码。您可以说消息流的总位数,或者在提取所有信息之前要读取的像素数。对于前一种选择,趋势是为消息长度投入32位,但这可能是相当大的。您可以设置更实际的限制,也可以采用更加动态的方法。
实际限制为24位,如果您假设您永远不会使用比具有4位LSB嵌入的1920x1200灰度图像更大的覆盖(1920x1200x4 = 9216000 <2 ^ 24最大存储容量)。 / p>
更动态的方法是估计表示消息长度的最小位数,例如: 8位,最长消息长度为256,9位,最多512位等。然后将此数字编码为5位值,后跟消息长度。例如,如果消息长度为3546位,使用32位对长度进行编码,则变为00000000000000000000110111011010。但是使用动态方法,它是 01100 10111011010,其中01100是二进制12,表示读取以下12位以获取消息长度。
如果您的程序同时处理文本和图像作为秘密消息,您还需要告知收件人秘密的类型。如果您只打算使用上述四种类型,我会使用两位进行编码:纯文本= 00,二进制图像= 01,灰度图像= 10,彩色图像= 11.
如果秘密是图像,您还需要提供高度和宽度。 16x2位是这里的总体趋势。但与上面的消息长度类似,您可以使用更实用的内容。例如,您可以预期没有图像的宽度或高度超过2048像素长度,因此11x2位足以编码此信息。
如果您的密码超过最后一个LSB,则您的邮件长度可能无法被该数字整除。例如,当您嵌入4位LSB时,消息长度为301。在这种情况下,您需要使用另外3个垃圾1或0来填充消息,以便它可以被4整除。现在,304是您报告的消息流,但在提取之后,您可以丢弃最后3位。假设您永远不会嵌入超过7位的LSB是合乎逻辑的,因此将3位用于填充应该足够了。
根据您选择包含在元数据中的内容,您可以将所有这些拼接在一起并将其称为标题。
让我们举几个例子来看看这一点。我们让标题格式按消息长度,秘密类型,填充,高度,宽度的顺序排列(仅在必要时最后两个)。
消息流是11 x 8 = 88位。
88 mod 4 = 0,因此填充为000(3位)。
消息长度为88 = 00111 1011000(12位)。
秘密类型是文本,所以00(2位)。
估算的消息长度:标头+消息流=(12 + 2 + 3)+ 88 = 105位。
消息流为151 x 256 x 8 = 309248位。
309248 mod 3 = 2,因此填充为3-2 = 1 = 001(3位)。
邮件长度为309249 = 10011 1001011100000000001(24位)。
秘密类型是灰度图像,所以10(2位)。
秘密是图像,因此使用2个16位数字(32位)添加宽度和高度。
估计的消息长度:标头+消息流=(24 + 2 + 3 + 32)+ 309249 = 309310位。