2016-03-12 13 views
0

我一直在試圖從一個目錄做多張圖片隱寫術,並使用Stegano模塊將它們保存在另一個。Stegano:多幅圖像中嵌入相同的祕密返回錯誤結果

我已經想出了代碼:

from stegano import slsb 
import os, sys 

APP_ROOT = os.path.dirname(os.path.abspath(__file__)) 
path = os.path.join(APP_ROOT, 'current_folder/') 
dirs = os.listdir(path) 
new_path = os.path.join(APP_ROOT, 'new_folder/') 
dirs2 = os.listdir(new_path) 

def stegogal(): 
    for item in dirs: 
     if os.path.isfile(path+item): 
      sw = "secretword" 
      f, e = os.path.splitext(path+item+'.png') 
      secret = slsb.hide(f, sw) 
      f, e = os.path.splitext(new_path+item+'.png') 
      secret.save(f + '_G.png') 

stegogal() 

然而,在幾乎所有的圖像的祕密世界(3選2)將被以某種方式搞砸了。例如它將隱藏"secretworg"而不是"secretword"

有人能向我解釋什麼,似乎是這個問題,或許顯示出一些更好的方式來做到這一點?

+0

只是更新stegano模塊 – cutzero

回答

0

編輯2:錯誤修復,承諾釋放不使用該解決方案波紋管更多的
**編輯:有bug修復新版本來

lenght錯誤

- - 編碼:UTF -8 - -

# -*- coding: utf-8 -*- 
from stegano import slsb 
import os, sys 

APP_ROOT = os.path.dirname(os.path.abspath(__file__)) 
path = os.path.join(APP_ROOT, 'current_folder/') 
dirs = os.listdir(path) 
new_path = os.path.join(APP_ROOT, 'new_folder/') 
dirs2 = os.listdir(new_path) 

def stegogal(): 
    for item in dirs: 
     if os.path.isfile(path+item): 
      sw = ur"secretword" + ur" " 
      f, e = os.path.splitext(path+item+'.png') 
      secret = slsb.hide(f, sw) 
      f, e = os.path.splitext(new_path+item+'.png') 
      secret.save(f + '_G.png') 

stegogal() 
print(slsb.reveal("secret.png")[:-1]) 
+0

不,不適用於我。不過,同樣的事情發生。 –

+0

嘗試你我編輯我的帖子 – cutzero

+0

不,同樣的問題發生( –

3

嵌入祕密存在一個錯誤。該程序對消息的長度進行編碼,以便知道要提取多少位讀取。在內部,你的信息變成

message = str(len(message)) + ":" + message 

其中,你的情況是104位。由於這不能被3整除,因此這裏的錯誤會引發

if index + 3 <= len(message_bits): 

並且您只嵌入了前102位。對於提取,程序將讀取足夠的位來重構消息,但最後2位將受到原始圖像所具有的任何像素值的支配(您甚至可能沒有注意到巧合問題)。

>>> '{:08b}'.format(ord('d')) 
'01100100' 
>>> '{:08b}'.format(ord('g')) 
'01100111' 
>>> 

雖然快速黑客發表了不同的答案解決的問題,由其他地方轉移它在那裏可以忽略這樣做。修復源代碼會更方便(更正確),以便您可以方便地導入正確的函數而不依賴任何包裝器修補程序。

要麼墊message_bits以0的必要數量,使其長度被3整除(它們將被提取後丟棄),

message_bits = "".join(tools.a2bits_list(message)) 
message_bits += '0' * ((3 - (len(message_bits) % 3)) % 3) 

或改變嵌入程序時,你必須不跳過任何位少於3個。

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 

請注意,slsbset模塊中存在相同的錯誤。

+0

由於有4個可能的字母(d,e,f和g),對於一個足夠大的圖像樣本,您預計會在4次中得到3次錯誤的結果。然而,這假定紅色和綠色平面的LSB都不相關,圖像本身之間也沒有任何相關性。 – Reti43

+0

加1,感謝您的解釋 – cutzero

+0

我測試過,快速髒的修補程序適用於每個長度。完美的解決方案是修復bug。 – cutzero