2015-12-19 75 views
0

我在學習隱寫術以及它是如何實現的。我看着一些代碼上Github,但我無法理解的代碼的以下部分:爲什麼在隱寫信息的末尾添加了某個字符串

def hide(filename, message): 
    img = Image.open(filename) 
    binary = str2bin(message) + '1111111111111110' 
    if img.mode in ('RGBA'): 
     img = img.convert('RGBA') 
     datas = img.getdata() 

     newData = [] 
     digit = 0 
     temp = '' 
     for item in datas: 
      if (digit < len(binary)): 
       newpix = encode(rgb2hex(item[0],item[1],item[2]),binary[digit]) 
       if newpix == None: 
        newData.append(item) 
       else: 
        r, g, b = hex2rgb(newpix) 
        newData.append((r,g,b,255)) 
        digit += 1 
      else: 
       newData.append(item)  
     img.putdata(newData) 
     img.save(filename, "PNG") 
     return "Completed!" 

    return "Incorrect Image Mode, Couldn't Hide" 

正如你所看到的,筆者消息(文本)轉換成二進制時添加字符串'1111111111111110'串。他爲什麼這樣做,爲什麼除了最後一位是0之外都是1呢?

回答

0

這是一個標記。它們用於標記流中某個部分的開頭或結尾。在這種情況下,您可以將其稱爲end-of-message (EOM)標記,因爲它可以讓您知道何時停止讀取更多位。

標記值的選擇取決於所使用的數據。在這種情況下,作者假定該消息將是一串通常的字母和標點符號,即他不期望任何擴展的ascii碼(128-255)。由於這些代碼預計不會顯示在消息中,所以他選擇了255和254的連接作爲他的標記。

您可以通過隱藏郵件'abc\xff\xfedef''\xff''\xfe'只是ascii代碼255和254的字符串值)來欺騙此係統。提取在遇到這些值時會將其解釋爲EOM信號並停止。因此,您將只能取回'abc'。更多的序列可以具有相同的效果,例如字符串'_\xff\xc4'

01011111 11111111 11000100 
    | <-- this --> | 

這裏我們會在檢索到3位後提前結束提取過程。根據解碼器如何準備將這些位轉換爲消息字符串,它可能會引發錯誤或返回完整的垃圾。

一般而言,如果可以保證在標記本身出現之前不會在其他任何地方找到該序列,則可以使用標記來指示該部分的開始/結束。如果你不能保證這一點,一個可行的選擇是在開始部分(header)添加幾位以告訴你比特流將持續多長時間。

相關問題