<p>隐藏这个秘密有一个漏洞。程序对消息的长度进行编码,以便知道要读取多少位进行提取。在内部,你的信息变成</p>
<pre><code>message = str(len(message)) + ":" + message
</code></pre>
<p>在你的例子中,是104位。因为它不能被3整除,所以这个bug在这里启动</p>
<pre><code>if index + 3 <= len(message_bits):
</code></pre>
<p>只嵌入前102位。对于提取,程序将读取足够的位来重建信息,但最后2位将取决于原始图像的像素值(您甚至可能不会碰巧注意到问题)。你知道吗</p>
<pre><code>>>> '{:08b}'.format(ord('d'))
'01100100'
>>> '{:08b}'.format(ord('g'))
'01100111'
>>>
</code></pre>
<p>虽然由不同答案发布的快速破解解决了这个问题,但它是通过将其转移到其他可以忽略的地方来实现的。修复源代码会更方便(也更正确),这样您就可以方便地导入正确的函数,而无需依赖任何包装修补程序。你知道吗</p>
<p>将<code>message_bits</code>与必要的0数相加,使其长度可被3整除(提取后将丢弃它们)</p>
<pre><code>message_bits = "".join(tools.a2bits_list(message))
message_bits += '0' * ((3 - (len(message_bits) % 3)) % 3)
</code></pre>
<p>或者更改嵌入例程,当剩下的位数少于3位时,不跳过任何位。你知道吗</p>
<pre><code>for row in range(height):
for col in range(width):
if index + 3 <= len(message_bits):
(r, g, b) = img.getpixel((col, row))
r = tools.setlsb(r, message_bits[index])
g = tools.setlsb(g, message_bits[index+1])
b = tools.setlsb(b, message_bits[index+2])
encoded.putpixel((col, row), (r, g , b))
index += 3
elif index < len(message_bits):
# More bits left, but not enough to embed in r, g and b.
(r, g, b) = img.getpixel((col, row))
r = tools.setlsb(r, message_bits[index])
index += 1
if index < len(message_bits):
g = tools.setlsb(g, message_bits[index])
index += 1
encoded.putpixel((col, row), (r, g , b))
else:
# Embedding is done, no point in iterating over more pixels
return encoded
return encoded
</code></pre>
<p>请注意,<code>slsbset</code>模块中也存在相同的bug。你知道吗</p>