2015-12-19 12 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?

ответ

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), чтобы рассказать вам, как долго будет вестись поток бит.

 Смежные вопросы

  • Нет связанных вопросов^_^